欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习之PCA降维算法(二)手写实现

程序员文章站 2022-07-13 08:51:29
...

PCA

PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征

代码实现

'''
    pca
'''
# 导入科学计算包,方便矩阵的生成和运算
import numpy as np
# 数据生成 直接转置,因为协方差矩阵A = (X - X.mean).T
X = np.transpose(np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]))
# 降至的维度
n = 2


# 定义pca函数
def pca(X,n):
    # 数据处理
    X_mean = np.mean(X,axis=1)
    # 这里将平均值进行reshape,是利用了矩阵运算的广播机制,保证在不同行列的情况下做加减
    X = X - X_mean.reshape(-1,1)
    # 求取协方差矩阵
    cov_mat = np.dot(X,X.T)
    # 将协方差进行特征值分解 第一个返回值是特征值矩阵,第二个返回值是特征向量矩阵
    values,vectors = np.linalg.eig(cov_mat)
    # 按特征值将特征向量进行排序
    # 拼接一个特征值和特征向量一起的矩阵
    eig_mat = [(np.abs(values[i]),vectors[:,i]) for i in range(len(X))]
    # 排序
    eig_mat.sort(reverse=True)
    # 拼接WT矩阵 降维后的权重矩阵,只保留要保留的列
    WT = np.array([_[1] for _ in eig_mat[:n]])

    # 对X进行转换,降维
    return np.dot(WT,X)


# 调用pca降维,获取降维后的数据
X = pca(X,n)
# 降维完毕
print(X)

效果如下

print(X)
>>[[-0.50917706 -2.40151069 -3.7751606   1.20075534  2.05572155  3.42937146]
 	[ 1.08866118 -0.10258752 -0.43887001  0.05129376 -0.46738995 -0.13110746]]