PCA降维

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()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值