手写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主成分分析的主要内容,如果未能解决你的问题,请参考以下文章

[python机器学习及实践]Sklearn实现主成分分析(PCA)

十一.PCA案例分析及小结

PCA主成分分析 原理讲解 python代码实现

R语言 | 主成分分析(PCA)代码+讲解

PCL:主成分分析(PCA)原理与实现

主成分分析PCA