PCA主成分分析

''' 1)、对数据进行中心化处理,即减去均值。
    2)、构造协方差矩阵。
    3)、求解协方差矩阵的值与特征向量。
    4)、将特征值从大到小排列,截取所需的K个,并得到其对应的特征向量
    5)、.将数据投影在这K个特征向量上。'''


import numpy as np
from mpl_toolkits.mplot3d import Axes3D  # 空间三维画图
from numpy import *;
import matplotlib.pyplot as plt

X_cen = np.random.normal(100, 10, (3000, 3))  #生成由均值为0,标准差为1的标准正态分布组成的随机数组

def pca(X, threshold):
    # 将X中心化
    X_mean = np.mean(X, axis=0)     #求平均值函数mean
    X_cen = X - X_mean

    # 构造散度矩阵并且求解特征值与特征向量
    X_sca = np.dot(X_cen.T, X_cen)     #dot函数表示矩阵的乘法
    X_eigenval, X_eigenvect = np.linalg.eig(X_sca)     #linalg.eig(a)函数返回矩阵A的特征值和特征向量,X_eigenval特征值, X_eigenvect特征向量

    index = X_eigenval.argsort()[::-1]      #从大到小排序,返回索引值
    indexs = index[0:threshold]
    X_eigenvect_TopK = X_eigenvect[:, indexs]   #前threshold大的特征值对应的特征向量,也就是投影向量
    return X_eigenvect_TopK


Tou = pca(X_cen, 2)
Last = np.dot(X_cen, Tou)

#原三维数据散点图
x0 = X_cen[:, 0]
y0 = X_cen[:, 1]
z0 = X_cen[:, 2]
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x0, y0, z0)

#投影后二维数据对应平面图
x1 = Last[:, 0]
y1 = Last[:, 1]
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x1, y1)

plt.show()

你可能感兴趣的:(人工智能,机器学习,Python)