PCA降维

PCA的思想是将n维特征映射到k维上(k小于n),这k维是全新的正交特征。这k维特征称为主成分,是重新构造出来的k维特征,而不是简单地从n维特征中去除其余n-k维特征。

PCA降维过程:

  1. 数据预处理(均值归一化):
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过程原理)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值