一、KNN算法?
?K-近鄰算法(K-Nearest Neighbors,簡稱KNN),根據K個鄰居樣本的類別來判斷當前樣本的類別;如果一個樣本在特征空間中的k個最相似(最鄰近)樣本中的大多數屬于某個類別,則該類本也屬于這個類別。
一些距離:?
距離類型 | 核心特點 | 典型應用場景 |
---|---|---|
歐式距離 | 直線距離,直觀但受尺度影響 | 圖像識別、聚類分析(需先標準化) |
曼哈頓距離 | 網格距離,計算快,抗異常值 | 路徑規劃、高維數據分類 |
切比雪夫距離 | 最大維度差異,關注極端值 | 質量檢測、棋盤類問題 |
余弦距離 | 方向相似度,忽略長度 | 文本分類、推薦系統(如用戶興趣匹配) |
馬氏距離 | 考慮協方差,消除相關性和尺度 | 異常檢測、金融風險評估 |
import joblib#用來保存模型
from sklearn.datasets import load_wine#加載紅酒數據集
from sklearn.model_selection import train_test_split#引入數據集劃分
from sklearn.neighbors import KNeighborsClassifier#KNN算法模型
from sklearn.preprocessing import StandScaler#標準化
import numpy as np#加載數據集
x,y = load_wine(return_X_y=True)
x_train,x_test,y_train,_y_test = train_test_split(x,y,test_size=0.2,random.state=42)#特征工程化——標準化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
#fit(x_train) 會計算訓練集的均值和標準差
# transform(x_train) 會用訓練集的均值和標準差對訓練數據標準化
# transform(x_test) 同樣用訓練集的均值和標準差對測試數據標準化#訓練
model = KNeighborsClassifier(n_neighbors=7)#查詢的近鄰數為7
model.fit(x_train,x_test)#預測
y_p = model.predict(x_test)print(model.score(x_test,y_test))#計算準確率#模型保存
joblib.dump(model,'../src/model/KNN.pkl')
joblib.dump(transfer,'../src/model/transfer.pkl')
我們用紅酒的數據集訓練好模型后并保存,可在其他地方引用這個模型來進行測試?
import joblib
model = joblib.load('../src/model/KNN.pkl')
transfer = joblib.load('../src/model/transfer.pkl')
x_new = [[5.1,3.5,1.4,0.2,1,2,3,4,5,6,7,8,9],[5.9,3.0,5.1,1.8,2,3,4,5,6,7,8,9,10],
]
x_new = transfer.transform(x_new)
y_predict = model.predict(x_new)
二、KNN算法的缺點:
1、對于大規模數據集,計算量大,因為需要計算測試樣本與所有訓練樣本的距離
2、對于高維數據,距離度量可能變得不那么有意義,數值很大相差不大。
3、需要選擇合適的k值和距離度量,這可能需要一些實驗和調整
三、API
class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, algorithm='auto')
參數: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
(1)n_neighbors:?
int, default=5, 默認情況下用于kneighbors查詢的近鄰數,就是K
(2)algorithm:
{‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’。找到近鄰的方式,注意不是計算距離?? ??? ?的方式,與機器學習算法沒有什么關系,開發中請使用默認值'auto'
方法:
(1) fit(x, y)?
使用X作為訓練數據和y作為目標數據 ?
(2) predict(X)?? ?預測提供的數據,得到預測數據 ?