Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- import seaborn as sns
- from sklearn.decomposition import PCA
- class method_PCA:
- def __init__(self, n_components):
- self.n_components = n_components
- self.eigenvalues = None
- self.eigenvectors = None
- def fit_transform(self, X, center_norm_data=True):
- ind = X.index
- if center_norm_data == True:
- for i in X.columns:
- X.loc[:, i] = (X.loc[:, i] - X[i].mean()) / X[i].var()
- cov_matrix = np.cov(X, rowvar=False)
- eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
- sorted_indices = np.argsort(eigenvalues)[::-1]
- eigenvalues = eigenvalues[sorted_indices]
- eigenvectors = eigenvectors[:, sorted_indices]
- # eigenvectors[:, 1] = eigenvectors[:, 1] * -1
- self.eigenvalues = eigenvalues
- self.eigenvectors = eigenvectors
- projected_data = X.dot(eigenvectors[:, :self.n_components])
- projected_data = pd.DataFrame(projected_data.values, columns=[f'PCA_{i + 1}' for i in range(self.n_components)],
- index=ind)
- return projected_data
- def get_eigenvalues(self):
- return self.eigenvalues
- def get_eigenvectors(self):
- return self.eigenvectors
- def lost_info(self):
- return f'Втрата інформації: {np.round((1 - self.eigenvalues[:self.n_components].sum() / self.eigenvalues.sum()) * 100, 2)}%'
- df = pd.read_csv('iris.csv')
- n_components = 2
- pca = method_PCA(n_components=n_components)
- df_pca = pca.fit_transform(df[df.columns[:-1]])
- print(pca.lost_info())
- print(f'Власні вектори:\n{pca.get_eigenvectors()}')
- plt.figure(figsize=(8, 6))
- plt.bar(range(1, len(pca.get_eigenvalues()) + 1), pca.get_eigenvalues())
- plt.title('Власні значення (centered and normalized data)')
- plt.xlabel('Номер власного значення')
- plt.ylabel('Значення')
- plt.show()
- df_pca['species'] = df['species']
- print(df_pca)
- pca = method_PCA(n_components=n_components)
- df_pca1 = pca.fit_transform(df[df.columns[:-1]], center_norm_data=False)
- print(pca.lost_info())
- print(f'Власні вектори:\n{pca.get_eigenvectors()}')
- plt.figure(figsize=(8, 6))
- plt.bar(range(1, len(pca.get_eigenvalues()) + 1), pca.get_eigenvalues())
- plt.title('Власні значення')
- plt.xlabel('Номер власного значення')
- plt.ylabel('Значення')
- plt.show()
- df_pca1['species'] = df['species']
- print(df_pca1)
- pca = PCA(n_components=n_components)
- X_pca = pca.fit_transform(df[df.columns[:-1]])
- df_pca2 = pd.DataFrame(data=X_pca, index=df.index, columns=[f'PCA_{i+1}' for i in range(n_components)])
- df_pca2['species'] = df['species']
- print(f"Втрата інформації sklearn: {1 - sum(pca.explained_variance_ratio_):.2%}")
- plt.figure(figsize=(8, 6))
- plt.bar(range(1, len(pca.explained_variance_) + 1), pca.explained_variance_)
- plt.title('Власні значення sklearn')
- plt.xlabel('Номер власного значення')
- plt.ylabel('Значення')
- plt.show()
- print(df_pca2)
- sns.pairplot(df, hue='species')
- plt.show()
- print('my PCA (centered and normalized by features)')
- sns.pairplot(df_pca, hue='species')
- plt.show()
- print('my PCA')
- sns.pairplot(df_pca1, hue='species')
- plt.show()
- print('sklearn PCA')
- sns.pairplot(df_pca2, hue='species')
- plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement