机器学习基础——PCA主成分分析算法

  • Post author:
  • Post category:其他



1.背景

PCA算法主要用于降维,将高维的特征映射到低维的空间中。假设,我没有20个数据,每个数据特征100维,即(20,100)。通过降维,我们可以将100维的特征降到10维,即(20,10)这样就大大减小了计算量。

一般,降维后的特征数不超过样本数


2.最大方差理论

信号处理中,认为信号的是高方差的,噪声是低方差的,信噪比就是信号和噪声的反差比,越大越好。我们降维到k个特征,就是选取前k个特征向量(根据特征值从大到小排序好)。第一条坐标轴就是覆盖数据最大方差的位置,第二条坐标轴就是垂直于最大第一条轴的方向。。。。。。


3.图片理解

(图片来源

https://blog.csdn.net/jiaoyangwm/article/details/79805939

对于PCA来说其实就是找一个超平面,使得样本到超平面的距离最小



特点


:PCA方法是

无监督

的,不用设置参数,没有考虑样本的标签,没有利用已有的先验知识。

小的特征值只是说明相应维度上样本分布的方差小,并不代表它对分类的作用小

。某些极端情况下,PCA舍去的特征可能恰恰包含了对分类极其重要的信息。基于Fisher准则的可分性分析就是使用训练样本的标签来降维,最大程度地保留可分性信息。



https://blog.csdn.net/jiaoyangwm/article/details/79805939


3.算法步骤

  • 将每个特征进行零均值化,即每个特征减去该特征的均值,比如上面的例子(20,100)有100个特征,对每一列求均值
  • 求出协方差矩阵
  • 求出协方差矩阵的特征值及对应的特征向量r
  • 将特征向量按对应特征值大小从上到下按行排列成矩阵(按特征值从大到小),取前k行组成矩阵P
  • 原始数据和矩阵P相乘就能得到降维后的数据

import numpy as np
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt


# 二维降到一维
def pca(data, k):  # (nums, features)
    d_mean = np.mean(data, axis=0)
    data -= d_mean
    cov_data = np.cov(data.T)  # 计算协方差,(f,n)->(f,f)
    val, vec = np.linalg.eig(cov_data)  # 计算特征值和特征向量
    val_arg = np.argsort(val)  
    val_arg = val_arg[::-1]
    
    vec_sorted = vec[:,val_arg]  # 一列是一个特征向量
    vec_s = vec_sorted[:,0:k]
    datas = np.dot(data, vec_s)  # 压缩后数据
    data_y = np.dot(datas, vec_s.T) + d_mean  # 还原
    return datas, data_y
    
    



X1, Y1 = make_classification(n_features=2, n_redundant=0, n_informative=2,
                             n_clusters_per_class=1)
ind_y = np.where(Y1 == 0)[0]
X1 = X1[ind_y]
Y1 = Y1[ind_y]
datas, data_y = pca(X1,1)
plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1,
            s=25, edgecolor='k')
plt.scatter(data_y[:, 0], data_y[:, 1], marker='*', c='#00CED1',
            s=25, edgecolor='k')
plt.show()

错误之处烦请指正



版权声明:本文为naocanmani原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。