本文結合KNN算法並依據歐幾裡得距離(Euclidean Distance)來尋找與麥可·喬丹(Michael Jordan)最相似的NBA運動員,以及利用KNN算法回歸功能來預測球員得分。
KNN全稱為:K-nearest neighbours,又稱為最近鄰居法、K近鄰算法,是一種用於分類(classifier)和回歸(regressor)的非參統計法。在KNN分類中,輸出結果是分類族群,一個對象歸屬於哪一類是由其鄰居的「多數表決」決定的,如果k=1,則該對象的類別直接由最近一個節點賦予;在KNN回歸中,輸出結果是對象的屬性值,這個值是其k個最近鄰居的值的平均數。算法準則是:尋找接近新數據點的訓練樣本的數目,根據訓練樣本的信息來預測新數據點的某些信息。 訓練樣本的數目可以是自行指定的常數,如KNN;也可以基於數據點密度而來。
示範案例#設定工作環境並讀取數據
%cd F:Dropbox\mlearning
import pandas as pd
data = pd.read_excel('nba.xlsx', 'Sheet2')
# 選擇喬丹(Jordan)為基準點,並選擇其他的參數作為判別相似性依據,並將其標準化
Jordan = data[data['Player'] == 'Michael Jordan'].iloc[0]
factors = ['GP', 'MIN', 'PTS', 'FGM', 'FGA', 'FG%', '3PM', '3PA', '3P%', 'FTM', 'FTA', 'FT%', 'OREB', 'DREB', 'REB', 'AST', 'STL', 'BLK', 'TOV', 'eFG%', 'TS%']
numeric = data[factors]
data_normalized = (numeric - numeric.mean()) / numeric.std()
#定義歐式距離計算函數,並計算每位球員與Jordan間的歐氏距離
def euclidean(row):
initial = 0
for f in factors:
initial += (row[f] - Jordan[f]) ** 2
return sqrt(initial)
distance = data.apply(euclidean, axis = 1)
#尋找近鄰
from scipy.spatial import distance
Jordan_normalized = data_normalized[data['Player'] == 'Michael Jordan']
distance_1 = data_normalized.apply(lambda row: distance.euclidean(row, Jordan_normalized), axis = 1)
frame = pd.DataFrame(data = {'Index': distance_1.index, 'Distance': distance_1})
frame.sort_values(by = 'Distance', inplace = True)
similar = frame.iloc[1]['Index']
similar_player = data.iloc[int(similar)]['Player']
print similar_player
#輸出結果如下:勒布朗詹姆斯(LeBron James)
以上是關於如何尋找近鄰的詳細說明,接下來可以將原數據拆分為訓練集(train set)和測試集(test set)並對測試集進行預測。
#引入程序包,並隨機數據(類似洗牌數據)
from math import floor
from numpy.random import permutation
shuffle = permutation(data.index)
# 設定斷點,確定斷點前的數據都進入測試集,此處將1/3的數據選入測試集
test_point = floor(len(data) / 3)
# 生成測試集與訓練集
test_set = data.loc[shuffle[1 : test_point + 1]]
train_set = data.loc[shuffle[test_point +1 : ]]
# 設定預測所需的自變量,並將鄰居數量指定為5
indepedent = ['GP', 'MIN', 'FGM', 'FGA', 'FG%', '3PM', '3PA', '3P%', 'FTM', 'FTA', 'FT%', 'OREB', 'DREB', 'REB', 'AST', 'STL', 'BLK', 'TOV', 'eFG%', 'TS%']
depedent = ['PTS']
from sklearn.neighbors import KNeighborsRegressor as KNR
KNN = KNR(n_neighbors = 5)
# 用訓練集來擬合模型,並運用模型對測試集數據進行預測,輸出模型預測值
KNN.fit(train_set[indepedent], train_set[depedent])
prediction = KNN.predict(test_set[indepedent])
print prediction
#輸出結果
#利用均方誤差(Mean Squared Error, MSE)作為誤差估測指標,並評估預測準確程度
actual_value = test_set[depedent]
MSE = ((actual_value - prediction) ** 2).sum() / len(test_set)
print MSE
#輸出結果