机器学习-数据预处理02-PCA降维

2、降维的意义

首先我们为什么要降维?
  假如我们拿到的数据很多很多,有上百个数据特征(x1,x2,x3…),这些样本对于你的预测值y真的起到作用吗?就比如说我要预测你是男是女,你的标签有一个是你是否四肢健全。这个显然是没关系的!
  而对于主成分而言,我们得找到对于预测值y作用最大的几个标签,其实一般有用的特征都不多。那么对于一些有点用的标签,而且这些标签之间往往又有一丢丢关联那咋办呢?
  那就是把这几个关联的标签映射到一个维度,尽可能保留标签的特征,这就是PCA啦!(是不是很完美的解析,网上很多解释没看懂,有错请指出!)

PCA降维

下面看点图理解一下

在这里插入图片描述

一条线是在定点(中心点,均值点)上转动,找到方差最大的位置,这两个轴表示的是x1,x2,这就验证了上面说的这两个标签之间或多或少存在一定的关系。下图就是最大方差的位置!
在这里插入图片描述
小结
在这里插入图片描述

算法原理(数学)

n在这里插入图片描述上图W表示的是一个矩阵,W=(x1,x2,x3,x4…xn)同一个标签里面的不同取值,不是多个标签!

在这里插入图片描述在这里插入图片描述底层代码实现

import numpy as np

方法封装 X 数据 k 取几个维度

def pca(X,k):
    m_samples , n_features = X.shape
    #中心化  去均值    均值为0
    mean = np.mean(X,axis=0)
    normX = X - mean #去均值
    cov_mat = np.dot(np.transpose(normX),normX)  #协方差矩阵
    #对二维数组的transpose操作就是对原数组的转置操作  矩阵相乘
    vals , vecs = np.linalg.eig(cov_mat)# 得到特征向量和特征值
    print('特征值', vals)
    print('特征向量', vecs)
    eig_pairs = [(np.abs(vals[i]),vecs[:,i]) for i in range(n_features)]
    print(eig_pairs)
    print('----------')
    #将特征值由大到小排列
    eig_pairs.sort(reverse=True)
    print(eig_pairs)
    print('------------')
    #获取多少个维度
    feature = np.array(eig_pairs[0][k])
    print(feature)
    #将数据进行还原操作  normX  中心化后的数据 和  特征向量相乘
    data = np.dot(normX,np.transpose(feature))
    return data
X = np.array([[-1,1],[-2,-1],[-3,-2],[1,1],[2,1],[3,2]])
data = pca(X,1)
print(data)

在这里插入图片描述

API代码实现

from sklearn.decomposition import PCA
p = PCA(n_components=1)
a = p.fit_transform(X)
print('----------------------')
print(a)
out:
----------------------
[[ 0.50917706]
 [ 2.40151069]
 [ 3.7751606 ]
 [-1.20075534]
 [-2.05572155]
 [-3.42937146]]

其实数学那方面还是不能深入,慢慢来,哪位大佬懂的话留个言呗!!

发布了89 篇原创文章 · 获赞 42 · 访问量 3649

猜你喜欢

转载自blog.csdn.net/weixin_43673156/article/details/105319123