[机器学习实战] PCA的python3实现

# -*- coding: utf-8 -*-
"""
Created on Sun Dec 15 20:47:18 2019

@author: buu
"""
import numpy as np
import matplotlib.pyplot as plt


def loadDataSet(filename, delim='\t'):
    datArr = []
    with open(filename, 'r') as f:
        stringArr = [line.strip().split(delim)
                     for line in f.readlines()]  # list,包含小 list,小 list 长度为2
        for line in stringArr:
            temp = []
            for item in line:
                temp.append(float(item))
            datArr.append(temp)
    return np.mat(datArr)


def pca(dataMat, topNfeat=9999999):
    '''
    函数说明:
        
    参数说明:
        dataMat: matrix, 数据集
        topNfeat: 可选参数,应用的 N 个特征,若不指定该值,函数会返回前9999999个特征,
                  或原始数据中全部的特征
    函数返回:
        lowDDataMat: 压缩后的矩阵
           reconMat: 反构出的原始数据
    '''
    meanVals = np.mean(dataMat, axis=0) # 按列方向求均值
    meanRemoved = dataMat-meanVals  # 去平均值,即对所有样本去中心化
    covMat = np.cov(meanRemoved, rowvar=0) # 求协方差阵=X*X.T
    # cov(x,0)=cov(x),除数 n-1 是为了得到协方差的无偏估计
    # cov(x,1),除数是 n
    eigVals, eigVects = np.linalg.eig(np.mat(covMat)) # 获得特征值和特征向量
    eigValInd = np.argsort(eigVals) # 将特征值进行从小到大的排序,获得原来的索引值
    eigValInd = eigValInd[:-(topNfeat+1):-1] # 将获得的索引值逆序排列,即最大元素的索引值排在第一位
    redEigVects = eigVects[:, eigValInd] # 根据索引找回需要的特征向量
    lowDDataMat = meanRemoved*redEigVects # 将数据集转换到新的空间, 特征向量 * 数据集
    reconMat = (lowDDataMat*redEigVects.transpose())+meanVals# 利用降维后的矩阵反构出原始矩阵,用来测试,可以和未压缩的矩阵比较
    return lowDDataMat, reconMat 

def plot():
    filename = r'..\machinelearninginaction\Ch13\testSet.txt'
    dataMat = loadDataSet(filename)  # type: matrix
    fig=plt.figure()
    ax=fig.add_subplot(111)
    ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
    lowDMat,reconMat=pca(dataMat,1)
    ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
#    ax.scatter(lowDMat[:,0].flatten().A[0],np.zeros(len(lowDMat)),marker='^',s=90)
    plt.show()
    
    

if __name__ == '__main__':
    plot()

result1:
[机器学习实战] PCA的python3实现_第1张图片
result2:
[机器学习实战] PCA的python3实现_第2张图片
end

你可能感兴趣的:(机器学习实战)