理论部分
python实现PCA主成分分析
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
import os
%matplotlib inline
# 二维数据降维
# 数据创建
rng=np.random.RandomState(8)
data=np.dot(rng.rand(2,2),rng.randn(2,200)).T #np.dot方法是一个矩阵相乘的方法;
df = pd.DataFrame({'X1':data[:,0],
'X2':data[:,1]})
print(df.head())
print(df.shape)
plt.scatter(df['X1'],df['X2'],alpha=0.8,marker='.')
plt.axis('equal')
plt.grid()
#生成图表格
X1 X2
0 -1.174787 -1.404131
1 -1.374449 -1.294660
2 -2.316007 -2.166109
3 0.947847 1.460480
4 1.762375 1.640622
(200, 2)
![下载 (1).png](https://img.haomeiwen.com/i7058492/b6d0c4cde019a0e2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
# 二维数据降维
# 构建模型,分析主成分
from sklearn.decomposition import PCA
pca=PCA(n_components=1) #n_components=1 -降为1维
pca.fit(df) #构建模型
#sklearn.decomposition.PCA(n_components=None, copy=True ,white=False)
# n_components: PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n
# copy: True或者False ,默认为True - 表示是否在运行算法时,将原始训练数据复制一份
# fit(X,y=None) - 调用fit方法的对象本身,比如pca,fit(X),表示用X对pca这个对象进行训练;
print(pca.explained_variance_) #特征值
print(pca.components_) #2个特征向量
print(pca.n_components) #1个主成分
# 这里是shape(200,2)降为shape(200,1),只有1个特征值,对应2个特征向量;
# 降维后主成分A1=0.7788006*X1 + 0.62727158*X2
x_pca=pca.transform(df) #数据转换
#x_pca #训练后的一维数据;
x_new=pca.inverse_transform(x_pca) # 将降维后的数据转换成新的原始数据
print('orihinal shape:',df.shape)
print('transformed shape:',x_pca.shape)
print(x_pca[:5])
print('-----------------------------')
# 主成分分析,生成新的向量x_pca
# fit_transform(X) - 用X来训练PCA模型,同时返回降维后的数据,这里x_pca就是降维后的数据;
# inverse_transform() -将降维后的数据转换成原始数据;
plt.scatter(df['X1'],df['X2'],alpha=0.8,marker='.')
plt.scatter(x_new[:,0],x_new[:,1],alpha=0.8,marker='.',color='r')
plt.axis('equal')
plt.grid()
#生成图表
[2.79699086]
[[-0.7788006 -0.62727158]]
1
orihinal shape: (200, 2)
transformed shape: (200, 1)
[[ 1.77885258]
[ 1.8656813 ]
[ 3.14560277]
[-1.67114513]
[-2.41849842]]
-----------------------------
</pre>
![image.png](https://img.haomeiwen.com/i7058492/6bd7e14a04054061.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
网友评论