当前位置:   article > 正文

python机器学习 | PCA降维算法介绍及实现_降维就是一种对高纬度特征数据预处理方法

降维就是一种对高纬度特征数据预处理方法

本篇文章学习:
通俗易懂的主成分分析法(PCA)详解

这篇文章关于PCA介绍得非常详细及清楚,数学解释也相当通俗易懂,墙墙推~~

1 PCA降维算法介绍

1.1 数据降维和PCA概念

  • 数据降维:降维实际上就是一种对高纬度特征数据预处理的方法。我们需要通过降维将高纬度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。

优点:避免过拟合、降低算法的计算开销、去除噪声

  • PCA概念:PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。

1.2 PCA降维推导过程

通俗易懂的主成分分析法(PCA)详解

这篇博客讲得有趣又清楚~

2 PCA算法实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
  • 1
  • 2
  • 3
# 读取数据
data = pd.read_csv("data.csv",header=None)

# 绘制两个特征散点图
x_data = data.iloc[:,0]
y_data = data.iloc[:,1]
plt.scatter(x_data,y_data)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

"""
1.数据去中心化
- 样本数据-均值
"""
def zeroMean(dataMat):
    # 求得每个特征(列)得均值
    meanVal = np.mean(dataMat)
    # 数据-均值
    newData = dataMat - meanVal
    return meanVal,newData
    
# 接收均值 以及 去中心化之后得数据
meanVal,newData = zeroMean(data)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
"""
2.求解样本协方差矩阵
- 对角线:方差
- 非对角线:协方差
"""
# 求解协方差矩阵,指定参数rowvar=0说明数据一行为一个样本
covMat = np.cov(newData,rowvar=0)
covMat
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
"""
将协方差矩阵分解
- 特征值
- 特征向量
"""
# np.mat将ndarray对象 转为 matrix对象
eigVals,eigVects = np.linalg.eig(np.mat(covMat))
print("特征值:",eigVals)
print("特征向量:",eigVects)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
"""
取得特征值最大得哪个特征
- 排序,argsort-->升序排序,升序之后得索引位置
"""
eigValIndice = np.argsort(eigVals)
eigValIndice
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
# top指定降维得维数
top = 1

# 如果你要降到n维,你就得获取前n最大得特征值的索引
# 升序的,
n_eigValIndice = eigValIndice[-1:-1-top:-1]
n_eigValIndice
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
"""
获取最大的 n个特征值 对应的 n个 特征向量
"""
n_eigVect = eigVects[:,n_eigValIndice]
n_eigVect
  • 1
  • 2
  • 3
  • 4
  • 5
"""
高维转低维:newData*最大向量
"""
# 得到降维之后的数据
lowDataMat=newData.values*n_eigVect
lowDataMat
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
"""
降维之后的数据重构数据:
降维后的数据*最大的n个特征向量的转置+均值 
"""
reconMat = lowDataMat*n_eigVect.T+meanVal.values
reconMat
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
"""
可视化数据
"""
# 绘制原始数据的图
x_data = data.iloc[:,0]
y_data = data.iloc[:,1]
plt.scatter(x_data,y_data)

# 绘制重构后的数据的图
x_data = np.array(reconMat)[:,0]
y_data = np.array(reconMat)[:,1]
plt.scatter(x_data,y_data,c="r")
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/106913
推荐阅读
相关标签
  

闽ICP备14008679号