PCA降维原理及其代码实现(附加 sklearn PCA用法参数详解)
学习笔记
本篇博文绝大多数来源于书籍《机器学习实战》
记录自己的学习笔记而已。
降维作用
(1)使得数据集更容易使用
(2)降低很多算法的计算开销
(3)去除噪声
(4)多维数据不容易画图,降低维度容易画图,使结果容易理解。
优点:降低数据的复杂性,识别出最重要的多个特征。
缺点:不一定需要,有可能损失掉有用信息,仅适用于数值数据。
PCA原理
在PCA中,数据从原来的坐标系转换到了新的坐标系。新坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向。该过程一直重复,重复次数为原始数据中特征的数目。会发现,大部分方差都包含在最前面的几个新坐标轴中。因此我们可以只选择前面几个坐标轴,即对数据进行了降维处理。(大白话讲解:选择坐标轴的依据是尽可能保留原始数据。降维即把数据投影在这个坐标轴上或者几个坐标轴构成的‘平面’上)。
PCA相关算法
前面提到数据的第一个主成分是从数据差异最大(即方差最大)的方向提取出来。第二个主成分是数据差异性次大的方向,并且与第一个主成分正交。通过数据集的协方差矩阵及其特征值分析,我们就可以拿到这些主成分的值。
一旦得到协方差矩阵的特征向量,取出最大的N个值。这些特征向量也给出了N个最重要特征的真实结构。将数据乘上这N个特征向量转换到新的数据空间。
特征值分析
在 AV=aV中,V是特征向量,a是特征值,是简单的标量。等式的含义是:如何特征向量V被某个矩阵A左乘,那么它就等于某个标量a乘以V。
numpy里有特征向量和特征值的模块linalg。其中eig()方法用于求特征向量和特征值。
PCA原理实现
原始数据.txt
数据为两维,将其降维1维。
选用两维是因为可以可视化。
代码
python 3
import numpy as np
import matplotlib.pyplot as plt"""
函数说明:解析文本数据Parameters:
filename - 文件名
delim - 每一行不同特征数据之间的分隔方式,默认是tab键‘\t’Returns:
j将float型数据值列表转化为矩阵返回"""
def loadDataSet(filename, delim='\t'):fr = open(filename)stringArr = [line.strip().split(delim) for line in fr.readlines()]datArr = [list(map(float, line)) for line in stringArr]return np.mat(datArr)"""
函数说明:PCA特征维度压缩函数Parameters:
dataMat - 数据集数据
topNfeat - 需要保留的特征维度,即要压缩成的维度数,默认4096Returns:
lowDDataMat - 压缩后的数据矩阵
reconMat - 压缩后的数据矩阵反构出原始数据矩阵"""
def pca(dataMat, topNfeat=4096):# 求矩阵每一列的均值meanVals = np.mean(dataMat, axis=0)# 数据矩阵每一列特征减去该列特征均值meanRemoved = dataMat - meanVals# 计算协方差矩阵,处以n-1是为了得到协方差的无偏估计# cov(x, 0) = cov(x)除数是n-1(n为样本个数)# cov(x, 1)除数是ncovMat = np.cov(meanRemoved, rowvar=0)# 计算协方差矩阵的特征值及对应的特征向量# 均保存在相应的矩阵中eigVals, eigVects = np.linalg.eig(np.mat(covMat))# sort():对特征值矩阵排序(由小到大)# argsort():对特征矩阵进行由小到大排序,返回对应排序后的索引eigValInd = np.argsort(eigVals)# 从排序后的矩阵最后一个开始自下而上选取最大的N个特征值,返回其对应的索引eigValInd = eigValInd[: -(topNfeat+1): -1]# 将特征值最大的N个特征值对应索引的特征向量提取出来,组成压缩矩阵redEigVects = eigVects[:, eigValInd]# 将去除均值后的矩阵*压缩矩阵,转换到新的空间,使维度降低为NlowDDataMat = meanRemoved * redEigVects# 利用降维后的矩阵反构出原数据矩阵(用作测试,可跟未压缩的原矩阵比对)# 此处用转置和逆的结果一样redEigVects.IreconMat = (lowDDataMat * redEigVects.T) + meanValsprint(reconMat)# 返回压缩后的数据矩阵及该矩阵反构出原始数据矩阵return lowDDataMat, reconMatif __name__ == '__main__':dataMat = loadDataSet('数据.txt')lowDmat, reconMat = pca(dataMat, 1)print(np.shape(lowDmat))fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(dataMat[:, 0].flatten().A[0], dataMat[:, 1].flatten().A[0], marker='^', s=90)ax.scatter(reconMat[:, 0].flatten().A[0], reconMat[:, 1].flatten().A[0], marker='o', s=90, c='red')plt.show()
lowDmat, reconMat 一个为降维后的数据,一个为重构后的数据。
(重构为原来的数据格式,去除了一些噪声)
在真实算例中,自己选择要降维后的数据还是重构数据。
如图片数据pca后,肯定要选择重构数据。降维后的数据构不成一张图呀。
解释:
PCA()里有两个参数,第一个参数为数据集,第二个参数为降的维度,降到多少维。
PCA伪代码:
1.去除平均值: meanVals = np.mean(dataMat, axis=0)
2.计算协方差矩阵:covMat = np.cov(meanRemoved, rowvar=0)
3.计算协方差矩阵的特征值和特征向量:covMat = np.cov(meanRemoved, rowvar=0)
4.将特征值从大到小排序: eigValInd = np.argsort(eigVals)
# 从排序后的矩阵最后一个开始自下而上选取最大的N个特征值,返回其对应的索引
eigValInd = eigValInd[: -(topNfeat+1): -1]
5.保留最上面的N个特征向量: # 将特征值最大的N个特征值对应索引的特征向量提取出来,组成压缩矩阵
redEigVects = eigVects[:, eigValInd]
6.将数据转换到上述N个特征向量构建的新空间中,根据公式重构。(逆公式)
结果:
图中红色为重构后的数据
PCA调包实现
导入包
from sklearn.decomposition import PCA
用法:
PCA()参数 | 说明 |
---|---|
n_components | int, float, None 或 string,PCA算法中所要保留的主成分个数,也即保留下来的特征个数,如果 n_components = 1,将把原始数据降到一维;如果赋值为string,如n_components=‘mle’,将自动选取特征个数,使得满足所要求的方差百分比;如果没有赋值,默认为None,特征个数不会改变(特征数据本身会改变)。 |
copy | True 或False,默认为True,即是否需要将原始训练数据复制。 |
whiten: | True 或False,默认为False,即是否白化,使得每个特征具有相同的方差。 |
属性 | 说明 |
---|---|
explained_variance_ratio_ | 返回所保留各个特征的方差百分比,如果n_components没有赋值,则所有特征都会返回一个数值且解释方差之和等于1。 |
n_components_: | 返回所保留的特征个数 |
方法 | 说明 |
---|---|
fit(X): | 用数据X来训练PCA模型。 |
fit_transform(X) | 用X来训练PCA模型,同时返回降维后的数据。 |
inverse_transform(newData) | newData 为降维后的数据。将降维后的数据转换成原始数据,但可能不会完全一样,会有些许差别。 |
transform(X) | 将数据X转换成降维后的数据,当模型训练好后,对于新输入的数据,也可以用transform方法来降维 |
例子:
import numpy as np
import matplotlib.pyplot as plt#导入数据
def loadDataSet(filename, delim='\t'):fr = open(filename)stringArr = [line.strip().split(delim) for line in fr.readlines()]datArr = [list(map(float, line)) for line in stringArr]return np.mat(datArr)
dataMat = loadDataSet('数据.txt')
#导入PCAfrom sklearn.decomposition import PCA
pca = PCA(n_components=1)
pca.fit(dataMat)
lowDmat=pca.transform(dataMat)#降维后的数据
print('降维后的数据维度:',lowDmat.shape)
reconMat=pca.inverse_transform(lowDmat)#s重构数据
print("重构后的数据维度:",reconMat.shape)#重构数据维度fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataMat[:, 0].flatten().A[0], dataMat[:, 1].flatten().A[0], marker='^', s=90)
ax.scatter(reconMat[:, 0], reconMat[:, 1], marker='o', s=90, c='red')
plt.show()
注意:重构 输入的是降维后的数据 reconMat=pca.inverse_transform(lowDmat)#s重构数据
结果:
其他专业的计算机小白,写博文不容易。如果你觉得本文对你有用,请点个赞支持下,谢谢!
PCA降维原理及其代码实现(附加 sklearn PCA用法参数详解)相关推荐
- 感知机(perceptron):原理、python实现及sklearn.linear_model.Perceptron参数详解
文章目录 1.感知机模型介绍 2.感知机学习策略 3.感知机学习算法 3.1 原始形式 3.2.1算法收敛性的证明 3.2对偶形式 4.python实现感知机算法 4.1手写感知机算法 4.2 sci ...
- Lesson 8.1Lesson 8.2 决策树的核心思想与建模流程CART分类树的建模流程与sklearn评估器参数详解
Lesson 8.1 决策树的核心思想与建模流程 从本节课开始,我们将介绍经典机器学习领域中最重要的一类有监督学习算法--树模型(决策树). 可此前的聚类算法类似,树模型也同样不是一个模型,而是一类模 ...
- 数据集划分函数sklearn.model_selection.train_test_split参数详解
该函数可以随机划分样本数据为训练集和测试集,并返回划分好的训练集和测试集数据. sklearn.model_selection.train_test_split(train_data,train_ta ...
- PCA降维以及Kmeans聚类实例----python,sklearn,PCA,Kmeans
PCA 算法也叫主成分分析(principal components analysis),主要是用于数据降维的.关于降维,可以这样理解,一组数据有n个feature(客户年龄,收入,每个月消费额度等等 ...
- PCA降维原理 操作步骤与优缺点
PCA全称是Principal Component Analysis,即主成分分析.它主要是以"提取出特征的主要成分"这一方式来实现降维的. 介绍PCA的大体思想,先抛开一些原理公 ...
- PCA降维原理(主成分分析)小结
PCA降维 PCA是什么 目的和原则 PCA与数学理论 均值和零均值化 均值 零均值化 特征向量和特征值 定义 性质 方差 协方差 协方差矩阵 协方差矩阵对角化 PCA过程总结 PCA是什么 PCA( ...
- [Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解(1)
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 调包侠福音!机器学习经典算法开源教程(附参数详解及代码实现)
Datawhale 作者:赵楠.杨开漠.谢文昕.张雨 寄语:本文针对5大机器学习经典算法,梳理了其模型.策略和求解等方面的内容,同时给出了其对应sklearn的参数详解和代码实现,帮助学习者入门和巩固 ...
- Lesson 8.3Lesson 8.4 ID3、C4.5决策树的建模流程CART回归树的建模流程与sklearn参数详解
Lesson 8.3 ID3.C4.5决策树的建模流程 ID3和C4.5作为的经典决策树算法,尽管无法通过sklearn来进行建模,但其基本原理仍然值得讨论与学习.接下来我们详细介绍关于ID3和C4. ...
最新文章
- js判断鼠标靠近屏幕最侧面的监听_threejs按鼠标位置缩放场景
- 重新启动C++Builder
- Android基础——框架模式MVC在安卓中的实践
- VTK:可视化之Visualize2DPoints
- vb获取textbox数字_Spectrum仪器PCIe数字化仪可额外扩展8个数字输入
- Kubernetes 也有局限性吗?
- Promise编程基础
- mysql水平分表实践记录_MYSQL 分表实践
- 记录—java获取服务器的信息
- 云电脑与远控软件有什么区别?如何选?
- IPv6地址、单播、多播/组播介绍
- 仅在 localhost 中部署并使用 RSSHub
- FEC【筷云早报】2020年3月16日星期一
- 大连海事大学计算机基础线上考试虚拟机环境配置
- 数据采集与管理【13】
- 弘晖资本募集完成人民币三期基金
- android 获取多个控件,Android----获取activity上所有的控件
- 电子证据是计算机系统,电子证据的分类
- 时间转换 给定一个以秒为单位的时间t,要求用“<H>:<M>:<S>”的格式来表示这个时间。<H>表示时间,<M>表示分钟,而<S>表示秒,它们都是整数且没有前导的“0”。
- 公告:CSDN新版首页上线