《机器学习实战》学习笔记——第13章 PCA
1. 降维技术
1.1 降维的必要性
1. 多重共线性--预测变量之间相互关联。多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯。2. 高维空间本身具有稀疏性。一维正态分布有68%的值落于正负标准差之间,而在十维空间上只有0.02%。
3. 过多的变量会妨碍查找规律的建立。
4. 仅在变量层面上分析可能会忽略变量之间的潜在联系。例如几个预测变量可能落入仅反映数据某一方面特征的一个组内。
1. 2 降维的目的:
1. 减少预测变量的个数
2. 确保这些变量是相互独立的
3. 提供一个框架来解释结果
1. 3 降维的方法:
- 主成分分析(PCA)
- 从原来的坐标系转换到了新的坐标系,新坐标系的选择是由数据本身决定的
- 第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向
- 该过程一直重复,重复次数为原始数据中特征的数目。
- 我们会发现,大部分方差都包含在最前面的几个新坐标轴中。因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理
- 因子分析(Factor Analysis)
- 我们假设在观察数据的生成中有一些观察不到的隐变量( latentvariable)。
- 假设观察数据是这些隐变量和某些噪声的线性组合。那么隐变量的数据可能比观察数据的数目少,也就是说通过找到隐变量就可以实现数据的降维。
- 因子分析已经应用于社会科学、金融和其他领域中了。
- 独立成分分析(Independent Component Analysis ICA)
- 假设数据是从N个数据源生成的,这一点和因子分析有些类似,假设数据为多个数据源的混合观察结果。
- 这些数据源之间在统计上是相互独立的,而在PCA中只假设数据是不相关的。
- 同因子分析一样,如果数据源的数目少于观察数据的数目,则可以实现降维过程。
2. PCA
数学推倒过程:http://blog.codinglabs.org/articles/pca-tutorial.html
具体的细节,Andrew Ng的网页教程:http://deeplearning.stanford.edu/wiki/index.php/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90 ,写得很详细。
2.1 优势:
通过PCA进行降维处理,我们就可以同时获得SVM和决策树的优点:
- 一方面,得到了和决策树一样简单的分类器,同时分类间隔和SVM— 样好。
- 另外,由于只需要考虑一维信息,因此数据就可以通过比SVM 简单得多的很容易采用的规则进行区分
2.2 实现:
import numpy as np
from numpy import linalg as la
import matplotlib.pyplot as plt def pca(data,topNfeat = 999999):
# data = np.array(data)
# 1.计算各属性的平均值
meanValues = np.mean(data, axis=0)
# 2.减去平均值
meanRemoved = data - meanValues
# 3. 计算协方差矩阵的特征值和特征向量
covData = np.cov(meanRemoved, rowvar=False)
eigVal, eigVects = la.eig(covData)
# 4. 将特征值的索引从大到小排序
eigValInd = np.argsort(eigVal) # 从小到大
eigValInd = eigValInd[: -(topNfeat + 1) : -1] # 逆序:从大到小
# 5. 保留topNfeat个最大的特征向量
redEigVects = eigVects[:, eigValInd]
# 6. 将数据转换到上述topNfeat个特征向量构建的新空间中
lowDData = np.dot(meanRemoved, redEigVects)
# 7. 重构
reconData = np.dot(lowDData, redEigVects.T) + meanValues
return lowDData, reconData data = np.loadtxt('testSet.txt', delimiter='\t')
lowDData, reconData = pca(data, 2) # 画出原始数据/降维数据
fig = plt.figure()
plt.scatter(data[:, 0].flatten(), data[:, 1], marker='^', s=90)
plt.scatter(reconData[:, 0].flatten(), reconData[:, 1].flatten(), marker='o', s=50, c='red')
plt.show()
2.3 选择主成分个数
所以代码修改:
import numpy as np
from numpy import linalg as la
import matplotlib.pyplot as plt
from sklearn import preprocessing
def calculateN(eigVal, percentage):
# 根据百分比确认选择特征向量的个数n的值
eigValSorted = np.sort(eigVal) #升序
eigValSorted = eigValSorted[-1::-1] #逆序(从大到小)
eigValSum = sum(eigValSorted)
num = 0
tmpSum = 0
for i in eigValSorted:
tmpSum += i
num +=1
if tmpSum >= eigValSum * percentage:
return num def pca(data,percentage = 0.99):
# data = np.array(data)
# 1.计算各属性的平均值
meanValues = np.mean(data, axis=0)
# 2.减去平均值
meanRemoved = data - meanValues
# 3. 计算协方差矩阵的特征值和特征向量
covData = np.cov(meanRemoved, rowvar=False) # 按列存放
eigVal, eigVects = la.eig(covData) # 4.计算要特征向量的个数n
n = calculateN(eigVal, percentage=percentage)
print(n) # 4. 将n个特征值的索引从大到小排序
eigValInd = np.argsort(eigVal) # 从小到大
eigValInd = eigValInd[-1:-(n+1):-1] # 逆序:从大到小 # 5. 保留n个最大的特征向量
redEigVects = eigVects[:, eigValInd]
# 6. 将数据转换到上述topNfeat个特征向量构建的新空间中
lowDData = np.dot(meanRemoved, redEigVects)
# 7. 重构
reconData = np.dot(lowDData, redEigVects.T) + meanValues
return lowDData, reconData # 画出原始数据/降维数据
def plotData(data, reconData):
fig = plt.figure()
plt.scatter(data[:, 0].flatten(), data[:, 1], marker='^', s=90)
plt.scatter(reconData[:, 0].flatten(), reconData[:, 1].flatten(), marker='o', s=50, c='red')
plt.show() def replaceWithMean():
data = np.loadtxt('D:\\学习\\机器学习实战(中+英+源码)_FILES\\machinelearninginaction\\Ch13\\secom.data', delimiter=' ')
impute = preprocessing.Imputer()
data = impute.fit_transform(data)
return data data = replaceWithMean()
lowDData, reconData = pca(data)
plotData(data, reconData)
ps:

《机器学习实战》学习笔记——第13章 PCA的更多相关文章
- #Python学习笔记:1-3章 (基于《python编程,从入门到实践)
第1-3章 这个文档是记录我学习python时一些学习笔记以及一些想法也可以称作复习笔记 第一章:起步这一章主要是从第一个"hello world"程序到python环境的搭建与配 ...
- 【机器学习实战学习笔记(2-2)】决策树python3.6实现及简单应用
文章目录 1.ID3及C4.5算法基础 1.1 计算香农熵 1.2 按照给定特征划分数据集 1.3 选择最优特征 1.4 多数表决实现 2.基于ID3.C4.5生成算法创建决策树 3.使用决策树进行分 ...
- 【机器学习实战学习笔记(1-1)】k-近邻算法原理及python实现
笔者本人是个初入机器学习的小白,主要是想把学习过程中的大概知识和自己的一些经验写下来跟大家分享,也可以加强自己的记忆,有不足的地方还望小伙伴们批评指正,点赞评论走起来~ 文章目录 1.k-近邻算法概述 ...
- java JDK8 学习笔记——第13章 时间与日期
第十三章 时间与日期 13.1 认识时间与日期 13.1.1 时间的度量 1.格林威治标准时间GMT 格林威治标准时间的正午是太阳抵达天空最高点之时.现在已经不作为标准时间使用. 2.世界时UT世界时 ...
- <<Python基础课程>>学习笔记 | 文章13章 | 数据库支持
备注:本章介绍了比较简单,只是比较使用样品,主要假设是把握连接,利用数据库.和SQLite做演示样本 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,如今已经 ...
- 【机器学习实战学习笔记(1-2)】k-近邻算法应用实例python代码
文章目录 1.改进约会网站匹配效果 1.1 准备数据:从文本文件中解析数据 1.2 分析数据:使用Matplotlib创建散点图 1.3 准备数据:归一化特征 1.4 测试算法:作为完整程序验证分类器 ...
- TensorFlow技术解析与实战学习笔记(13)------Mnist识别和卷积神经网络AlexNet
一.AlexNet:共8层:5个卷积层(卷积+池化).3个全连接层,输出到softmax层,产生分类. 论文中lrn层推荐的参数:depth_radius = 4,bias = 1.0 , alpha ...
- 机器学习实战 - 读书笔记(13) - 利用PCA来简化数据
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第13章 - 利用PCA来简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. ...
- 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...
随机推荐
- Unity3D研究院之获取摄像机的视口区域
摄像机分为两种,一种是正交摄像机还有一种是透视摄像机.正交摄像机无论远近它的视口范围永远是固定的,但是透视摄像机是由原点向外扩散性发射,也就是距离越远它的视口区域也就越大.那么我们如何获取距离摄像机任 ...
- 极值问题(acms)
[问题描述] 已知m.n为整数,且满足下列两个条件: ① m.n∈{1,2,…,k},即1≤m,n≤k,(1≤k≤109). ②(n2-m*n-m2)2=1 你的任务是:编程输入正整数k,求一组满足上 ...
- UML,Powerdesigner 使用方法
http://blog.163.com/guomaolin_gavin/blog/static/199618307201272674936220/
- Android学习笔记(八)
android中常见空间的使用方法 1.TextView TextView主要用于在界面上显示一段文本信息,如下面代码所示: <LinearLayout xmlns:android=" ...
- linux net command /uboot command
1. uboot command 读取寄存器内容 md [内存地址][长度] 修改内存地址 mw [内存地址][长度] 2. linux络命令 -- netstat -a (all)显示所有选项,默 ...
- XE6移动开发环境搭建之IOS篇(1):准备安装材料(有图有真相)
网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.选择方案 --- ...
- HtmlAgilityPack下载开启压缩的页面乱码
当一个被采集的网页是开启压缩了的话,如果使用HtmlAgilityPack 的HtmlWeb默认配置去下载,下载回来的HTML代码是乱码,应该进行如下操作 HtmlWeb web = new Html ...
- $.when().then()
当两个Ajax请求是成功的则执行函数myFunc,如果任一个有错误则执行myFailure. $.when($.ajax("/page1.php"), $.ajax("/ ...
- 什么是Mbps、Kbps、bps、kb、mb及其换算和区别
Mbps 即 Milionbit pro second(百万位每秒): Kbps 即 Kilobit pro second(千位每秒): bps 即 bit pro second(位每秒): 速度单位 ...
- 学习java第二天
首先我们要知道,java是特分大小写的,基本上分为 类名 我们统一小写 如果是多级的 我们用点来隔开 比如 file.test.number1,类或者接口的话基本上大家都是首字母大写,常量全部大写,然 ...