非盈利文章,僅提供編輯器內的答案或程式碼,不提供啟動服務及需要命令列的程式碼
第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 *********#