机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据

关键字:PCA、主成分分析、降维
作者:米仓山下
时间:2018-11-15
机器学习实战(Machine Learning in Action,@author: Peter Harrington)
源码下载地址:https://www.manning.com/books/machine-learning-in-action
git@github.com:pbharrin/machinelearninginaction.git

**************************************************************************************************************************

关于PCA的理解,要理解方差、协方差、协方差矩阵、特征值、特征向量等概念。主成分分析,研究变量间的关系,就是要寻找协方差矩阵的特征向量和特征值就等价于拟合一条能保留最大方差的直线或主成分。

特征向量描绘了方阵(协方差矩阵)的固有属性,即在方阵作用(变换)下,不会发生方向变化的向量。特征向量是线性变换的不变轴。看到对微信公总号【机器之心】上把PAC原理解释非常好的文章

【教程 | 从特征分解到协方差矩阵:详细剖析和实现PCA算法】地址https://mp.weixin.qq.com/s/tJ_FbL2nFQfkvKqpQJ8kmg

#输入数据:
import numpy as np
x=np.array([2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1])
y=np.array([2.4,0.7,2.9,2.2,3,2.7,1.6,1.1,1.6,0.9])
#归一化数据:
mean_x=np.mean(x)
mean_y=np.mean(y)
scaled_x=x-mean_x
scaled_y=y-mean_y
data=np.matrix([[scaled_x[i],scaled_y[i]] for i in range(len(scaled_x))])
#绘制散点图查看数据分布:
import matplotlib.pyplot as plt
plt.plot(scaled_x,scaled_y,'o')plt.show()
#求协方差矩阵:
cov=np.cov(scaled_x,scaled_y)
#求协方差矩阵的特征值和特征向量:
eig_val, eig_vec = np.linalg.eig(cov)
#求出特征向量后,我们需要选择降维后的数据维度 k(n 维数据降为 k 维数据),但我们的数据只有两维,所以只能降一维:
eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(len(eig_val))]
eig_pairs.sort(reverse=True)
feature=eig_pairs[0][1]
#转化得到降维后的数据:
new_data_reduced=np.transpose(np.dot(feature,np.transpose(data))

>>> eig_val
array([0.0490834 , 1.28402771])
>>> eig_vec
array([[-0.73517866, -0.6778734 ],
       [ 0.6778734 , -0.73517866]])
>>>

**************************************************************************************************************************

机器学习实战中PAC函数如下:

from numpy import *

def pca(dataMat, topNfeat=9999999):meanVals = mean(dataMat, axis=0) #计算平均值meanRemoved = dataMat - meanVals #去中心化covMat = cov(meanRemoved, rowvar=0) #协方差矩阵eigVals,eigVects = linalg.eig(mat(covMat)) #特征值、特征向量eigValInd = argsort(eigVals)            #排序eigValInd = eigValInd[:-(topNfeat+1):-1]  #截取topNfeat特征值、特征向量redEigVects = eigVects[:,eigValInd]       #reorganize eig vects largest to smallestlowDDataMat = meanRemoved * redEigVects  #对去中心化数据进行变换reconMat = (lowDDataMat * redEigVects.T) + meanVals #变换后的矩阵乘以特征向量构成的矩阵的转置(等于它的逆),又变换回去了,如果是只选取前k个特征向量,则转换回去后其他维度信息损失return lowDDataMat, reconMat

**************************************************************************************************************************

测试:

1. python createFig1.py #将测试数据'testSet.txt'绘制成散点图

'''
Created on Jun 1, 2011@author: Peter
'''
from numpy import *
import matplotlib
import matplotlib.pyplot as pltn = 1000 #number of points to create
xcord0 = []
ycord0 = []
xcord1 = []
ycord1 = []
markers =[]
colors =[]
fw = open('testSet.txt','w')
for i in range(n):[r0,r1] = random.standard_normal(2)fFlyer = r0 + 9.0tats = 1.0*r1 + fFlyer + 0xcord0.append(fFlyer)ycord0.append(tats)fw.write("%f\t%f\n" % (fFlyer, tats))fw.close()
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord0,ycord0, marker='^', s=30)
plt.xlabel('hours of direct sunlight')
plt.ylabel('liters of water')
plt.show()

View Code

2. python createFig2.py #将测试数据'testSet.txt'绘制成散点图(蓝色);将原始数据经过主成分分析之后,只保留一个主成分,然后逆变换回去(只有一个主成分信息)的散点图(红色)

'''
Created on Jun 1, 2011@author: Peter
'''
from numpy import *
import matplotlib
import matplotlib.pyplot as plt
import pcadataMat = pca.loadDataSet('testSet.txt')
lowDMat, reconMat = pca.pca(dataMat, 1)fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataMat[:,0].tolist(), dataMat[:,1].tolist(), marker='^', s=30)
ax.scatter(reconMat[:,0].tolist(), reconMat[:,1].tolist(), marker='o', s=30, c='red')
plt.show()

View Code

3. python createFig3.py #对比主成分分析前后散点图。上图为原始数据散点图,下图为主成分变换之后,将第一成分和零构成的散点图。

'''
Created on Jun 1, 2011@author: Peter
'''
from numpy import *
import matplotlib
import matplotlib.pyplot as plt
import pcan = 1000 #number of points to create
xcord0 = []; ycord0 = []
xcord1 = []; ycord1 = []
xcord2 = []; ycord2 = []
markers =[]
colors =[]
fw = open('testSet3.txt','w')
for i in range(n):groupNum = int(3*random.uniform())[r0,r1] = random.standard_normal(2)if groupNum == 0:x = r0 + 16.0y = 1.0*r1 + xxcord0.append(x)ycord0.append(y)elif groupNum == 1:x = r0 + 8.0y = 1.0*r1 + xxcord1.append(x)ycord1.append(y)elif groupNum == 2:x = r0 + 0.0y = 1.0*r1 + xxcord2.append(x)ycord2.append(y)fw.write("%f\t%f\t%d\n" % (x, y, groupNum))fw.close()
fig = plt.figure()
ax = fig.add_subplot(211)
ax.scatter(xcord0,ycord0, marker='^', s=90)
ax.scatter(xcord1,ycord1, marker='o', s=50,  c='red')
ax.scatter(xcord2,ycord2, marker='v', s=50,  c='yellow')
ax = fig.add_subplot(212)
myDat = pca.loadDataSet('testSet3.txt')
lowDDat,reconDat = pca.pca(myDat[:,0:2],1)
label0Mat = lowDDat[nonzero(myDat[:,2]==0)[0],:2][0] #get the items with label 0
label1Mat = lowDDat[nonzero(myDat[:,2]==1)[0],:2][0] #get the items with label 1
label2Mat = lowDDat[nonzero(myDat[:,2]==2)[0],:2][0] #get the items with label 2
#ax.scatter(label0Mat[:,0],label0Mat[:,1], marker='^', s=90)
#ax.scatter(label1Mat[:,0],label1Mat[:,1], marker='o', s=50,  c='red')
#ax.scatter(label2Mat[:,0],label2Mat[:,1], marker='v', s=50,  c='yellow')
ax.scatter(label0Mat[:,0].tolist(),zeros(shape(label0Mat)[0]), marker='^', s=90)
ax.scatter(label1Mat[:,0].tolist(),zeros(shape(label1Mat)[0]), marker='o', s=50,  c='red')
ax.scatter(label2Mat[:,0].tolist(),zeros(shape(label2Mat)[0]), marker='v', s=50,  c='yellow')
plt.show()

View Code

4. python createFig4.py #前20个主成分对应的方差百分比。大部分方差包含在前几个方差中。数据变换后对应的方差即为特征值【主成份分析最大方差等于特征值的证明问题】

'''
Created on Jun 14, 2011@author: Peter
'''
from numpy import *
import matplotlib
import matplotlib.pyplot as plt
import pcadataMat = pca.replaceNanWithMean()#below is a quick hack copied from pca.pca()
meanVals = mean(dataMat, axis=0)
meanRemoved = dataMat - meanVals #remove mean
covMat = cov(meanRemoved, rowvar=0)
eigVals,eigVects = linalg.eig(mat(covMat))
eigValInd = argsort(eigVals)            #sort, sort goes smallest to largest
eigValInd = eigValInd[::-1]#reverse
sortedEigVals = eigVals[eigValInd]
total = sum(sortedEigVals)
varPercentage = sortedEigVals/total*100fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(1, 21), varPercentage[:20], marker='^')
plt.xlabel('Principal Component Number')
plt.ylabel('Percentage of Variance')
plt.show()

View Code

转载于:https://www.cnblogs.com/Micang/p/9966815.html

机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据相关推荐

  1. 决策树(chap3)Machine Learning In Action学习笔记

    优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据. 缺点:可能会产生过度匹配问题. 适用数据类型:数值型(必须离散化)和标称型. 决策树创建分支的伪代码函数crea ...

  2. Machine Learning in Action 读书笔记---第5章 Logistic回归

    Machine Learning in Action 读书笔记 第5章 Logistic回归 文章目录 Machine Learning in Action 读书笔记 一.Logistic回归 1.L ...

  3. Machine Learning in Action 读书笔记---第3章 决策树

    Machine Learning in Action 读书笔记 第3章 决策树 文章目录 Machine Learning in Action 读书笔记 一.决策树算法简介 1 决策树的构造 2 决策 ...

  4. Machine Learning in Action 读书笔记---第4章 基于概率论的分类方法:朴素贝叶斯

    Machine Learning in Action 读书笔记 第4章 基于概率论的分类方法:朴素贝叶斯 文章目录 Machine Learning in Action 读书笔记 一.基于贝叶斯决策理 ...

  5. Machine Learning in Action 读书笔记---第8章 预测数值型数据:回归

    Machine Learning in Action 读书笔记 第8章 预测数值型数据:回归 文章目录 Machine Learning in Action 读书笔记 一.回归 1.回归的一般过程 2 ...

  6. 机器学习(Machine Learning)——深度学习(Deep Learning)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/abcjennifer/article/ ...

  7. 原创 | 斯坦福Machine Learning with Graphs 学习笔记(第一讲)

    作者:林夕 本文长度为2900字,建议阅读9分钟 本文为大家介绍图网络的基本概念.网络的应用以及图的结构. 标签:机器学习 目录 一.Why Networks 二.网络的应用     2.1 应用领域 ...

  8. 原创 | 斯坦福Machine Learning with Graphs 学习笔记(第二讲)

    作者:于媛,十三鸣 本文长度为3300字,建议阅读10+分钟 本文为大家介绍常用的网络属性和经典的网络模型. 标签:机器学习 [ 导读 ]在研究网络的时候,我们往往需要从结构层面对网络进行分析,网络属 ...

  9. 《机器学习实战》第8章学习笔记(回归)之预测乐高玩具套装的价格

    原文中通过Google提供的API来抓取价格,但由于现在访问不了Google,所以,直接通过文本给的html文件直接读取价格信息.然后进一步进行分析预测. 代码实现: # -*- coding: ut ...

  10. 学习笔记2 - 利用元数据管理数据质量

    大数据Clouder:利用元数据管理数据质量 元数据 ①定义:元数据(Metadata),又称中介数据.中继数据,为描述数据的数据(data about data),主要是描述数据属性(propert ...

最新文章

  1. 用python实现杨辉三角的几种不同方式
  2. Jmeter 创建一个web测试计划
  3. 微信消息类型和事件类型
  4. [转载] 使用DirectInput进行交互
  5. Csla框架之业务与验证规则
  6. 【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)
  7. 1.Head First Java --- 进入Java的世界
  8. php 进销存 源代码_PHP 进销存源码
  9. 行测中图形推理题的规律
  10. C#也能做机器学习?基于.NET的AI智能应用市场还是一片“处女地”
  11. Word目录中自动添加自定义样式的多级标题的方法
  12. MoCo v1 文献研究 [自监督学习]
  13. 思科下一代数据中心Nexus7000优势
  14. 模电一、半导体二极管和三极管
  15. Jenkin权限控制——项目矩阵授权策略
  16. 如何批量修改多个文件的后缀名!
  17. IT项目管理十大要素
  18. PHP人脸识别小程序接口(阿里云OpenAPI)
  19. Linux部署python接口自动化教程,基于centos7 python3
  20. Yii2一些方法技巧小记

热门文章

  1. Exchange的邮箱创建与使用
  2. 这个用PHP开发的全开源商城系统可免费商用
  3. 威尔逊定理 及其拓展
  4. Dreamweaver网页作业——紫罗兰永恒花园动漫价绍网页 7页,含有table表格,js表单验证还有首页视频。以及列表页。浮动布局。div+css+js
  5. 百位明星身份证照片被曝光
  6. moveit缺少libfcl.so.0.6文件
  7. Fast-paced Multiplayer
  8. 20220525商汤算法岗实习面试经历
  9. COSTDOWN Project's BSP(二)
  10. TED | Never, Ever Give Up