ML--主成分分析(PCA)

一.PCA(Principal Component Analysis) is what ?
主成分分析是一种特征提取技术,以某种特定的方式组合进行变量输入,进一步保留价值量较大的部分,丢弃不重要的变量!
PCA上场的机会:
降低变量的数目,不需要识别可以完全移除的变量,变量之间相互独立;小编在这里想要重点强调一下PCA方法是一种线性变换,主要用于高维数据的降维。
既然面对的数据被抽象为一组向量,那么下面小编觉着有必要研究一些向量的数学性质。
线性空间的性质:
1.零元素唯一,负元素唯一;
2.设输入这里写图片描述)当这里写图片描述)时,这里写图片描述)中的向量组这里写图片描述)线性相关的充要条件为该向量组中至少有一个向量可由组中其余向量线性表示
3.向量的内积定义为:这里写图片描述,内积的值也代表线段的长度。即这里写图片描述是向量的模。
4.二维降一维:在二维平面中选择一个方向,将所有数据都投影到这个方向所在直线上。
5.方差:投影后尽可能的分散程度;寻找一维基使所有数据变换后,使得方差最大
6.协方差:相关性的两个字段不是完全独立,必然存在重复表示的信息这里写图片描述),可以看到,在字段均值为0的情况下,两个字段的协方差表示为其内积除以元素数m。当协方差为0时,表示两个字段完全独立,因此为了让协方差为0,我们在选择变换基时应尽量与其正交。
因此降维的主要优化目标进一步转变为了:将一组N维向量降为K维,就是选择K个单位正交基,使得变换后的各字段的协方差为0,方差尽量的最大化。
7.协方差矩阵:PCA的终极目标在某种程度上来说就是建立方差与协方差的关系,因为通过矩阵将两者统一表示,经过观察发现,两者可以被表示成内积的形式。
这里写图片描述)
然后用X再乘以自身的转置:
这里写图片描述)
此时会惊奇的发现!将矩阵的每个元素除以m,对角线上的两个元素分别是方差和协方差。
9.协方差矩阵对角化:即将对角线以外的其他元素化为0,并在对角线上将元素按大小从上到下进行排序。设P为一组基按行组成的矩阵,设Y=PX,即将Y带入7中的X,则可以求得最优变换基P。P是协方差矩阵的特征向量正交化后按行排列出的矩阵,其中每一行都是一个特征向量。如果设P按照特征值的从大到小,将特征向量从上到下排列,则用P的前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵Y。
PCA使用随机SVD
使用丢弃具有较低奇异值的奇异向量成分,将数据降维到低纬空间并保留大部分方差非常有意义的。
下面给出算法:
设有m个n维的数据:
**setp1:**将原始数据按列组成n行m列矩阵X
**step2:**将X的每一行进行零均值化,即减去这一行的均值
**step3:**求出协方差矩阵
**step4:**求出协方差矩阵的特征值及对应的特征向量
**step5:**将特征向量按对应特征值大小从上到下按行排列成矩阵
**step6:**Y=PX即为降维到k维后的数据

# ======================PCA主成分分析=================
# 花卉样本数据集
from sklearn import datasets
import matplotlib.pyplot as plt
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.target

from sklearn.decomposition import PCA,IncrementalPCA   # 主成分分析(PCA)
pca = PCA(n_components=2)  # PCA降维到2维
X_pca = pca.fit_transform(X)

ipca = IncrementalPCA(n_components=2 batch_size=10)  # 增量PCA降维到2维
X_ipca = ipca.fit_transform(X)
pca = PCA(n_components=2, svd_solver='randomized', whiten=True)  # PCA 使用随机SVD
X_pca1 = pca.fit_transform(X)
plt.subplot(131)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, alpha=.8, lw=2)
plt.title('PCA')
plt.subplot(132)
plt.scatter(X_ipca[:, 0], X_ipca[:, 1], c=y, alpha=.8, lw=2)
plt.title('IPCA')
plt.subplot(133)
plt.scatter(X_pca1[:, 0], X_pca1[:, 1], c=y, alpha=.8, lw=2)
plt.title('PCA with rand SVD')
plt.show()

在这里插入图片描述
核PCA
kernelPCA是PCA的扩展,通过使用核方法实现非线性降维。

# ======================核PCA主成分分析=================
from sklearn.datasets import make_circles
from sklearn.decomposition import PCA, KernelPCA
import matplotlib.pyplot as plt
import numpy as np
X, y = make_circles(n_samples=400, factor=.3, noise=.05)  # 生成样本数据集
kpca = KernelPCA(kernel="r", fit_inverse_transform=True, gamma=10)  # 核PCA降维
X_kpca = kpca.fit_transform(X)
X_back = kpca.inverse_transform(X_kpca)
pca = PCA(n_components=2)  
plt.subplot(221)
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=.8, lw=2)
plt.title('Original space')
plt.subplot(222)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, alpha=.8, lw=2)
plt.title('PCA')
plt.subplot(223)
plt.scatter(X_kpca[:, 0], X_kpca[:, 1], c=y, alpha=.8, lw=2)
plt.title('KPCA')
plt.subplot(224)
plt.scatter(X_back[:, 0], X_back[:, 1], c=y, alpha=.8, lw=2)
plt.title('inverse space')
plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值