PCA(Principal Component Analysis,主成分分析)降维

1.PCA介绍

来源:视频https://www.bilibili.com/video/BV1E5411E71z/

笔记:https://www.bilibili.com/read/cv23587690?spm_id_from=333.999.0.0&jump_opus=1 

 

 PCA就是找坐标系,使得数据在保留一维数据,损失是最小的。

 目标:只保留一个轴的时候(二维降到一维),信息保留最多

怎么样最好

找到数据分布最分散的方向(方差最大),作为主成分(坐标轴)

  1. 去中心化(把坐标原点放在数据中心)
  2. 找坐标系(找到方差最大的方向)

问题是:怎么找到方差最大的方向?

 

 白数据

 

 拉伸决定了方差最大的方向是横或者纵

旋转决定了方差最大的方向的角度

  

 

 

 

怎么求解PCA

PCA缺点:离群点影响大

PCA与SVD(奇异值分解Singular Value Decomposition)

SVD中的右奇异矩阵V,就是PCA的主成分

PCA需要先求出协方差矩阵:计算量可能很大

SVD有两个好处:

1)一些SVD的实现算法可不求出协方差矩阵C也能求出右奇异矩阵V

2)PCA仅仅使用了SVD的右奇异矩阵V,没有使用到左奇异值矩阵U,那么U有什么用呢?

2.用PCA给将二维数据降成一维

参考:https://blog.csdn.net/Shiraka/article/details/122354007

https://blog.csdn.net/weixin_42010722/article/details/123826197

https://www.cnblogs.com/wei-520/p/12470843.html 

 from sklearn.decomposition import PCA

1. 函数原型及参数说明

这里只挑几个比较重要的参数进行说明。

sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)

n_components: int, float, None 或 string,PCA算法中所要保留的主成分个数,也即保留下来的特征个数,如果 n_components = 1,将把原始数据降到一维;如果赋值为string,如n_components='mle',将自动选取特征个数,使得满足所要求的方差百分比;如果没有赋值,默认为None,特征个数不会改变(特征数据本身会改变)。
 copy:True 或False,默认为True,即是否需要将原始训练数据复制。
 whiten:True 或False,默认为False,即是否白化,使得每个特征具有相同的方差。

2. PCA对象的属性

explained_variance_ratio_:返回所保留各个特征的方差百分比,如果n_components没有赋值,则所有特征都会返回一个数值且解释方差之和等于1。
 n_components_:返回所保留的特征个数。


3.PCA常用方法

fit(X): 用数据X来训练PCA模型。
 fit_transform(X):用X来训练PCA模型,同时返回降维后的数据。
 inverse_transform(newData) :将降维后的数据转换成原始数据,但可能不会完全一样,会有些许差别。
 transform(X):将数据X转换成降维后的数据,当模型训练好后,对于新输入的数据,也可以用transform方法来降维。

比如:对矩阵X = [[6,-4],[-3,5],[-2,6],[7,-3]]进行降维,从2维降到1维。

 代码:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
from sklearn.decomposition import PCA

rng = np.random.RandomState(1)
X = [[6,-4],[-3,5],[-2,6],[7,-3]]
X = np.array(X)
plt.scatter(X[:, 0], X[:,-1])


pca = PCA(n_components=2)
pca.fit(X)

print(pca.explained_variance_)#PCA解释方差;
print("新的轴向量:")
print(pca.components_)# PCA分量;
print("各维度投影方差占比分布:")
print(pca.explained_variance_ratio_)
print("各点在新轴上的投影:")
print(pca.transform(X))


def draw_vector(v0, v1, ax=None):
    ax = ax or plt.gca()
    arrowprops=dict(arrowstyle='->',
                    linewidth=2,
                    shrinkA=0, shrinkB=0)
    ax.annotate('', v1, v0, arrowprops=arrowprops)

# plot data
plt.scatter(X[:, 0], X[:, 1], alpha=0.2)
for length, vector in zip(pca.explained_variance_, pca.components_):
    v = vector * 3 * np.sqrt(length)
    draw_vector(pca.mean_, pca.mean_ + v)
plt.axis('equal');


pca = PCA(n_components=1) # 降到一维
pca.fit(X)
print("新的轴向量:")
print(pca.components_)
print("各维度投影方差占比分布:")
print(pca.explained_variance_ratio_)
print("各点在新轴上的投影:")
print(pca.transform(X))

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Catherinemin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值