对数据进行简化的原因:

① 使得数据集更容易使用

② 降低许多算法的计算开销

③ 去除噪声

④ 使得结果易懂

方差是衡量数据源和期望值相差的度量值。

PCA:数据从原来的坐标系转换到新的坐标系,新坐标系是有数据本身决定的。

因子分析:假设观察数据的生成中有一些观察不到的隐变量,假设观察数据是这些隐变量和某些财政所呢个的线性组合。

独立成分分析(ICA):假设数据是从N个数据源生成的,如果数据源的数目小于观察数据的数目,则可以实现降维过程。

通过PCA进行降维处理,我们可以同时获得SVM和决策树的优点:一方面得到了和决策树一样简单的分类器,同时分类间隔和SVM一样好。

#coding:utf-8
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):
	#第一个参数:进行PCA操作的数据集,第二个参数:应用的N个特征
    meanVals = mean(dataMat, axis=0)   #求取均值 ,axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
    meanRemoved = dataMat - meanVals   
    covMat = cov(meanRemoved, rowvar=0) # 求协方差矩阵
    eigVals,eigVects = linalg.eig(mat(covMat)) #求矩阵的特征值和特征向量,特征值保存在eigVals中,特征向量保存在eigVects中
    eigValInd = argsort(eigVals)  #argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到eigValInd。
    eigValInd = eigValInd[:-(topNfeat+1):-1]  
    redEigVects = eigVects[:,eigValInd]      #从小到大最N个值进行排序
    lowDDataMat = meanRemoved * redEigVects#将数据转换到新空间
    reconMat = (lowDDataMat * redEigVects.T) + meanVals 
    return lowDDataMat, reconMat
#将NaN替换成平均值得函数
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)
		#nonzeros(a)返回数组a中值不为零的元素的下标,它的返回值是一个长度为a.ndim(数组a的轴数)的元组
        datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal  #set NaN values to mean
    return datMat