import numpy as np import matplotlib.pyplot as plt import matplotlib from sklearn import datasets from pylab import mpl # 用于中文显示 mpl.rcParams['font.sans-serif'] = ['SimHei'] # 用于中文显示 matplotlib.rcParams['axes.unicode_minus']=False #显示负数 breast_cancer = datasets.load_breast_cancer() #加载数据 X = breast_cancer.data y = breast_cancer.target ##第1种解决方法:调用PCA库函数 from sklearn.decomposition import PCA # 降到2维, 也可以指定n_componets=0.999(降维后的特征值分布方差所占比例),分布方差和投射距离方差相反 pca = PCA(n_components=2) pca.fit(X) new_x = pca.transform(X) # 降维后样本特征在每个特征向量上的分布方差,一个特征向量对应一个方差值,即特征值 print('特征值 : %s' % str(pca.explained_variance_)) # 降维后各维度特征分布方差所占比例,即特征值所占比例 print("各特征值占比:", pca.explained_variance_ratio_) # 降维后的两个特征向量,shape(n_components,n_features) print('PCA特征向量=',pca.components_) #展示PCA图 plt.figure('PCA') colors = ['navy', 'turquoise'] #颜色 for color, i, target_name in zip(colors, [0, 1], ['恶性','良性']): #循环画出颜色、类别和类别 plt.scatter(new_x[y == i, 0], new_x[y == i, 1], color=color, label=target_name) plt.legend(loc='best') #图例 plt.title('PCA诊断乳腺癌') plt.show() #第2种解决方法:利用linalg.svd函数方法 #计算协方差矩阵 cov=np.cov(X.T) # cov(X)的X一列为一个样本 u,s,v=np.linalg.svd(cov) new_x=np.dot(X,u[:,:2]) x_reconstruct=new_x.dot(u[:,:2].T) # 展示降维时的特征向量和降维后的样本 new_x_mean = np.mean(new_x,0) new_x_std = np.std(new_x, 0, ddof=1) new_x = (new_x - new_x_mean) / new_x_std plt.figure('降维后数据SVD') plt.plot([u[:,0][0]*1000,0],[u[:,0][1]*1000,0],color='red',label=u'特征1') plt.plot([u[:,1][0]*1000,0],[u[:,1][1]*1000,0],color='blue',label=u'特征2') plt.plot(new_x[:,0],new_x[:,1],'*',color='green', label=u'降维后数据') plt.legend() plt.show() #展示SVD图形 plt.figure('SVD') colors = ['navy', 'turquoise'] # 颜色 for color, i, target_name in zip(colors, [0, 1], ['恶性','良性']): plt.scatter(new_x[y == i, 0], new_x[y == i, 1], color=color, alpha=.8, lw=2, label=target_name) plt.legend(loc='best', shadow=False, scatterpoints=1) #图例 plt.title('SVD诊断乳腺癌') plt.show()
01-27
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交