python数据建模——PCA主成分分析

监督学习:
回归(线型回归)和分类(knn最临近分类)

非监督学习:
聚类(PCA主成分分析,k-means聚类)

随机算法:
蒙特卡洛模拟--蒙特卡洛算法
最广泛的无监督算法 + 基础降维算法
通过线性变换将原始数据变换为一组各维度线型无关的表示
用于提取数据的主要特征分类-->高维数据的降维
比如拿到一个样本,特征非常多,而样例特别少。这样用回归去直接拟合非常困难,容易过度拟合。所以如果可以通过降维的方法,将多维度变为核心的几个维度,用新的维度做回归即可。

主成分的目的:
对于原先提出的所有变量,将重复的变量(关系紧密的变量)删去,建立尽可能少的新变量,使得这些新变量是两两不相关的,而且这些新变量在反应课题的信息方面尽可能的保持原有信息。

实现步骤:
1. 计算数据的协方差矩阵
2. 计算协方差矩阵的特征值与特征向量
3. 特征值由大到小排序
4.筛选主成分,并将数据转换到特征向量构建的新空间中

python实现:sklearn的pca功能
新的变量由多个就变量组成,不一定能以旧变量的含义来描述新变量。
一般降维是为了更好的做回归或分类,所以pca是一个过程结果,辅助构建模型
rng = np.random.RandomState(8)
data = np.dot(rng.rand(2,2), rng.randn(2,200)).T
df=pd.DataFrame({'X1':data[:,0],
                 'X2':data[:,1]})
data.shape (200,2)
plt.scatter(df['X1'], df['X2'], alpha=0.8, marker='.')
plt.axis('equal')
plt.grid()
image.png
#二维数据降维
#构建模型,分析主成分
from sklearn.decomposition import PCA
pca = PCA(n_components = 1)
pca.fit(df)

#特征值 返回所保留的n个成分各自方差的百分比
pca.explained_variance_ #array([2.79699086])

#特征向量,返回具有最大方差的成分
pca.components_ 
#array([[-0.7788006 , -0.62727158]])

pca.n_components_
#1

#n_componentsf 主成分个数
#copy:在运行算法时,将原始训练数据复制一份
[output]:
PCA(copy=True, iterated_power='auto', n_components=1, random_state=None,
  svd_solver='auto', tol=0.0, whiten=False)

#pca.transform(x):用x来训练pca模型,同时返回降维后的数据,这里x_pca就是降维后的数据
#inverse_transform:将降维后的数据转换为原始数据
x_pca = pca.transform(df) 
x_new = pca.inverse_transform(x_pca)

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()
image.png
#多维数据降维
#加载数据
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape #(1797, 64)

from sklearn.decomposition import PCA
#构建模型
pca = PCA(n_components = 2)
projected = pca.fit_transform(digits.data) #(1797, 2)

plt.scatter(projected[:,0],projected[:,1],c = digits.target,edgecolor='none',alpha=0.5,cmap='Reds',s=5)
plt.axis('equal')
plt.grid()
plt.colorbar()
image.png
pca = PCA(n_components = 10)
projected = pca.fit_transform(digits.data)

s = pca.explained_variance_
c_s = pd.DataFrame({'b':s,
                    'b_sum':s.cumsum()/s.sum()})
[output]:
      b         b_sum
0   179.006930  0.201708
1   163.717747  0.386187
2   141.788439  0.545957
3   101.100375  0.659878
4   69.513165   0.738207
5   59.108522   0.804811
6   51.884504   0.863275
7   44.015042   0.912872
8   40.310965   0.958295
9   37.011382   1.000000

c_s['b_sum'].plot(style='--ko',figsize=(10,4))
plt.axhline(0.85,hold=None,color='r',linestyle='--',alpha=0.8)
plt.text(6,c_s['b_sum'].iloc[6]-0.08,'第七个成分累计贡献率超过85%',color='r')


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容