zoukankan      html  css  js  c++  java
  • 主成分分析(PCA)

    主成分分析(principal component analysis)是一种常见的数据降维方法,其目的是在“信息”损失较小的前提下,将高维的数据转换到低维,从而减小计算量。
    PCA的本质就是找一些投影方向,使得数据在这些投影方向上的方差最大,而且这些投影方向是相互正交的。

    使用拉格朗日方程来求解该最大化问题,则:

    对U求导:

    令导数为0,可知u就是Σ的特征向量。这个最大化问题的解就是矩阵特征向量。

    协方差矩阵最大的特征值对应的特征向量就是样本方差最大的方向。

    进行PCA 算法之前,数据一般都需要预处理。预处理步骤如下:

     1 #coding:utf8
     2 import numpy as np
     3 import matplotlib.pyplot as plt
     4 
     5 def pca(data,dim=1,normalise=0):
     6     u = np.mean(data)
     7     data -= u  # 预处理1,2
     8     C = np.cov(data.T)
     9     evals,evecs = np.linalg.eig(C)
    10     indices = np.argsort(evals)[::-1]   # 特征值序号,大小升序
    11     indices=indices[:dim]
    12     evecs = evecs[:,indices]
    13     if normalise:   # 归一化,处于同一尺度可忽略,预处理3,4
    14         for i in range(np.shape(evecs)[1]):
    15             evecs[:,i] / np.linalg.norm(evecs[:,i]) * np.sqrt(evals[i])
    16     x = np.dot(evecs.T,np.transpose(data))
    17     y=np.dot(evecs,x).T+u
    18     return x,y,evals,evecs
    19 
    20 x = np.random.normal(5,.5,1000)
    21 y = np.random.normal(3,1,1000)
    22 a = x*np.cos(np.pi/4) + y*np.sin(np.pi/4)
    23 b = -x*np.sin(np.pi/4) + y*np.cos(np.pi/4)
    24 plt.plot(a,b,'.')
    25 plt.xlabel('x')
    26 plt.ylabel('y')
    27 plt.title('raw dataset')
    28 data=np.mat(zip(a,b))
    29 x,y,evals,evecs = pca(data,1)
    30 plt.figure()
    31 plt.plot(y[:,0],y[:,1],'.')
    32 plt.xlabel('x')
    33 plt.ylabel('y')
    34 plt.title('new dataset')
    35 plt.show()

  • 相关阅读:
    钱多多软件制作04
    团队项目01应用场景
    HDU 4411 arrest
    HDU 4406 GPA
    HDU 3315 My Brute
    HDU 3667 Transportation
    HDU 2676 Matrix
    欧拉回路三水题 POJ 1041 POJ 2230 POJ 1386
    SPOJ 371 BOXES
    POJ 3422 Kaka's Matrix Travels
  • 原文地址:https://www.cnblogs.com/qw12/p/6086659.html
Copyright © 2011-2022 走看看