PYTHON机器学习实战——PCA主成分分析 数据降维_(datmat[ ,i]

#-*- coding:utf-8 -*-
#!/usr/bin/python
'''
主成份分析  principal component analysis  PCA
先求解 协方差矩阵
再求解 协方差举矩阵的特征值和特征向量
'''
# 测试程序
# import pca  pca.pca_test()
# import pca  pca.secomTest()
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)# 转换成 numpy 下的数组mat类型

def pca(dataMat, topNfeat=9999999):
    meanVals = mean(dataMat, axis=0) # 每个样本的平均值 一行
    meanRemoved = dataMat - meanVals # 减去平均值
    covMat = cov(meanRemoved, rowvar=0)# 计算协方差矩阵
    eigVals,eigVects = linalg.eig(mat(covMat))# 计算协方差矩阵的特征值 和特征向量
    eigValInd = argsort(eigVals)              # 特征值从小到大排列
    eigValInd = eigValInd[:-(topNfeat+1):-1]  # 前 topNfeat 个较大的特征值对应的 排序下标
    redEigVects = eigVects[:,eigValInd]       # 逆序排列得到前   topNfeat 个特征向量
    lowDDataMat = meanRemoved * redEigVects   # 将原去均值花后的数据 乘以 特征向量 转换到新 坐标空间
    reconMat = (lowDDataMat * redEigVects.T) + meanVals#按照逆转换 到原来的 空间数据
    return lowDDataMat, reconMat # 降维后的数据,以及还原后的主成分数据

# 测试
def pca_test(file_name='testSet.txt'):
    import matplotlib
    import matplotlib.pyplot as plot
    datMat = loadDataSet(file_name)
    lowDMat, reconMat  = pca(datMat, 1)# 降维成1维矩阵  前一个主成份
    print "原数据维度: "
    print shape(datMat)
    print "降维后数据维度: "
    print shape(lowDMat)
    fig = plot.figure()
    ax = fig.add_subplot(111)
    ax.scatter(datMat[:,0].flatten().A[0], datMat[:,1].flatten().A[0],marker="^",s=90)
    ax.scatter(reconMat[:,0].flatten().A[0], reconMat[:,1].flatten().A[0],marker="o",s=50,c='red')
    plot.show()

# 处理缺失值  用均值代替
def replaceNanWithMean(): 
    datMat = loadDataSet('secom.data', ' ') #半导体数据
    numFeat = shape(datMat)[1]# 样本 的特征 维度


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210511152217670.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poaWd1aWd1,size_16,color_FFFFFF,t_70)

**感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:**



① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值