机器学习16:主成分分析

主成分分析

原理
降维分析
找到数据最重要的方向(方差最大的方向)

PCA算法流程

1.数据预处理:中心化𝑋 − 𝑋ത。
2.求样本的协方差矩阵1m 𝑋𝑋𝑇。
3.对协方差1m 𝑋𝑋𝑇矩阵做特征值分解。
4.选出最大的k个特征值对应的k个特征向量。
5.将原始数据投影到选取的特征向量上。
6.输出投影后的数据集。

通过数据集的协方差矩阵及其特征值分析,我们可以得到协方差矩阵的特征向量和特征值。我们需要保留k个维度的特征就选取最大的k个特征值

算法实现

import numpy as np
import matplotlib.pyplot as plt
# 载入数据
data = np.genfromtxt("data.csv", delimiter=",")
x_data = data[:,0]
y_data = data[:,1]
plt.scatter(x_data,y_data)
plt.show()
print(x_data.shape)

在这里插入图片描述

# 数据中心化
def zeroMean(dataMat):
    # 按列求平均,即各个特征的平均
    meanVal = np.mean(dataMat, axis=0) 
    newData = dataMat - meanVal
    return newData, meanVal

newData,meanVal=zeroMean(data)  
# np.cov用于求协方差矩阵,参数rowvar=0说明数据一行代表一个样本
covMat = np.cov(newData, rowvar=0)

# 协方差矩阵
print(covMat)

[[ 94.99190951 125.62024804]
[125.62024804 277.49520751]]

# np.linalg.eig求矩阵的特征值和特征向量
eigVals, eigVects = np.linalg.eig(np.mat(covMat))
# 特征值
print(eigVals)

[ 30.97826888 341.50884814]

# 特征向量
print(eigVects)

[[-0.89098665 -0.45402951]
[ 0.45402951 -0.89098665]]

# 对特征值从小到大排序
eigValIndice = np.argsort(eigVals)
print(eigValIndice)

[0 1]

top = 1
# 最大的n个特征值的下标  降到多少维就选取多少个特征值
n_eigValIndice = eigValIndice[-1:-(top+1):-1]   #:-1代表从后往前取数
print(n_eigValIndice)

[1]

# 最大的n个特征值对应的特征向量
n_eigVect = eigVects[:,n_eigValIndice]
print(n_eigVect)

[[-0.45402951]
[-0.89098665]]

# 低维特征空间的数据
lowDDataMat = newData*n_eigVect
print(lowDDataMat[:5,:])

[[ 44.02694787]
[ 1.49722533]
[ 3.35564513]
[ 1.73205523]
[-17.84406034]]

# 利用低纬度数据来重构数据
reconMat = (lowDDataMat*n_eigVect.T) + meanVal
print(reconMat[:5,:])

[[28.96880808 33.50762783]
[48.27855698 71.40104277]
[47.43477956 69.74521555]
[48.17193728 71.19181247]
[57.06007136 88.63387007]]

# 载入数据
data = np.genfromtxt("data.csv", delimiter=",")
x_data = data[:,0]
y_data = data[:,1]
plt.scatter(x_data,y_data)

# 重构的数据
x_data = np.array(reconMat)[:,0]
y_data = np.array(reconMat)[:,1]
plt.scatter(x_data,y_data,c='r')
plt.show()

plt.show()

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值