Advertisement
mirosh111000

Метод PCA

Nov 11th, 2023
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.48 KB | None | 0 0
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import seaborn as sns
  5. from sklearn.decomposition import PCA
  6.  
  7.  
  8. class method_PCA:
  9.     def __init__(self, n_components):
  10.         self.n_components = n_components
  11.         self.eigenvalues = None
  12.         self.eigenvectors = None
  13.  
  14.     def fit_transform(self, X, center_norm_data=True):
  15.  
  16.         ind = X.index
  17.         if center_norm_data == True:
  18.             for i in X.columns:
  19.                 X.loc[:, i] = (X.loc[:, i] - X[i].mean()) / X[i].var()
  20.  
  21.         cov_matrix = np.cov(X, rowvar=False)
  22.         eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
  23.  
  24.         sorted_indices = np.argsort(eigenvalues)[::-1]
  25.         eigenvalues = eigenvalues[sorted_indices]
  26.         eigenvectors = eigenvectors[:, sorted_indices]
  27.         #         eigenvectors[:, 1] = eigenvectors[:, 1] * -1
  28.  
  29.         self.eigenvalues = eigenvalues
  30.         self.eigenvectors = eigenvectors
  31.  
  32.         projected_data = X.dot(eigenvectors[:, :self.n_components])
  33.  
  34.         projected_data = pd.DataFrame(projected_data.values, columns=[f'PCA_{i + 1}' for i in range(self.n_components)],
  35.                                       index=ind)
  36.  
  37.         return projected_data
  38.  
  39.     def get_eigenvalues(self):
  40.         return self.eigenvalues
  41.  
  42.     def get_eigenvectors(self):
  43.         return self.eigenvectors
  44.  
  45.     def lost_info(self):
  46.         return f'Втрата інформації: {np.round((1 - self.eigenvalues[:self.n_components].sum() / self.eigenvalues.sum()) * 100, 2)}%'
  47.  
  48. df = pd.read_csv('iris.csv')
  49.  
  50. n_components = 2
  51.  
  52. pca = method_PCA(n_components=n_components)
  53.  
  54. df_pca = pca.fit_transform(df[df.columns[:-1]])
  55. print(pca.lost_info())
  56. print(f'Власні вектори:\n{pca.get_eigenvectors()}')
  57.  
  58. plt.figure(figsize=(8, 6))
  59. plt.bar(range(1, len(pca.get_eigenvalues()) + 1), pca.get_eigenvalues())
  60. plt.title('Власні значення (centered and normalized data)')
  61. plt.xlabel('Номер власного значення')
  62. plt.ylabel('Значення')
  63. plt.show()
  64.  
  65. df_pca['species'] = df['species']
  66. print(df_pca)
  67.  
  68. pca = method_PCA(n_components=n_components)
  69. df_pca1 = pca.fit_transform(df[df.columns[:-1]], center_norm_data=False)
  70. print(pca.lost_info())
  71. print(f'Власні вектори:\n{pca.get_eigenvectors()}')
  72.  
  73. plt.figure(figsize=(8, 6))
  74. plt.bar(range(1, len(pca.get_eigenvalues()) + 1), pca.get_eigenvalues())
  75. plt.title('Власні значення')
  76. plt.xlabel('Номер власного значення')
  77. plt.ylabel('Значення')
  78. plt.show()
  79.  
  80. df_pca1['species'] = df['species']
  81. print(df_pca1)
  82.  
  83.  
  84. pca = PCA(n_components=n_components)
  85. X_pca = pca.fit_transform(df[df.columns[:-1]])
  86.  
  87. df_pca2 = pd.DataFrame(data=X_pca, index=df.index, columns=[f'PCA_{i+1}' for i in range(n_components)])
  88. df_pca2['species'] = df['species']
  89.  
  90. print(f"Втрата інформації sklearn: {1 - sum(pca.explained_variance_ratio_):.2%}")
  91.  
  92. plt.figure(figsize=(8, 6))
  93. plt.bar(range(1, len(pca.explained_variance_) + 1), pca.explained_variance_)
  94. plt.title('Власні значення sklearn')
  95. plt.xlabel('Номер власного значення')
  96. plt.ylabel('Значення')
  97. plt.show()
  98.  
  99. print(df_pca2)
  100.  
  101.  
  102.  
  103. sns.pairplot(df, hue='species')
  104. plt.show()
  105.  
  106. print('my PCA (centered and normalized by features)')
  107. sns.pairplot(df_pca, hue='species')
  108. plt.show()
  109.  
  110. print('my PCA')
  111. sns.pairplot(df_pca1, hue='species')
  112. plt.show()
  113.  
  114. print('sklearn PCA')
  115. sns.pairplot(df_pca2, hue='species')
  116. plt.show()
  117.  
  118.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement