PCA主成分分析

PCA(Principal Component Analysis)

数据压缩2D-1D

3D-2D

数据可视化

将上面的数据压缩为2D,但并不是从上面属性之中选择两个属性,这两个特征其实很难去描述。

降维分析:

多维数据分析:

PCA不是线性回归

PCA算法流程:

方差and协方差:

协方差矩阵:

特征值和特征向量:

通过数据集的协方差矩阵及其特征值分析,我们可以得到协方差矩阵的特征向量和特征值。

我们需要保留k个维度的特征就选取最大的k个特征值。


实战代码

import numpy as np
import matplotlib.pyplot as plt

data = np.genfromtxt('data.csv',delimiter=',')
x_data = data[:,0]
y_data = data[:,1]
plt.scatter(x_data,y_data)

#数据中心化
def zeroMean(dataMat):
    #按列求平均,即各个特征的平均
    meanVal = np.mean(dataMat,axis=0)
    newData = dataMat - meanVal
    return newData,meanVal

newData,meanVal = zeroMean(data)
#np.cov用于求协方差矩阵,参数rowvar=0说明数据一行代表一个样本。
covMat = np.cov(newData,rowvar = 0)

#协方差矩阵
print(covMat)

#np.linalg.eig求矩阵的特征值和特征向量
eigVals,eigVects = np.linalg.eig(np.mat(covMat))
#特征值
print(eigVals)
#特征向量
print(eigVects)

#对特征值从小到大排序
eigValIndice = np.argsort(eigVals)

#降维
top = 1
#最大的n个特征值对应的特征向量
#后面加一个-1,表示从后往前查找,先-1,再-2.取top个数
n_eigValIndice = eigValIndice[-1:-(top+1):-1]

#最大的n个特征值对应的特征向量
n_eigVect = eigVects[:,n_eigValIndice]
print(n_eigVect)

#低维特征空间的数据
lowDDataMat = newData*n_eigVect

#利用低纬度数据来重构数据
reconMat = (lowDDataMat*n_eigVect.T) + meanVal

plt.scatter(np.array(reconMat[:,0]),np.array(reconMat[:,1]))
plt.show()

数据分布散点图:

降维处理后的图像分布:


 

 


手写数字识别降维可视化

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits
from sklearn.metrics import classification_report,confusion_matrix

digits = load_digits()#载入数据
x_data = digits.data
y_data = digits.target
x_train,x_test,y_train,y_test = train_test_split(x_data,y_data)#1/4为测试数据,3/4为训练数据

mlp = MLPClassifier(hidden_layer_sizes=(100,50),max_iter=500)
mlp.fit(x_train,y_train)
#数据中心化
def zeroMean(dataMat):
    #按列求平均,即各个特征的平均
    meanVal = np.mean(dataMat,axis=0)
    newData = dataMat - meanVal
    return newData,meanVal

def pca(dataMat,top):
    newData,meanVal = zeroMean(dataMat)
    #np.cov用于求协方差矩阵,参数rowvar=0说明数据一行代表一个样本。
    covMat = np.cov(newData,rowvar = 0)
    #np.linalg.eig求矩阵的特征值和特征向量
    eigVals,eigVects = np.linalg.eig(np.mat(covMat))
    #对特征值从小到大排序,为了后面的取值。
    eigValIndice = np.argsort(eigVals)
    #最大的n个特征值对应的特征向量
    #后面加一个-1,表示从后往前查找,先-1,再-2.取top个数
    n_eigValIndice = eigValIndice[-1:-(top+1):-1]
    #最大的n个特征值对应的特征向量
    n_eigVect = eigVects[:,n_eigValIndice]
    #低维特征空间的数据
    lowDDataMat = newData*n_eigVect
    #利用低纬度数据来重构数据
    reconMat = (lowDDataMat*n_eigVect.T) + meanVal
    return lowDDataMat,reconMat
lowDDataMat,reconMat = pca(x_data,3)
#print(lowDDataMat[:,0])输出n维列向量
#print(np.array(lowDDataMat)[:,0])#输出n维行向量
x = np.array(lowDDataMat)[:,0]
y = np.array(lowDDataMat)[:,1]
# plt.scatter(x,y,c='r')

predictions = mlp.predict(x_data)
#输出对应lowDDataMat下标的标签y_data值
x = np.array(lowDDataMat)[:,0]
y = np.array(lowDDataMat)[:,1]
# plt.scatter(x,y,c=y_data)


from mpl_toolkits.mplot3d import Axes3D
x = np.array(lowDDataMat)[:,0]
y = np.array(lowDDataMat)[:,1]
z = np.array(lowDDataMat)[:,2]
ax = plt.figure().add_subplot(111,projection = '3d')
ax.scatter(x,y,z,c=y_data,s=10)#点为红色的三角形
plt.show()

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值