PCA原理

主成分分析(principal component analysis,PCA)是一种数据分析方法,出发点是从一组特征中计算出一组按重要性从大到小排列的新特征,它们是原有特征的线性组合,并且相互之间是不相关的。主要用来数据降维、可视化、去噪等。
以样本数据有两个特征为例,如图:

在这里插入图片描述

利用梯度上升法求解主成分

现在来看主成分的一种求解方法。
将样本集如下表示成mxn矩阵:

import numpy as np
import matplotlib.pyplot as plt

创建样本集:

X = np.empty((100,2))
X[:,0] = np.random.uniform(0,10,size=100)
X[:,1] = 3*X[:,0]+2+np.random.normal(0,1,size=100)
m = 100#样本数

初始样本集如图:

在这里插入图片描述

定义归零函数并将样本集归零:

def Zero(X):
    return X-X.mean(axis=0)
X = Zero(X)

归零后的样本集如图:

在这里插入图片描述

定义归一函数,初始化w:

def One(w):
    return w/np.linalg.norm(w)
w = One(np.ones((2,1)))

定义方差函数:

def Var(X,w):
    return (1/m-1)*np.sum(np.dot(X,w)**2)

下面进入梯度上升法循环:

alpha = 0.1#学习步长
#进入循环:
t = 0#循环次数
while t<1000:
    nabla = (2/m-1)*np.dot(X.T,np.dot(X,w))#梯度
    w0 = w#保存上次循环w值
    w += alpha*nabla#更新w
    w = One(w)#归一
    if np.abs(Var(X,w)-Var(X,w0))<0.001:#如果更新后的w使得方差变化不明显,退出循环
        break
    t += 1#更新循环次数

得出结果如图:

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt

#创建样本集:
X = np.random.uniform(0,10,size=100)
Y = 3*X+2+np.random.normal(0,1,size=100)
m = 100#样本数

#定义归零函数并将样本集归零:
def Zero(X):
    return X-X.mean(axis=0)
X = Zero(X)
Y = Zero(Y)

#协方差矩阵:
S = np.cov(X,Y)

#特征值与特征向量:
l,W = np.linalg.eig(S)#l为特征值集合,W为特征向量集合(W的列向量表示每个特征向量)
n = np.argmax(l)#取将l排序后最大值的下标
w = W.T[n]#第一主成分的向量
print(w)
print(l[n]/np.sum(l))
'''
#可视化:
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

x = np.arange(-5,5,0.01)
y = w[1]*x/w[0]
plt.plot(x,y,c='r')
plt.text(1,0,'主成分(新特征)',c='r',fontsize=16)
plt.scatter(X,Y,c='lightskyblue')
plt.xlabel('原特征1')
plt.ylabel('原特征2')
plt.title('显示主成分')
plt.grid()
plt.show()
'''