头歌实践教学平台-机器学习 --- PCA-答案

非盈利文章,仅提供编辑器内的答案或代码,不提供启动服务及需要命令行的代码

第1关:维数灾难与降维

第2关:PCA算法流程

import numpy as np

def pca(data, k):
'''
对data进行PCA,并将结果返回
:param data:数据集,类型为ndarray
:param k:想要降成几维,类型为int
:return: 降维后的数据,类型为ndarray
'''

#********* Begin *********#
u = np.mean(data, axis=0)
#demean
after_demean = data - u
# 计算after_demean的协方差矩阵
# after_demean的行数为样本个数,列数为特征个数
# 由于cov函数的输入希望是行代表特征,列代表数据的矩阵,所以要转置
cov = np.cov(after_demean.T)
#eig函数为计算特征值与特征向量的函数
#cov为矩阵,value为特征值,vector为特征向量
value, vector =  np.linalg.eig(cov)
#根据特征值value将特征向量vector降序排序
vector_index = np.argsort(value)#np.argsort()将矩阵按照value排序,并返回排序后的下标
#筛选出前k个特征向量组成映射矩阵P
n = vector_index[-1:-(k+1):-1]# 从索引-1开始到索引-(k+1)停止,间隔为-1
p = vector[:, n]#取前n个值
#after_demean和P做矩阵乘法得到result
result = after_demean.dot(p)
return result
#********* End *********#

第3关:sklearn中的PCA

from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier

def cancer_predict(train_sample, train_label, test_sample):
'''
使用PCA降维,并进行分类,最后将分类结果返回
:param train_sample:训练样本, 类型为ndarray
:param train_label:训练标签, 类型为ndarray
:param test_sample:测试样本, 类型为ndarray
:return: 分类结果
'''

#********* Begin *********#
pca = PCA(n_components=11, random_state=42)
train_sample = pca.fit_transform(train_sample)
test_sample = pca.transform(test_sample)
clf = KNeighborsClassifier(n_neighbors=5)
clf.fit(train_sample, train_label)
result = clf.predict(test_sample)
return result
#********* End *********#
posted @ 2024-06-29 13:20  educoder王子  阅读(1346)  评论(0)    收藏  举报