简述
PCA日常使用,但还没有研究过其理论,这让我很好奇。
理论部分
《机器学习》中是这样开始的:
对于正交属性空间的样本点,如何用一个超平面来对所有的样本点进行表达。
- 超平面和半空间是优化领域的两个重要概念
- 简单来说,矩阵方程 W ∗ X + b = 0 W*X+b = 0 W∗X+b=0表示的是超平面, W ∗ X + b ≥ 0 W*X+b \geq 0 W∗X+b≥0表示的就是半空间。
- 显然超平面是直线在高维空间的扩展。(只有这句话是书中的点,其他都是我补充的)
这样的超平面(表达点的超平面),这个**“表达”**的含义,我的理解是:对于点在超平面上的投影Projection。
- 最近重构性:样本点到这个超平面的距离都足够的近;
- 最大可分性:样本点到这个超平面上的投影都足够的分散
优化的矩阵变为
max W t r ( W T X X T W ) s . t . W T W = 1 \max_W{tr(W^TXX^TW)}\\s.t. W^TW=1 Wmaxtr(WTXXTW)s.t.WTW=1
解得(拉格朗日乘子法)
X T X w i = λ i w i X^TXw_i=\lambda_iw_i XTXwi=λiwi
明显 λ \lambda λ是 X T X X^TX XTX的特征值。
算法流程
输入: 样本集
D
=
{
i
=
1
,
.
.
.
,
m
∣
x
i
}
D=\{i=1,...,m| x_i\}
D={i=1,...,m∣xi},低维度空间维数d
过程:
- 对样本进行中心化: x i = x i − 1 m ∑ i m x i x_i = x_i -\frac{1}{m}\sum_i^m{x_i} xi=xi−m1∑imxi
- 计算协方差矩阵 X T X X^TX XTX
- 计算协方差矩阵 X T X X^TX XTX的特征向量,同时按照特征值进行排序
- 返回特征值最大的前d个向量作为投影矩阵
- 用投影矩阵来转换所有节点
Python实现
- 导入数据
from sklearn import datasets
iris = datasets.load_iris()
- 用sklearn版本的PCA
from sklearn.decomposition import PCA
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
X_reduced = PCA(n_components=2).fit_transform(iris.data)
kmeans = KMeans(n_clusters=3).fit(X_reduced)
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=kmeans.labels_, cmap=plt.cm.Set1)
- 自己实现PCA
import numpy as np
def pca(X, d):
# Centralization
means = np.mean(X, 0)
X = X - means
# Covariance Matrix
covM = np.dot(X.T, X)
eigval, eigvec = np.linalg.eig(covM)
indexes = np.argsort(eigval)[-d:]
W = eigvec[:, indexes]
return np.dot(X, W)
- 用自己的pca跑一下
X_pca = pca(iris.data, 2)
kmeans = KMeans(n_clusters=3).fit(X_pca)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=kmeans.labels_, cmap=plt.cm.Set1)
- 自己跑的效果图(就是跟上面的在横纵轴上发生了颠倒而已)完全一致~