标签:eigenvectors pca plt target iris 实现 PCA chapter18
1 手写实现PCA
import numpy as np class PCA(): # 计算协方差矩阵 def calc_cov(self, X): m = X.shape[0] # 数据标准化,X的每列减去列均值 X = (X - np.mean(X, axis=0)) return 1 / m * np.matmul(X.T, X) def pca(self, X, n_components): # 计算协方差矩阵 cov_matrix = self.calc_cov(X) # 计算协方差矩阵的特征值和对应特征向量 eigenvalues, eigenvectors = np.linalg.eig(cov_matrix) # 对特征值排序x idx = eigenvalues.argsort()[::-1] # 取最大的前n_component组 eigenvectors = eigenvectors[:, idx] #按特征值大小,从大到小排序 eigenvectors = eigenvectors[:, :n_components] #选取前 n_components 组特征向量 print("eigenvectors.shape = \n",eigenvectors.shape) print("eigenvectors = \n",eigenvectors) #一个特征向量是一列 # Y=PX转换 return np.matmul(X, eigenvectors)
补充:
2 导入数据集
from sklearn import datasets import matplotlib.pyplot as plt # 导入sklearn数据集 iris = datasets.load_iris() X = iris.data y = iris.target print(X.shape)
输出:
(150, 4)
3 手写版PCA可视化
# 将数据降维到3个主成分 X_trans = PCA().pca(X, 3) # 颜色列表 colors = ['navy', 'turquoise', 'darkorange'] # 绘制不同类别 for c, i, target_name in zip(colors, [0,1,2], iris.target_names): plt.scatter(X_trans[y == i, 0], X_trans[y == i, 1],color=c, lw=1, label=target_name) # 添加图例 plt.legend() plt.show();
输出:
eigenvectors.shape = (4, 3) eigenvectors = [[ 0.36138659 -0.65658877 -0.58202985] [-0.08452251 -0.73016143 0.59791083] [ 0.85667061 0.17337266 0.07623608] [ 0.3582892 0.07548102 0.54583143]]
4 sklearn降维模块
# 导入sklearn降维模块 from sklearn import decomposition # 创建pca模型实例,主成分个数为3个 pca = decomposition.PCA(n_components=3) # 模型拟合 pca.fit(X) # 拟合模型并将模型应用于数据X X_trans = pca.transform(X) # 颜色列表 colors = ['navy', 'turquoise', 'darkorange'] # 绘制不同类别 for c, i, target_name in zip(colors, [0,1,2], iris.target_names): plt.scatter(X_trans[y == i, 0], X_trans[y == i, 1], color=c, lw=2, label=target_name) # 添加图例 plt.legend() plt.show();
结果:
标签:eigenvectors,pca,plt,target,iris,实现,PCA,chapter18 来源: https://www.cnblogs.com/BlairGrowing/p/15853516.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。