学习笔记

本篇博文绝大多数来源于书籍《机器学习实战》
记录自己的学习笔记而已。

降维作用
(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用法参数详解)相关推荐

  1. 感知机(perceptron):原理、python实现及sklearn.linear_model.Perceptron参数详解

    文章目录 1.感知机模型介绍 2.感知机学习策略 3.感知机学习算法 3.1 原始形式 3.2.1算法收敛性的证明 3.2对偶形式 4.python实现感知机算法 4.1手写感知机算法 4.2 sci ...

  2. Lesson 8.1Lesson 8.2 决策树的核心思想与建模流程CART分类树的建模流程与sklearn评估器参数详解

    Lesson 8.1 决策树的核心思想与建模流程 从本节课开始,我们将介绍经典机器学习领域中最重要的一类有监督学习算法--树模型(决策树). 可此前的聚类算法类似,树模型也同样不是一个模型,而是一类模 ...

  3. 数据集划分函数sklearn.model_selection.train_test_split参数详解

    该函数可以随机划分样本数据为训练集和测试集,并返回划分好的训练集和测试集数据. sklearn.model_selection.train_test_split(train_data,train_ta ...

  4. PCA降维以及Kmeans聚类实例----python,sklearn,PCA,Kmeans

    PCA 算法也叫主成分分析(principal components analysis),主要是用于数据降维的.关于降维,可以这样理解,一组数据有n个feature(客户年龄,收入,每个月消费额度等等 ...

  5. PCA降维原理 操作步骤与优缺点

    PCA全称是Principal Component Analysis,即主成分分析.它主要是以"提取出特征的主要成分"这一方式来实现降维的. 介绍PCA的大体思想,先抛开一些原理公 ...

  6. PCA降维原理(主成分分析)小结

    PCA降维 PCA是什么 目的和原则 PCA与数学理论 均值和零均值化 均值 零均值化 特征向量和特征值 定义 性质 方差 协方差 协方差矩阵 协方差矩阵对角化 PCA过程总结 PCA是什么 PCA( ...

  7. [Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解(1)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. 调包侠福音!机器学习经典算法开源教程(附参数详解及代码实现)

    Datawhale 作者:赵楠.杨开漠.谢文昕.张雨 寄语:本文针对5大机器学习经典算法,梳理了其模型.策略和求解等方面的内容,同时给出了其对应sklearn的参数详解和代码实现,帮助学习者入门和巩固 ...

  9. Lesson 8.3Lesson 8.4 ID3、C4.5决策树的建模流程CART回归树的建模流程与sklearn参数详解

    Lesson 8.3 ID3.C4.5决策树的建模流程 ID3和C4.5作为的经典决策树算法,尽管无法通过sklearn来进行建模,但其基本原理仍然值得讨论与学习.接下来我们详细介绍关于ID3和C4. ...

最新文章

  1. js判断鼠标靠近屏幕最侧面的监听_threejs按鼠标位置缩放场景
  2. 重新启动C++Builder
  3. Android基础——框架模式MVC在安卓中的实践
  4. VTK:可视化之Visualize2DPoints
  5. vb获取textbox数字_Spectrum仪器PCIe数字化仪可额外扩展8个数字输入
  6. Kubernetes 也有局限性吗?
  7. Promise编程基础
  8. mysql水平分表实践记录_MYSQL 分表实践
  9. 记录—java获取服务器的信息
  10. 云电脑与远控软件有什么区别?如何选?
  11. IPv6地址、单播、多播/组播介绍
  12. 仅在 localhost 中部署并使用 RSSHub
  13. FEC【筷云早报】2020年3月16日星期一
  14. 大连海事大学计算机基础线上考试虚拟机环境配置
  15. 数据采集与管理【13】
  16. 弘晖资本募集完成人民币三期基金
  17. android 获取多个控件,Android----获取activity上所有的控件
  18. 电子证据是计算机系统,电子证据的分类
  19. 时间转换 给定一个以秒为单位的时间t,要求用“<H>:<M>:<S>”的格式来表示这个时间。<H>表示时间,<M>表示分钟,而<S>表示秒,它们都是整数且没有前导的“0”。
  20. 公告:CSDN新版首页上线

热门文章

  1. java download oracle,Oracle Java Products Download
  2. echarts设置折线图属性
  3. 《数据库系统实训》实验报告——数据库维护
  4. LeetCode176 第二高的薪水
  5. Visual C++——加载自定义光标
  6. zookeeper配置中心
  7. windows查看java进程详细信息的几种方法
  8. JavaScript基础03【算数运算符、一元运算符、自增and自减】
  9. windows环境下安装elasticsearch
  10. JavaWeb学习之路——SpringBoot整合Mybatis(二)