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]