ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

手写PCA主成分分析

2021-05-22 11:03:21  阅读:156  来源: 互联网

标签:return initial 成分 dot np 手写 PCA 100 def


介绍

主成分分析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

标签:return,initial,成分,dot,np,手写,PCA,100,def
来源: https://www.cnblogs.com/shanfeng606/p/14798318.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有