#机器学习笔记#PCA降维

PCA:
可以对原数据进行简化,并且有效的找出数据中最“主要”的元素和结构,去除噪声和冗余,将原有的复杂数据降维。具有简单且无参数限制的优点,可以利用在各个场合

步骤:
1、读取绿萝的数据,将txt文件的内容转化成23073x6的矩阵形式保存在Data中。
2、对样本进行中心化操作
3、得到新的数据,求协方差矩阵:
4、计算协方差矩阵的特征值和特征向量
5、对特征值进行排序并保留需要的N个主元(特征向量)
6、计算Y=PX:将数据映射到上述选取的N个主元构建的新空间中

例题:
根据已知的PCA方法对给定数据进行处理,设计算法并编写程序,实验结果包括两个部分,第一部分是由第1、2主元形成的二维点分布图(MATLAB);第二部分是由第1、2、4主元形成的三维点分布图(MATLAB),并对两幅图进行多角度展示和截图。

代码:

from numpy import *

import matplotlib
import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import style

#1、读取数据并转为矩阵模式
def loadData(fileName):
    plants = open(fileName)
    plantsArr = [line.strip().split() for line in plants.readlines()] #分割遍历
    finalArr = [list(map(float,line)) for line in plantsArr]
    print(mat(finalArr))
    return mat(finalArr)
#print(loadData('PointsNormals绿萝.txt'))
#2、定义PCA
def pca(finalMat):
    avgVals = mean(finalMat,axis=0) #求均值
    argRemoved = finalMat - avgVals #去中心化
    covMat = cov(argRemoved,rowvar=0) #协方差矩阵
    eigVals,eigVects = linalg.eig(mat(covMat)) #特征值,特征向量
    eigValind = argsort(eigVals) #排序,默认从小到大
    #print(eigValind)
    eigValind1 = eigValind[:-3 :-1] #取前两个特征值得索引值
    #print(eigValind1)
    eigValind2 = [eigValind[5],eigValind[4],eigValind[2]] #取1、2、4索引值
    #print(eigValind2)
    newEigVects1 = eigVects [:,eigValind1] #取1,2主元
    newEigVects2 = eigVects[:,eigValind2] #取1、2、4主元
    newDataMat1 = argRemoved*newEigVects1 #降维
    newDataMat2 = argRemoved*newEigVects2 #降维
    return newDataMat1,newDataMat2

#3、画图
#二维图像绘制
def panting_2D(newDataMat1):
    newDataMat = array(newDataMat1)
    print(newDataMat)
    n1 = shape(newDataMat)[0]           #获取样本的个数
    x_cord1 = []
    y_cord1 = []
    for i in range(n1):
        x_cord1.append(newDataMat[i][0])
        y_cord1.append(newDataMat[i][1])
    plt.scatter(x_cord1,y_cord1,s=0.1,c= 'blue',marker = '^')
    plt.title('PCA_2D')
    plt.show()
def panting_3D(newDataMat2):
    style.use('ggplot')
    fig = plt.figure()
    ax1 = fig.add_subplot(111,projection = '3d') #添加3d子图
    newDataMat2 = array(newDataMat2)
    n2 = shape(newDataMat2)[0]
    x_cord2 = []
    y_cord2 = []
    z_cord2 = []
    for i in range (n2):
        x_cord2.append(newDataMat2[i,0])
        y_cord2.append(newDataMat2[i,1])
        z_cord2.append(newDataMat2[i,2])
    ax1.scatter(x_cord2,y_cord2,z_cord2,s=0.1,c='g',marker='o')
    ax1.set_xlabel('x axis')
    ax1.set_ylabel('y axis')
    ax1.set_zlabel('z axis')
    plt.title('PCA-3D')
    plt.show()


t=loadData('PointsNormals绿萝.txt')
m,n = pca(t)
panting_2D(m)
panting_3D(n)

在这里插入图片描述
在这里插入图片描述
参考链接:https://wenku.baidu.com/view/a034b8343a3567ec102de2bd960590c69ec3d8b7.html?re=view

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的小白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值