PCA(主成份分析)简单原理分析及实现

原理

下面以 从4维降到2维 为例:
如果有一组n个样本的数据,

身高体重变量3变量4
x0y0z0w0
x1y1z1w1
x_(n-1)y_(n-1)z_(n-1)w_(n-1)

那么可以用一个矩阵表示这组数据 ,为了方便,我们转置一下:
在这里插入图片描述
我们的目标是把它降成2维。为什么要降维呢?我们知道,如果数据是一维,我们可以在数轴上标出来,如果数据是二维的,我们可以在平面上画出来,如果是三维以上,就不太好表示了,为了展现数据,我们需要降维。还有另外一个重要的原因是,有些额外的数据可能会影响对建模造成干扰,我们并不需要。以下是我们希望得到的结果:它代表了原数据在两个主要轴向上的信息。
在这里插入图片描述
显然要找到一个变换矩阵W,使得:
在这里插入图片描述
下面介绍怎么求这个W矩阵。至于为什么那么求,百度有详细的解释,这里不作介绍。

第一步:是把数据中心化(即让每个维度的均值为0),如下图:
在这里插入图片描述
第二步,计算协方差矩阵
在这里插入图片描述
因为1/n 对结果没有影响,因此令
在这里插入图片描述
第三步:求协方差矩阵的特征值矩阵。
特征值矩阵就是特征向量构成的矩阵,这里不演示如何求特征值及特征向。
在这里插入图片描述
至此,就把需要的变换矩阵求出来了。

示例

以著名的iris数据集为例:

在这里插入图片描述

代码:

import numpy as np;
import pandas as pd;
import matplotlib.pyplot as plt;

df = pd.read_excel("iris.xlsx", header = None);
df2 = df.drop(4, axis = 1);

array = df2.to_numpy();

#中心化
array = array.T;
(rows, cols) = array.shape;
for row in range(rows):
    array[row] -= (np.sum(array[row]) / cols)

#求协方差矩阵
A = array.dot(array.T);

#求特征值
value,vector =  np.linalg.eig(A);

#得到降维的新矩阵
array_new = (vector.T)[0:2,:].dot(array);

#画图
plt.scatter(array_new[0], array_new[1], c = pd.Categorical(df[4]).codes);
plt.show();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值