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()

  • 相关阅读:
    Redis 和 Memcached 的区别
    缓存详解
    HTTP常见状态码
    ORM的概念, ORM到底是什么
    remote: Unauthorized fatal: Authentication failed for...
    TR、FN、FP、FN
    <笔记>ue破解
    <笔记>bmp图片数据格式
    三轴加速度数据处理
    智能手环+三轴加速度传感器总结
  • 原文地址:https://www.cnblogs.com/qw12/p/6086659.html
Copyright © 2011-2022 走看看