藍橋雲課 樓賽 第22期 K 近鄰迴歸演算法實現 參考答案(沒通過???)
阿新 • • 發佈:2021-01-28
import numpy as np # 已知樣本特徵 train_data = np.array([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8], [9, 9], [10, 10]]) # 已知樣本目標值 train_labels = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) def knn(train_data, train_labels, test_data, k): """ 引數: train_data -- 已知樣本特徵,numpy.ndarray.2d train_labels -- 已知樣本目標,numpy.ndarray.1d test_data -- 單個未知樣本特徵,numpy.ndarray.2d k -- k 值 返回: test_labels -- 單個未知樣本預測目標,浮點型 """ ### 補充程式碼 ### inX=test_data dataSet=train_data labels=train_labels import operator from decimal import Decimal, ROUND_HALF_UP dataSetSize = dataSet.shape[0] diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet # 分類輸入向量與訓練集樣本作差 sqDiffMat = diffMat ** 2 # 計算分類輸入與樣本訓練集差平方值 sqDistances = sqDiffMat.sum(axis=1) # 歐式距離平方 distances = sqDistances ** 0.5 # 歐式距離 sortedDistIndicies = distances.argsort() # argsort示例 a= np.array([1,3,2,4]),b=a.argsort() >>>array([0, 2, 1, 3], dtype=int32) classCount = {} # 定義空字典 for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) test_labels=sortedClassCount[0][0] print(test_labels) #四捨五入 test_labels = Decimal(float(test_labels)).quantize(Decimal("0.01"), rounding="ROUND_HALF_UP") return test_labels if __name__=="__main__": test_data = np.array([[1.2, 1.3]]) knn(train_data, train_labels, test_data, k=3)