赞
踩
本篇文章学习:
通俗易懂的主成分分析法(PCA)详解
这篇文章关于PCA介绍得非常详细及清楚,数学解释也相当通俗易懂,墙墙推~~
优点:避免过拟合、降低算法的计算开销、去除噪声
这篇博客讲得有趣又清楚~
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
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.数据去中心化
- 样本数据-均值
"""
def zeroMean(dataMat):
# 求得每个特征(列)得均值
meanVal = np.mean(dataMat)
# 数据-均值
newData = dataMat - meanVal
return meanVal,newData
# 接收均值 以及 去中心化之后得数据
meanVal,newData = zeroMean(data)
"""
2.求解样本协方差矩阵
- 对角线:方差
- 非对角线:协方差
"""
# 求解协方差矩阵,指定参数rowvar=0说明数据一行为一个样本
covMat = np.cov(newData,rowvar=0)
covMat
"""
将协方差矩阵分解
- 特征值
- 特征向量
"""
# np.mat将ndarray对象 转为 matrix对象
eigVals,eigVects = np.linalg.eig(np.mat(covMat))
print("特征值:",eigVals)
print("特征向量:",eigVects)
"""
取得特征值最大得哪个特征
- 排序,argsort-->升序排序,升序之后得索引位置
"""
eigValIndice = np.argsort(eigVals)
eigValIndice
# top指定降维得维数
top = 1
# 如果你要降到n维,你就得获取前n最大得特征值的索引
# 升序的,
n_eigValIndice = eigValIndice[-1:-1-top:-1]
n_eigValIndice
"""
获取最大的 n个特征值 对应的 n个 特征向量
"""
n_eigVect = eigVects[:,n_eigValIndice]
n_eigVect
"""
高维转低维:newData*最大向量
"""
# 得到降维之后的数据
lowDataMat=newData.values*n_eigVect
lowDataMat
"""
降维之后的数据重构数据:
降维后的数据*最大的n个特征向量的转置+均值
"""
reconMat = lowDataMat*n_eigVect.T+meanVal.values
reconMat
"""
可视化数据
"""
# 绘制原始数据的图
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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。