Merge branch 'master' of https://github.com/apachecn/MachineLearning
1000
data/13.PCA/testSet.txt
Executable file
@@ -18,7 +18,7 @@
|
||||
* 在分类算法中目标变量的类型通常是标称型的,而在回归算法中通常是连续型的。
|
||||
|
||||
* 机器学习的训练过程
|
||||
* 
|
||||
* 
|
||||
|
||||
* 监督学习
|
||||
* 必须知道预测什么,即必须知道目标变量的分类信息。分类和回归属于监督学习。
|
||||
@@ -43,7 +43,7 @@
|
||||
* 想要完成何种任务,比如是预测明天下雨的概率还是对投票者按照兴趣分组;如果想要预测目标变量的值,则可以选择监督学习算法,否则可以选择无监督学习算法。
|
||||
* 需要分析或收集的数据是什么
|
||||
* 举例
|
||||
* 
|
||||
* 
|
||||
|
||||
* 开发的步骤
|
||||
* 1.收集数据
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
* 2.关联规则(association rules): 暗示两种物品之间可能存在很强的关系
|
||||
* 总结:首先需要找到频繁项集,才能找到关联规则。
|
||||
* 如下图:
|
||||
* 
|
||||
* 
|
||||
* 支持度(support)
|
||||
* 数据集中包含该项集的记录所占的比例
|
||||
* 例如上图中:{豆奶}的支持度=4/5, {豆奶,尿布}的支持度=3/5
|
||||
@@ -36,10 +36,10 @@
|
||||
* 如果某个项集是频繁的,那么它的所有子集也是频繁的,反之,一个项集是非频繁的,那么它的所有超集也是非频繁的。
|
||||
* 例如: 我们假设知道{2, 3}是非频繁项,那么{0, 2, 3}, {1, 2, 3}, {0, 1, 2, 3}都是非频繁项。
|
||||
* 如下图:
|
||||
* 
|
||||
* 
|
||||
* 分级法: 频繁项集->关联规则
|
||||
* 1.首先从一个频繁项集开始,接着创建一个规则列表,其中规则右部分只包含一个元素,然后对这个规则进行测试。
|
||||
* 2.接下来合并所有剩余规则来创建一个新的规则列表,其中规则右部包含两个元素。
|
||||
* 如下图:
|
||||
* 
|
||||
* 
|
||||
* 最后: 每次增加频繁项集的大小,Apriori算法都会重新扫描整个数据集,是否有优化空间呢? 下一章:FP-growth算法等着你的到来
|
||||
|
||||
@@ -1,6 +1,70 @@
|
||||
|
||||
# 3) 利用PCA来简化数据
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script>
|
||||
|
||||
* 未完待续
|
||||
> 场景描述:
|
||||
|
||||
* 我们正通过电视而非现场观看体育比赛,在电视的纯平显示器上有一个球。
|
||||
* 显示器大概包含了100万像素,而球则可能是由较少的像素组成,例如说一千个像素。
|
||||
* 人们实时的将显示器上的百万像素转换成为一个三维图像,该图像就给出运动场上球的位置。
|
||||
* 在这个过程中,人们已经将数据从一百万维降至了三维。这就被称为`降维(dimensionality reduction)`
|
||||
|
||||
## 1 将维技术
|
||||
|
||||
> 数据显示并非大规模特征下的唯一难题,对数据进行简化还有如下一系列的原因:
|
||||
|
||||
* 1) 使得数据集更容易使用
|
||||
* 2) 降低很多算法的计算开销
|
||||
* 3) 去除噪音
|
||||
* 4) 是的结果易懂
|
||||
|
||||
> 适用范围:
|
||||
|
||||
* 在已标注与未标注的数据上都有降维技术。
|
||||
* 这里我们将主要关注未标注数据上的降维技术,将技术同样也可以应用于已标注的数据。
|
||||
|
||||
> 在以下3种降维技术中, PCA的应用目前最为广泛,因此本章主要关注PCA。
|
||||
|
||||
* 1) 主成分分析(Principal Component Analysis, PCA)
|
||||
* `通俗理解:就是找出一个最主要的特征,然后进行分析。`
|
||||
* `例如: 考察一个人的智力情况,就直接看数学成绩就行(存在:数学、语文、英语成绩)`
|
||||
* a.将数据从原来的坐标系转换到了新的坐标系,新的坐标系的选择是由数据本身决定的。
|
||||
* b.第一个新坐标轴选择的是原始数据中`方差最大`的方向
|
||||
* c.第二个新坐标轴的选择和第一个坐标轴`正交(orthogonal 如果是二维空间就叫垂直)`且具有`最大方差`的方向。
|
||||
* d.该过程一直重复,重复次数为原始数据中特征的数目。
|
||||
* 我们会发现,大部分方差都包含在最前面的几个新坐标轴中。因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理。
|
||||
* 2) 因子分析(Factor Analysis)
|
||||
* `通俗理解:将多个实测变量转换为少数几个综合指标,它反映一种降维的思想.通过降维将相关性高的变量聚在一起,从而减少需要分析的变量的数量,而减少问题分析的复杂性`
|
||||
* `例如: 考察一个人的整体情况,就直接组合3样成绩(隐变量),看平均成绩就行(存在:数学、语文、英语成绩)`
|
||||
* 应用的领域:社会科学、金融和其他领域
|
||||
* 在因子分析中,我们
|
||||
* 假设观察数据的生成中有一些观察不到的隐变量(latent variable)。
|
||||
* 假设观察数据是这些隐变量和某些噪音的线性组合。
|
||||
* 那么隐变量的数据可能比观察数据的数目少,也就说通过找到隐变量就可以实现数据的降维。
|
||||
* 3) 独立成分分析(Independ Component Analysis, ICA)
|
||||
* `通俗理解:PCA(主成分分析)寻找的是,使得投影之后,尽量保留原有信息量的投影方向。 ICA(独立主成分分析)寻找的是,使得投影之后,数据之间相互独立的投影方向。`
|
||||
* `例如:我们去ktv唱歌,想辨别唱的是哪首歌,PCA就是搜录歌词;而ICA是对歌词按人进行完全的拆分。`
|
||||
* ICA假设数据是从N个数据源生成的,这一点和因子分析有些类似。
|
||||
* 假设数据为多个数据源的混合观察结果,这些数据源之间在统计上是相互独立的,而在PCA中只假设数据是不相关的。
|
||||
* 同因子分析一样,如果数据源的数目少于观察数据的数目,则可以实现降维过程。
|
||||
|
||||
## 2 主成分分析(PCA)
|
||||
|
||||
> PCA的优缺点
|
||||
|
||||
* 优点:降低数据的复杂性,识别最重要的多个特征。
|
||||
* 缺点:不一定需要,且可能损失有用信息。
|
||||
* 适用数据类型:数值型数据。
|
||||
|
||||
> 通过PCA进行降维处理,我们就可以同时获得SVM和决策树的优点:
|
||||
|
||||
* 一方面,得到了和决策树一样简单的分类器,同时分类间隔和SVM一样好。
|
||||
* 1.第一个主成分就是来自于数据差异性最大(即 方差最大)的方向提取出来
|
||||
* 2.第二个主成分就是来自于数据差异性次大的方向,并且该方向于第一个主成分方向正交。
|
||||
* 3.通过数据集的协方差矩阵及其特征值分析,我们就可以得到这些主成分的值。
|
||||
* 一旦得到了协方差矩阵的特征向量,我们就可以保留最大的N个值。这些特征向量也给出了N个最重要特征的真实结构。我们可以通过将数据乘上这N个特征向量而将它转换到新的空间。
|
||||
* 例如下图:
|
||||
* 
|
||||
|
||||
## 3 对半导体数据进行降维处理
|
||||
|
||||
|
||||
|
||||
@@ -24,4 +24,4 @@
|
||||
* 基尼不纯度(Gini impurity) [本书不做过多的介绍]
|
||||
* 简单来说:就是从一个数据集中随机选取子项,度量其被错误分类到其他分组里的概率。
|
||||
* 流程介绍图
|
||||
* 
|
||||
* 
|
||||
|
||||
@@ -32,18 +32,18 @@
|
||||
* 单层决策树(decision stump, 也称决策树桩)是一种简单的决策树。
|
||||
* 过拟合(overfitting, 也称为过学习)
|
||||
* 发现测试错误率在达到一个最小值之后有开始上升,这种现象称为过拟合。
|
||||
* 
|
||||
* 
|
||||
* 非均衡分类问题
|
||||
* 现象:
|
||||
* 判断马是否能继续生存
|
||||
* 过滤垃圾邮件
|
||||
* ROC曲线: 最佳的分类器应该尽可能地处于左上角
|
||||
* 
|
||||
* 
|
||||
* 对不同的ROC曲线进行比较的一个指标是曲线下的面积(Area Unser the Curve, AUC).
|
||||
* AUC给出的是分类器的平均性能值,当然它并不能完全代替对整条曲线的观察。
|
||||
* 一个完美分类器的AUC为1,而随机猜测的AUC则为0.5。
|
||||
* 基于代价函数的分类器决策控制:`TP*(-5)+FN*1+FP*50+TN*0`
|
||||
* 
|
||||
* 
|
||||
* 欠抽样(undersampling)或者过抽样(oversampling)
|
||||
* 欠抽样: 意味着删除样例
|
||||
* 过抽样: 意味着复制样例(重复使用)
|
||||
|
||||
|
Before Width: | Height: | Size: 333 KiB After Width: | Height: | Size: 333 KiB |
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 278 KiB After Width: | Height: | Size: 278 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 405 KiB After Width: | Height: | Size: 405 KiB |
BIN
images/13.PCA/应用PCA降维.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 319 KiB After Width: | Height: | Size: 319 KiB |
|
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 153 KiB |
45
src/python/13.PCA/pca.py
Normal file
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/python
|
||||
# coding:utf8
|
||||
|
||||
'''
|
||||
Created on Jun 1, 2011
|
||||
Update on 2017-04-06
|
||||
@author: Peter Harrington/片刻
|
||||
'''
|
||||
print(__doc__)
|
||||
from numpy import *
|
||||
|
||||
|
||||
def loadDataSet(fileName, delim='\t'):
|
||||
fr = open(fileName)
|
||||
stringArr = [line.strip().split(delim) for line in fr.readlines()]
|
||||
datArr = [map(float,line) for line in stringArr]
|
||||
return mat(datArr)
|
||||
|
||||
|
||||
def pca(dataMat, topNfeat=9999999):
|
||||
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[:-(topNfeat+1):-1] #cut off unwanted dimensions
|
||||
redEigVects = eigVects[:,eigValInd] #reorganize eig vects largest to smallest
|
||||
lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions
|
||||
reconMat = (lowDDataMat * redEigVects.T) + meanVals
|
||||
return lowDDataMat, reconMat
|
||||
|
||||
|
||||
def replaceNanWithMean():
|
||||
datMat = loadDataSet('secom.data', ' ')
|
||||
numFeat = shape(datMat)[1]
|
||||
for i in range(numFeat):
|
||||
meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) #values that are not NaN (a number)
|
||||
datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal #set NaN values to mean
|
||||
return datMat
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
dataMat = loadDataSet('data/13.PCA/testSet.txt')
|
||||
lowDmat, reconMat = pca(dataMat, 1)
|
||||
print shape(lowDmat)
|
||||