mirror of
https://github.com/apachecn/ailearning.git
synced 2026-05-09 15:52:33 +08:00
新建images和data文件夹
This commit is contained in:
1000
data/13.PCA/testSet.txt
Executable file
1000
data/13.PCA/testSet.txt
Executable file
File diff suppressed because it is too large
Load Diff
@@ -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个特征向量而将它转换到新的空间。
|
||||
* 例如下图:
|
||||
* 
|
||||
|
||||
|
||||
45
src/python/13.PCA/pca.py
Normal file
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)
|
||||
Reference in New Issue
Block a user