跟我学算法-pca(降维)

摘要:
pca是一种黑箱子式的降维方式,通过映射,希望投影后的数据尽可能的分散,因此要保证映射后的方差尽可能大,下一个映射的方向与当前映射方向正交pca的步骤:第一步:首先要对当前数据(去均值)求协方差矩阵,协方差矩阵=数据*数据的转置/(m-1)m表示的列数,对角线上表示的是方差,其他位置表示的是协方差第二步:需要通过矩阵对角化,使得协方差为0,只存在对角线方向的数据,这个时候就能得到我们的特征值和特征

pca是一种黑箱子式的降维方式,通过映射,希望投影后的数据尽可能的分散, 因此要保证映射后的方差尽可能大,下一个映射的方向与当前映射方向正交

pca的步骤:

第一步: 首先要对当前数据(去均值)求协方差矩阵,协方差矩阵= 数据*数据的转置/(m-1) m表示的列数,对角线上表示的是方差,其他位置表示的是协方差

第二步:需要通过矩阵对角化,使得协方差为0,只存在对角线方向的数据,这个时候就能得到我们的特征值和特征向量

第三步: 将当前数据*特征向量就完成了降维工作,特征值/特征值之和, 可以表示特征值对应特征向量的表达重要性

下面是程序的说明

第一步:数据导入, 去均值, 求协方差

importpandas as pd
importnumpy as np
importmatplotlib.pyplot as plt

df = pd.read_csv('iris.data')
print(df.head())

df.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']
print(df.head())

#用来储存变量
X = df.ix[:, 0:4].values
#用来储存标签
y = df.ix[:, 4].values   

msg ={'Iris-setosa':0, 'Iris-versicolor':1, 'Iris-virginica':2}
df['class'] = df['class'].map(msg)  #把字母换成数字

#进行标准化
from sklearn.preprocessing importStandardScaler
Scaler =StandardScaler()
X_Scaler =Scaler.fit_transform(X)

#求每一行的均值
mean_vec = np.mean(X_Scaler, axis=0)
#去均值后求协方差矩阵
cov_mat = (X_Scaler-mean_vec).T.dot(X_Scaler-mean_vec)/(X_Scaler.shape[0]-1)
print(cov_mat)
#使用np求协方差矩阵,结果是一样的
cov_mat =np.cov(X_Scaler.T)
print(cov_mat)

第二步:求矩阵对角化的过程,就是一个求特征值和特征向量的过程

#求特征值和特征向量
eig_vals, eig_vecs =np.linalg.eig(cov_mat)
print(eig_vals, eig_vecs)

#将特征值与特征向量合并
eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:, i]) for i in range(len(eig_vals))] #组合对应
eig_pairs.sort(key=lambda x:x[0], reverse=True)


tot =sum(eig_vals)

var_exp = [(i/tot)*100 for i in sorted(eig_vals, reverse=True)]
#cumsum表示每前两个数相加
cum_var_exp =np.cumsum(var_exp)
#画图
plt.figure(figsize=(6, 4))
#画柱状图
plt.bar(range(4), var_exp, alpha=0.5, align='center',
            label='individual explained variance')
#画步阶图
plt.step(range(4), cum_var_exp, where='mid',
             label='cumulative explained variance')
plt.ylabel('Explained variance ratio')
plt.xlabel('Principal components')
plt.legend(loc='best')
plt.tight_layout()

第三步:将数据(去均值)

#把4维矩阵降低到两维,取前两个特征向量组合转置点乘即可

#np.hstack合并两个向量,reshape让一行变成一列,相当于转置
matrix_w = np.hstack((eig_pairs[0][1].reshape(4,1),
                      eig_pairs[1][1].reshape(4,1)))


#变换以后的矩阵149*4 .dot 4*2 = 149*2
become_X_Scaler =X_Scaler.dot(matrix_w)
print(become_X_Scaler)
plt.figure(figsize=(6, 4))

color = np.array(['red', 'green', 'blue']) #构成行列式
plt.scatter(become_X_Scaler[:,0], become_X_Scaler[:,1], c=color[df['class']])  #画出种类对应颜色的散点图
plt.show()

跟我学算法-pca(降维)第1张

免责声明:文章转载自《跟我学算法-pca(降维)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇OSGI基础环境搭建使用daphne部署django channles websocket 项目下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#(二维数组/集合)

一、二维数组int [,] array = new int[5,3];//有五个一维数组,每一个一维数组有3个元素/打印出来一个“王”这个字string[,] wang = new string[,]{  {" ","■","■","■","■","■"," "}, {" "," "," ","■"," "," "," "}, {" "," "," ","...

matlab学习:人脸识别之PCA( Principal Component Analysis )

1.链接推荐 关于理解PCA的推荐链接:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html 关于理解SVD的推荐链接:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-...

神经网络实现

转自  http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html 神经网络实现    1. 数据预处理         在训练神经网络前一般需要对数据进行预处理,一种重要的预处理手段是归一化处理。下面简要介绍归一化处理的原理与方法。 (1) 什么是归一化?  数据归一化,就是将数据映射到[0,...

1050. 螺旋矩阵(25)

1050. 螺旋矩阵(25) 本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。 输入格式: 输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104...

比较语义分割的几种结构:FCN,UNET,SegNet,PSPNet和Deeplab

简介 语义分割:给图像的每个像素点标注类别。通常认为这个类别与邻近像素类别有关,同时也和这个像素点归属的整体类别有关。利用图像分类的网络结构,可以利用不同层次的特征向量来满足判定需求。现有算法的主要区别是如何提高这些向量的分辨率,以及如何组合这些向量。 几种结构 全卷积网络FCN:上采样提高分割精度,不同特征向量相加。[3] UNET:拼接特征向量;编码...

matlab练习程序(动感模糊)

  其实在matlab中调用系统函数fspecial和imfilter这两个函数就能很简单的实现动感模糊,不过我可不想就这样简单的实现,所以就自己从头写了。动感模糊最复杂的就是构造卷积矩阵了,卷积矩阵由两个参数决定,模糊半径r和模糊角度theta,通过这两个参数,就能构造不同的模板矩阵,而图像卷积时则和普通的卷积没有什么区别。   构造模板矩阵,首先是通过...