頭歌實踐教學平臺-機器學習 --- PCA-答案

educoder王子發表於2024-06-29

非盈利文章,僅提供編輯器內的答案或程式碼,不提供啟動服務及需要命令列的程式碼

第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 *********#

相關文章