This commit is contained in:
hello19883
2017-04-06 20:05:34 +08:00
17 changed files with 1121 additions and 12 deletions

1000
data/13.PCA/testSet.txt Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -18,7 +18,7 @@
* 在分类算法中目标变量的类型通常是标称型的,而在回归算法中通常是连续型的。
* 机器学习的训练过程
* ![机器学习训练过程图](./1.机器学习基础训练过程.png)
* ![机器学习训练过程图](/images/1.MLFoundation/机器学习基础训练过程.png)
* 监督学习
* 必须知道预测什么,即必须知道目标变量的分类信息。分类和回归属于监督学习。
@@ -43,7 +43,7 @@
* 想要完成何种任务,比如是预测明天下雨的概率还是对投票者按照兴趣分组;如果想要预测目标变量的值,则可以选择监督学习算法,否则可以选择无监督学习算法。
* 需要分析或收集的数据是什么
* 举例
* ![选择算法图](./1.机器学习基础-选择算法.png)
* ![选择算法图](/images/1.MLFoundation/机器学习基础-选择算法.png)
* 开发的步骤
* 1.收集数据

View File

@@ -14,7 +14,7 @@
* 2.关联规则(association rules): 暗示两种物品之间可能存在很强的关系
* 总结:首先需要找到频繁项集,才能找到关联规则。
* 如下图:
* ![交易清单](./11.交易清单.png)
* ![交易清单](/images/11.Apriori/交易清单.png)
* 支持度(support)
* 数据集中包含该项集的记录所占的比例
* 例如上图中:{豆奶}的支持度=4/5 {豆奶,尿布}的支持度=3/5
@@ -36,10 +36,10 @@
* 如果某个项集是频繁的,那么它的所有子集也是频繁的,反之,一个项集是非频繁的,那么它的所有超集也是非频繁的。
* 例如: 我们假设知道{2, 3}是非频繁项,那么{0, 2, 3}, {1, 2, 3}, {0, 1, 2, 3}都是非频繁项。
* 如下图:
* ![非频繁项集](./11.非频繁项集.png)
* ![非频繁项集](/images/11.Apriori/非频繁项集.png)
* 分级法: 频繁项集->关联规则
* 1.首先从一个频繁项集开始,接着创建一个规则列表,其中规则右部分只包含一个元素,然后对这个规则进行测试。
* 2.接下来合并所有剩余规则来创建一个新的规则列表,其中规则右部包含两个元素。
* 如下图:
* ![所有可能的项集组合](./11.所有可能的项集组合.png)
* ![所有可能的项集组合](/images/11.Apriori/所有可能的项集组合.png)
* 最后: 每次增加频繁项集的大小Apriori算法都会重新扫描整个数据集是否有优化空间呢 下一章FP-growth算法等着你的到来

View File

@@ -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个特征向量而将它转换到新的空间。
* 例如下图:
* ![应用PCA降维](/images/13.PCA/应用PCA降维.png)
## 3 对半导体数据进行降维处理

View File

@@ -24,4 +24,4 @@
* 基尼不纯度(Gini impurity) [本书不做过多的介绍]
* 简单来说:就是从一个数据集中随机选取子项,度量其被错误分类到其他分组里的概率。
* 流程介绍图
* ![决策树流程介绍图](./3.决策树流程介绍图.jpg)
* ![决策树流程介绍图](/images/3.DecisionTree/决策树流程介绍图.jpg)

View File

@@ -32,18 +32,18 @@
* 单层决策树(decision stump, 也称决策树桩)是一种简单的决策树。
* 过拟合(overfitting, 也称为过学习)
* 发现测试错误率在达到一个最小值之后有开始上升,这种现象称为过拟合。
* ![过拟合](./7.过拟合.png)
* ![过拟合](/images/7.AdaBoost/过拟合.png)
* 非均衡分类问题
* 现象:
* 判断马是否能继续生存
* 过滤垃圾邮件
* ROC曲线: 最佳的分类器应该尽可能地处于左上角
* ![ROC曲线](./7.ROC曲线.png)
* ![ROC曲线](/images/7.AdaBoost/ROC曲线.png)
* 对不同的ROC曲线进行比较的一个指标是曲线下的面积(Area Unser the Curve, AUC).
* AUC给出的是分类器的平均性能值当然它并不能完全代替对整条曲线的观察。
* 一个完美分类器的AUC为1而随机猜测的AUC则为0.5。
* 基于代价函数的分类器决策控制:`TP*(-5)+FN*1+FP*50+TN*0`
* ![代价函数](./7.代价函数.png)
* ![代价函数](/images/7.AdaBoost/代价函数.png)
* 欠抽样(undersampling)或者过抽样(oversampling)
* 欠抽样: 意味着删除样例
* 过抽样: 意味着复制样例(重复使用)

View File

Before

Width:  |  Height:  |  Size: 333 KiB

After

Width:  |  Height:  |  Size: 333 KiB

View File

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 132 KiB

View File

Before

Width:  |  Height:  |  Size: 278 KiB

After

Width:  |  Height:  |  Size: 278 KiB

View File

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 126 KiB

View File

Before

Width:  |  Height:  |  Size: 405 KiB

After

Width:  |  Height:  |  Size: 405 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

Before

Width:  |  Height:  |  Size: 319 KiB

After

Width:  |  Height:  |  Size: 319 KiB

View File

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 130 KiB

View File

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 153 KiB

45
src/python/13.PCA/pca.py Normal file
View 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)