PCA的思想是将n维特征映射到k维上(k小于n),这k维是全新的正交特征。这k维特征称为主成分,是重新构造出来的k维特征,而不是简单地从n维特征中去除其余n-k维特征。
PCA降维过程:
- 数据预处理(均值归一化):
import numpy as np
from matplotlib import pyplot as plt
from sklearn.decomposition import pca
from sklearn.preprocessing import StandardScaler #(归一化)
#归一化
def featureNormalize(X):
'''(每一个数据-当前列的均值)/当前列的标准差'''
n = X.shape[1]
mu = np.zeros((1,n));
sigma = np.zeros((1,n))
mu = np.mean(X,axis=0)
sigma = np.std(X,axis=0)
for i in range(n):
X[:,i] = (X[:,i]-mu[i])/sigma[i]
return X,mu,sigma
X_norm,mu,sigma = featureNormalize(X) #X为原始数据
2.计算协方差矩阵Σ
Sigma = np.dot(np.transpose(X_norm),X_norm)/m # 求Sigma
3.计算Σ的特征值和特征向量
可以是用svd奇异值分解函数:U,S,V = svd(Σ)
svd函数求出的S是按特征值降序排列的,若不是使用svd,需要按特征值大小重新排列U
U,S,V = svd(Sigma)
4.降维
选取U中的前K列(假设要降为K维)
Ureduce = U[:,0:k]
Z = Ureduce'*x
用python自带的函数代码:
'''归一化数据'''
scaler=StandardScaler()
scaler.fit(X)
x_train=scaler.transform(X)
'''拟合数据'''
K=1 #要降的维度
model=pca.PCA(n_components=K).fit(x_train) # 拟合数据,n_components定义要降的维度
Z=model.transform(x_train) #transform就会执行降为操作
降维维度选择
PCA是用于对数据做降维的,我们一般用PCA把m维的数据降到k维(k < m)。
那么问题来了,k取值多少才合适呢?【1】
原始点与投影点之间的距离之和,而误差越小,说明降维后的数据越能完整表示降维前的数据。如果这个误差小于0.01,说明降维后的数据能保留99%的信息。
#用sklearn封装的PCA方法,做PCA的代码如下。PCA方法参数n_components,如果设置为整数,则n_components=k。如果将其设置为小数,则说明降维后的数据能保留的信息。
from sklearn.decomposition import PCA
import numpy as np
from sklearn.preprocessing import StandardScaler
x=np.array([[10001,2,55], [16020,4,11], [12008,6,33], [13131,8,22]])
# feature normalization (feature scaling)
X_scaler = StandardScaler()
x = X_scaler.fit_transform(x)
# PCA
pca = PCA(n_components=0.9)# 保证降维后的数据保持90%的信息
pca.fit(x)
pca.transform(x)
#所以在实际使用PCA时,我们不需要选择k,而是直接设置n_components为float数据。
建议:
1.不要使用PCA去解决过拟合问题overfitting,还是使用正则化方法
2.只有在原始数据上有好的结果,但是运行很慢,才考虑用PCA
1.http://blog.csdn.net/ybdesire/article/details/64546435 (PCA主成分数量(降维维度)选择 )
2.http://blog.csdn.net/u013082989/article/details/53792010(PCA过程原理)