新建images和data文件夹

This commit is contained in:
jiangzhonglian
2017-04-06 16:08:12 +08:00
parent d24f3ad9e5
commit a329d5cdaa
3 changed files with 1050 additions and 1 deletions

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

File diff suppressed because it is too large Load Diff

View File

@@ -24,7 +24,7 @@
* `例如: 考察一个人的智力情况,就直接看数学成绩就行(存在:数学、语文、英语成绩)`
* a.将数据从原来的坐标系转换到了新的坐标系,新的坐标系的选择是由数据本身决定的。
* b.第一个新坐标轴选择的是原始数据中`方差最大`的方向
* c.第二个新坐标轴的选择和第一个坐标轴`正交(orthogonal)`且具有`最大方差`的方向。
* c.第二个新坐标轴的选择和第一个坐标轴`正交(orthogonal 如果是二维空间就叫垂直)`且具有`最大方差`的方向。
* d.该过程一直重复,重复次数为原始数据中特征的数目。
* 我们会发现,大部分方差都包含在最前面的几个新坐标轴中。因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理。
* 2) 因子分析(Factor Analysis)
@@ -53,6 +53,10 @@
> 通过PCA进行降维处理我们就可以同时获得SVM和决策树的优点
* 一方面得到了和决策树一样简单的分类器同时分类间隔和SVM一样好。
* 1.第一个主成分就是来自于数据差异性最大(即 方差最大)的方向提取出来
* 2.第二个主成分就是来自于数据差异性次大的方向,并且该方向于第一个主成分方向正交。
* 3.通过数据集的协方差矩阵及其特征值分析,我们就可以得到这些主成分的值。
* 一旦得到了协方差矩阵的特征向量我们就可以保留最大的N个值。这些特征向量也给出了N个最重要特征的真实结构。我们可以通过将数据乘上这N个特征向量而将它转换到新的空间。
* 例如下图:
* ![应用PCA降维](/images/13.PCA/应用PCA降维.png)

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)