PCA的想法其实很简单。
目的:投影后的坐标点方差最大(分得最开)
目标问题:
(这里对X要求零均值,不然方差不是这样求
方法:对于目标问题通过拉格朗日乘子法展开,变成求解特征值和特征向量的问题
def PCA(x, n=1):
x = np.asarray(x, np.float32)
mean_data = np.mean(x, axis=0)
x -= mean_data
mat = x.T.dot(x)
eigVects, eigVal, _ = np.linalg.svd(mat)
idx = np.argsort(eigVal)[::-1]
eigVects = eigVects[:, idx]
result = x.dot(eigVects[:, 0:n])
return np.reshape(result, len(x)), mean_data
看下效果
降维前
降维后
搞定,收工~