主成分分析PCA

主成分分析(PCA)

维数灾难:

在机器学习领域中,一些关于向量的计算,随着样本维数的增加,计算量会呈指数倍增长,使得我们的计算量会变得很大,这种现象被称为维数灾难。

降维:

降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本。降维也成为应用非常广泛的数据预处理方法。(参见西瓜书)
降维具有如下一些优点:
• 1) 使得数据集更易使用。
• 2) 降低算法的计算开销。
• 3) 去除噪声。
• 4) 使得结果容易理解。

PCA原理:

主成分分析(PCA)是最常用的一种降维方法,PCA的主要思想是将d维特征映射到d’维上,这d’维是全新的正交特征也被称为主成分,是在原有d维特征的基础上重新构造出来的d’维特征。
假定样本进行了中心化,即∑▒x_i =0;再假定投影变换后得到的新坐标系为{w_1,w_2,…,w_d},其中w_i我标准正交基向量,||w_i||2=1,w_i^T w_j=0(i≠j),若丢弃新坐标系中的部分坐标,即将维度降低到d’(d’<d),则样本点x_i在低维坐标系中的投影是z_i=(z_i1;z_i2;…;z_id’),其中z_ij=w_j^T w_x在x_i在低维坐标系下第j维的坐标,若基于z_i来重构x_i,则会得到x_i=∑_(j=1)^d’▒〖z_ij w_j 〗。
考虑整个训练集,原样本点x_i与基于投影重构的样本点x_i之间的距离为:
∑_(i=1)m▒〖||∑_(j=1)(d^’)▒〖z_ij w_j 〗-x_i ||〗_2^2
其中W=(w_1,w_2,…,w_d),我们应该求上式的最小值,考虑到∑▒〖x_i x_i^T 〗是协方差矩阵,有:
min -tr(W^T XX^T W)
s.t. W^T W=I
所以,只需要对协方差矩阵XXT进行特征值分解,将求得的特征值从大到小排序,然后取前d’个特征值所对应的特征向量构成W=(w_1,w_2,…,w_d’),这就是主成分分析的解。
PCA算法的描述如下:
输入:样本集D={x_1,x_2,…,x_m}
低维空间维数为d’。
过程:
1:对样本进行中心化;
2:计算样本的协方差矩阵XX^T;
3:对协方差矩阵XX^T做特征值分解;
4:取最大的d’个特征值所对应的特征向量w_1,w_2,…,w_d’。
输出:投影矩阵W^
=(w_1,w_2,…,w_d’)。

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets


def data_initialize():
    data = datasets.load_iris()
    x = data.data
    y = data.target
    return x, y  # x:(150,4), y:(150,)


def PCA_train(x, d1):
    X = (x.T).dot(x)
    λ, w = np.linalg.eig(X)  # λ为特征值, w为特征向量
    W = w[0: d1, :]  # 取前d1个特征向量
    X1 = W.dot(x.T)
    X1 = X1.T
    return X1


def print_view(x, y):
    x_red, y_red = [], []
    x_blue, y_blue = [], []
    x_green, y_green = [], []
    for i in range(len(y)):
        if y[i] == 0:
            x_red.append(x[i][0])
            y_red.append(x[i][1])
        elif y[i] == 1:
            x_blue.append(x[i][0])
            y_blue.append(x[i][1])
        else:
            x_green.append(x[i][0])
            y_green.append(x[i][1])
    plt.scatter(x_red, y_red, c='r', marker='o')
    plt.scatter(x_blue, y_blue, c='b', marker='D')
    plt.scatter(x_green, y_green, c='g', marker='^')
    plt.show()


if __name__ == '__main__':
    x, y = data_initialize()
    X = PCA_train(x, 2)  # X是PCA分析后的矩阵
    print_view(X, y)


实验结果:

这里使用的是鸢尾花数据集的前两维,便于可视化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值