k-近鄰算法原理
K-近鄰算法採用測量不同特徵值之間的距離方法進行分類。
• 優點:精度高、對異常值不敏感、無數據輸入假定。
• 缺點:時間複雜度高、空間複雜度高。
適用數據範圍:數值型和標稱型。
工作原理
存在一個樣本數據集合,也稱作訓練樣本集,並且樣本集中每個數據都存在標籤,即我們知道樣本集中每一數據 與所屬分類的對應關係。輸人沒有標籤的新數據後,將新數據的每個特徵與樣本集中數據對應的 特徵進行比較,然後算法提取樣本集中特徵最相似數據(最近鄰)的分類標籤。一般來説,我們 只選擇樣本數據集中前K個最相似的數據,這就是K-近鄰算法中K的出處,通常K是不大於20的整數。 最後 ,選擇K個最相似數據中出現次數最多的分類,作為新數據的分類。
# -*- coding: utf-8 -*-
# @Time : 2019/11/9 11:46
# @Author :
import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
# 準備樣本(如圖1)
df = pd.DataFrame(data={'電影名稱': ['功夫熊貓', '葉問3', '二次曝光', '代理情人', '新步步驚心', '諜影重重', '美人魚', '寶貝當家', '唐人街探案'],
'搞笑鏡頭': [39, 3, 2, 9, 8, 5, 21, 45, 23], '擁抱鏡頭': [0, 2, 3, 38, 34, 2, 17, 2, 3],
'打鬥鏡頭': [31, 65, 55, 2, 17, 57, 5, 9, 17],
'電影類型': ['喜劇片', '動作片', '愛情片', '愛情片', '愛情片', '動作片', '喜劇片', '喜劇片', np.NaN]})
# 獲取待求的電影名稱的下標
idx = df[df.電影名稱 == "唐人街探案"].index
# 樣本分離
# 已知電影類型的電影(如圖2)
df_konw = df.drop(index=idx)
# 不知電影類型的電影(如圖3)
df_test = df.iloc[idx]
# 構建KNN分類器對象,k_neighbors查詢默認使用的鄰居數
knnclf = KNeighborsClassifier(n_neighbors=5, algorithm='auto')
# 這是一個訓練樣本集 而且必須是一個二維數組
X_train = np.array(df_konw.loc[:, ["搞笑鏡頭", "擁抱鏡頭", "打鬥鏡頭"]])
Y_train = np.array(df_konw["電影類型"])
# 生成訓練模型
knnclf.fit(X_train, Y_train)
# 輸入測試值
X_test = np.array(df_test.loc[:, ["搞笑鏡頭", "擁抱鏡頭", "打鬥鏡頭"]])
# 預測
y_test = knnclf.predict(X_test)
# array(['喜劇片'], dtype=object)
# 輸出準確率
# ret = knnclf.score(X_test, y_test)
(圖1)
(圖2)
(圖3)