手写PCA主成分分析
Posted 山峰606
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写PCA主成分分析相关的知识,希望对你有一定的参考价值。
介绍
主成分分析PCA(Principal Component Analysis)
- 一个非监督学习的机器学习算法
- 主要用于数据的降维
- 通过降维,可以发现更便于人类理解的特征
- 其他应用:可视化,去噪
源码
import numpy as np
import matplotlib.pyplot as plt
#创建样例
X=np.empty((100,2))
X[:,0]=np.random.uniform(0.,100.,size=100)
X[:,1]=0.75*X[:,0]+3+np.random.normal(0,10,size=100)
#对样例进行均值归零
def demean(X):
return X-np.mean(X,axis=0)
X=demean(X)
#求第一主成分
#目标函数
def f(w,X):
return np.sum((X.dot(w)**2))/len(X)
#目标函数求导
def df(w,X):
return X.T.dot(X.dot(w))*2/len(X)
#转换为单位的方向向量
def direction(w):
return w/np.linalg.norm(w)
def first_component(X,initial_w,eta,n_iters=1e4,epsilon=1e-8):
w=direction(initial_w)
cur_iter=0
while cur_iter<n_iters:
gradient=df(w,X)
last_w=w
w=w+eta*gradient
w=direction(w) #每次求一个单位方向
if(abs(f(w,X)-f(last_w,X))<epsilon):
break
cur_iter+=1
return w
#求n个主成分——每次去除上一次主成分的分量 再调用求解第一主成分的函数
def first_n_components(n,X,eta=0.01,n_iters=1e4,epsilon=1e-8):
X_pca=X.copy()
X_pca=demean(X_pca)
res=[]
for i in range(n):
initial_w=np.random.random(X.shape[1])
w=first_component(X,initial_w,eta) #每次随机生成一个w,通过梯度下降法逐渐调整这个w,直到满足epsilon的要求
res.append(w)
X_pca=X_pca-X_pca.dot(w).reshape(-1,1)*w #去除上次主成分的分量
return res
以上是关于手写PCA主成分分析的主要内容,如果未能解决你的问题,请参考以下文章