PCA实现
2024-10-12 17:49:58
代码实现分成好多种层级,有的代码只使用标准库实现,有的代码基于其它库实现,有的代码直接调用库中现有的实现。
在本文中,按照不同的层级分别实现PCA
对于分类问题基本任务可以描述如下
x11 x12 x13 x14 y1
x21 x22 x23 x24 y2
x31 x32 x33 x34 y3
......
PCA用于提取样本的主要特征,它只跟属性有关,而跟类别数据无关。也就是说,PCA只跟X有关而跟Y无关。
import numpy as np
from sklearn.decomposition import PCA
# 10个样本,每个样本7个属性,现在要取其中的3个属性
train_x = np.random.rand(10, 7)
train_y = np.random.randint(0, 3, (100, 1))
#使用sklearn
p = PCA(n_components=3)
p.fit(train_x, train_y)
train_data = p.transform(train_x)
# 使用numpy中的协方差计算、特征值求解来实现
mu = np.mean(train_x, axis=0) # 均值向量
# 协方差矩阵,cov默认是列向量,这里需要T表示将行向量转置称列向量
# 使用参数rowvar=False相当于矩阵转置
A = np.cov(np.asmatrix(train_x - mu).T)
root, vec = np.linalg.eig(A)
ind = np.argsort(root)
transform_matrix = np.asmatrix(vec[:, ind[-3:]])
train_data2 = np.asmatrix(train_x - mu) * transform_matrix
# 自己实现协方差计算,只使用numpy中的特征值求解来实现
mu = np.mean(train_x, axis=0)
A = np.dot((train_x - mu).T, (train_x - mu)) / (len(train_x) - 1)
root, vec = np.linalg.eig(A)
# 返回的特征根是无序的,需要进行排序
ind = np.argsort(root)
# vec[:ind[-3:]]或者vec[:ind[-1:-4:-1]]都是可以的
transform_matrix = np.asmatrix(vec[:, ind[-3:]])
train_data3 = np.asmatrix(train_x - mu) * transform_matrix
print(np.sum(train_data - train_data2), np.sum(train_data - train_data3))
最新文章
- folder、source folder、package 区别与联系
- 原生javascript实现省市区三级联动
- VMware下利用ubuntu13.04建立嵌入式开发环境之一
- Jenkins进阶系列之——14配置Jenkins用户和权限
- JVM 性能调优实战之:一次系统性能瓶颈的寻找过程
- Nginx模块开发入门
- 【单调栈】Vijos P1926 紫色的手链
- 2013 长沙网络赛 B 题 Bizarre Routine
- 格而知之1:UIButton中imageView和titleLabel的位置调整
- 【JavaWeb】Session(转)
- CoreAnimation注意事项
- WebStrom中实现Vue项目的快速启动
- WebDriver Selenium eclipse环境搭建
- appium+python自动化脚本
- leveldb 学习记录(五)SSTable格式介绍
- css文本溢出隐藏显示省略号(单行+多行)
- ajax文件上传-FormData()
- 18. 4Sum(双指针)
- Loj10167 HDU2089 不要62
- 03-SSH综合案例:商城表关系分析