降维 --PCA(Principal Component Analysis)// np.linalg.eig() 和 np.linal 的比较

PCA(Principal Component Analysis)

原理看这里
这里看实例

import numpy as np


data = np.array([[0.9, 1.0],
                 [2.4, 2.6],
                 [1.2, 1.7],
                 [0.5, 0.7],
                 [0.3, 0.7],
                 [1.8, 1.4],
                 [0.5, 0.6],
                 [0.3, 0.6],
                 [2.5, 2.6],
                 [1.3, 1.1]])
  
# 各元素与平均值的差值 (defferences)
X = data - np.reshape(np.mean(data,axis=0),(-1,data.shape[1]))

# 协方差矩阵(coveriance  matrix )
C = (1/data.shape[0]) * np.dot(X.transpose(),X)

# 特征值(eigenValues)与 特征向量(eigenVectors)
eigenValues, eigenVectors = np.linalg.eigh(C)
print('\neigenValues =', np.round(eigenValues, 2))
print('\neigenVectors =', eigenVectors)

# 取最大特征值对应的特征向量 叫"转换矩阵"
U = (eigenVectors[:, np.argsort(-eigenValues)[0:1]])
print('\nU =', U)

# Principal Component 主成分
PCA = np.dot(X,U).transpose()
print('\nPCA :', PCA)  


# eigenValues = [0.03 1.13]
#
# eigenVectors = [[ 0.68075138 -0.73251454]
#                 [-0.73251454 -0.68075138]]
#
# U = [[-0.73251454]
#      [-0.68075138]]
#
# PCA : [[ 0.40200434 -1.78596968 -0.29427599  0.89923557  1.04573848 -0.5295593 # 0.96731071  1.11381362 -1.85922114  0.04092339]]

np.linalg.eig()np.linalg.eigh() 的比较

这里介绍下用到的提取特征值和特征向量的函数 np.linalg.eig() or np.linalg.eigh()

  • 两者都只能处理是方阵(square array)
  • np.linalg.eigh()适用于对称矩阵,可见矩阵分析中针对对称矩阵的特征值分解有一套特殊的不同于一般矩阵的理论
  • np.linalg.eig() 对求出的特征值(eigenvalue) 排序不太严格,而 np.linalg.eigh() 对特征值按严格的升序

例子

import numpy as np


data = np.array([[0.9, 1.0],
                 [2.4, 2.6],
                 [1.2, 1.7],
                 [0.5, 0.7],
                 [0.3, 0.7],
                 [1.8, 1.4],
                 [0.5, 0.6],
                 [0.3, 0.6],
                 [2.5, 2.6],
                 [1.3, 1.1]])
  

X = data - np.reshape(np.mean(data,axis=0),(-1,data.shape[1]))
C = (1/data.shape[0]) * np.dot(X.transpose(),X)

eigenValues, eigenVectors = np.linalg.eigh(C)
print('\neigenValues =', eigenValues)

w, v = np.linalg.eig(C)
print('\nw =', w)


#eigenValues = [0.0305831 1.1255169]
#w = [1.1255169 0.0305831]
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Enzo 想砸电脑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值