(python)PCA主城分析降维

PCA主成分析降维

1.计算步骤

假定我们有特征向量x(i),l∈1,……,N:
1、数据集的均值:u=(1/N)Σx(i)
2、均值发生漂移后得到数据集:u(i)=x(i)-u,i∈1,…..,N
3、调整后的数据集,其中每个特征向量u’(i)除以标准差:u’(i)/δj→u’(i)
δj=((1/N)Σ(x(i))^2)^(1/2)
4、样本点协方差矩阵
5、k个最大的特征值λi,i∈1,…..,k,以及相应的特征向量w(i),i∈1,…..,k.
6、映射到由k个特征向量组成的子空间特征向量v(i)=(W^T)u(i)∈R^k,其中W=[w1…..wk]∈R^(N*k)是N行k列的特征向量矩阵。

2、例子

本例是把二维降维到一维。
我们先来生成数据集,该数据集沿着直线y=2x分布,我们在其中添加了一些噪声,以下是代码:

import numpy as np
from matplotlib import pyplot as plt

#线 y=2*x
x=np.arange(1,101,1).astype(float)
y=2*np.arange(1,101,1).astype(float)
#加入噪声
noise=np.random.normal(0,10,100)
y+=noise

fig=plt.figure(figsize=(10,10))
#画图
plt.plot(x,y,'ro')
plt.axis([0,102,-20,220])

plt.arrow(60,100,10-0,20-0,head_width=2.5,head_length=2.5,fc='k',ec='k')
plt.text(70,110,r'$v^1$',fontsize=20)
#save
ax=fig.add_subplot(111)
ax.axis([0,102,-20,220])
ax.set_xlabel('x',fontsize=40)
ax.set_ylabel('y',fontsize=40)
fig.suptitle('2 dimensional dataset',fontsize=40)
fig.savefig('pca_data.png')

结果图如下:
这里写图片描述

接下来,我们计算二维数据均值和均值漂移后的数据均值,然后用相应标准差调整取值范围:

mean_x=np.mean(x)
mean_y=np.mean(y)
u_x=(x-mean_x)/np.std(x)
u_y=(y-mean_y)/np.std(y)
sigma=np.cov([u_x,u_y])

接下来计算特征值和特征向量,选择特征值最大的特征向量

eig_vals,eig_vecs=np.linalg.eig(sigma)
eig_pairs=[(np.abs(eig_vals[i]),eig_vecs[:,i])
           for i in range(len(eig_vals))]
eig_pairs.sort()
eig_pairs.reverse()
v1=eig_pairs[0][1]
print (v1)

array([0.70710678,0.70710678])
接下来看主成分是否按照预期沿直线分布,我们需要将其坐标调整回去

x_v1=v1[0]*np.std(x)+mean_x
y_v1=v1[1]*np.std(y)+mean_y
print  ((y_v1-1)/(x_v1-1))

2.03082418796

计算得到斜率约为2,和我们之前设计的直线斜率基本吻合,

接下来,我们用scikit-learn库来实现PCA算法
先把数据转化为矩阵格式

X=np.array([u_x,u_y])
X=X.T
print (X.shape)

(100, 2)
运行模块

from sklearn.decomposition import PCA
pca=PCA(n_components=1)
pca.fit(X)
v1_sklearn=pca.components_[0]
print (v1_sklearn)

[-0.70710678 -0.70710678]

最后转换坐标和检查:

#转换坐标空间

X_red_sklearn=pca.fit_transform(X)
W=np.array(v1.reshape(2,1))
X_red=W.T.dot(X.T)

#检查
assert X_red.T.all()==X_red_sklearn.all(), 'problem with the pca algorithm'

总程序结果图:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_40162797/article/details/80560405