python 矩阵分析(求方差,协方差矩阵,特征值,特征向量......)&PCA实现

. 求均值

 
  1. import numpy as np

  2. X=np.array([1,2,3,4,5,6])

  3. np.mean(X)

 
  1. a = np.array([[1, 2], [3, 4]])

  2. np.mean(a) # 将上面二维矩阵的每个元素相加除以元素个数(求平均数)

  3. #输出:2.5

  4. np.mean(a, axis=0) # axis=0,计算每一列的均值

  5. #输出:array([ 2.,  3.])

  6. np.mean(a, axis=1) # 计算每一行的均值

  7. #输出:array([ 1.5,  3.5])

2. 求标准差和方差

 
  1. import numpy as np

  2. X=np.array([1,2,3,4,5,6])

  3. np.std(X) #标准差

  4. np.var(X) #方差

3. 协方差矩阵

两个特征X,Y(都是向量)的协方差公式:

cov(X,Y)=\frac{\sum_{i=1}^{n}(X_{i}-\bar{X})(Y_{i}-\bar{Y})}{n-1},    cov(X,Y)=cov(Y,X)

协方差具体的大小并不重要,但是它的正负是重要的。如果它的值是正的,这表明两个特征之间同时增加或减小;如果它的值是负的,这表明两个特征之间有一个增加而另一个减小。如果它的值为0,则表明两个特征之间是独立的。

如果有多个特征,可以计算协方差矩阵:

C=\begin{pmatrix} cov(1,1) cov(1,2) cov(1,3) \cdots cov(1,n) \\ cov(2,1) cov(2,2) cov(2,3) \cdots cov(2,n)\\ cov(3,1) cov(3,2) cov(3,3) \cdots cov(3,n)\\ \vdots \vdots \vdots \ddots \vdots \\ cov(n,1) cov(n,2) cov(n,3) \cdots cov(n,n) \end{pmatrix}

 
  1. import numpy as np

  2. T=np.array([9,15,25,14,10,18,0,16,5,19,16,20])

  3. S=np.array([39,56,93,61,50,75,32,85,42,70,66,80])

  4. T=T[:,np.newaxis]

  5. S=S[:,np.newaxis]

  6. X=np.hstack((T,S))

  7. np.cov(X.T)

求出的协方差输出如下:

 
  1. array([[  47.71969697,  122.9469697 ],

  2.        [ 122.9469697 ,  370.08333333]])

4. 计算特征值和特征向量

 
  1. import numpy as np

  2. cov_mat = np.cov(X_train_std.T)

  3. eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)#特征值是eigen_vals,特征向量是eigen_vecs,

  4. #特征向量是按列放的,即一列代表一个特征向量

PCA的原理,假如原始数据集X是N*M(N是样本数,M是特征数)先计算出协方差矩阵的特征值和特征向量(M维),然后挑出对应特征值最大的特征向量(2个)组成映射矩阵W(M*2),用X*W即可得到降维后的数据集(N*2)。

 
  1. #调用sklearn库实现PCA

  2. from sklearn import decomposition

  3. pca = decomposition.PCA()

  4. pca.fit(X_arr) #X_arr是原始数据集,一行表示一个样本,一列表示一个feature

  5. pca.n_components = 2 #降为两维

  6. X_reduced = pca.fit_transform(X_arr) #X_reduced是降维后的数据集

  7.  
  8. #基于numpy自己实现PCA

  9. import numpy as np

  10. meanval=np.mean(X_arr, axis=0) #计算原始数据中每一列的均值,axis=0按列取均值

  11. newData=X_arr-meanval #去均值化,每个feature的均值为0

  12. covMat=np.cov(newData,rowvar=0) #计算协方差矩阵,rowvar=0表示数据的每一列代表一个feature

  13. featValue, featVec=np.linalg.eig(covMat) #计算协方差矩阵的特征值和特征向量

  14. index=np.argsort(featValue) #将特征值按从大到小排序,index保留的是对应原featValue中的下标

  15. n_index=index[-1:-3:-1] #取最大的两维特征值在原featValue中的下标

  16. n_featVec=featVec[:, n_index] #取最大的两维特征值对应的特征向量组成变换矩阵

  17. lowData=np.dot(newData,n_featVec) #lowData=newData*n_featVec

  18.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值