簡介:
k nearest neighbor演算法又叫knn演算法,如果乙個樣本在特徵空間中的k個最相似的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。
該演算法的思想是:
乙個樣本與資料集中的k個樣本最相似,如果這k個樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,即,對每乙個測試樣本,基於事先選擇的距離度量,knn演算法在訓練集中找到距離最近(最相似)的k個樣本,然後將k個樣本的類別的投票結果作為測試樣本的類別。
k 近鄰演算法api呼叫
1、scikit_learn
2、api
3、模型訓練具體使用
4、knn演算法是乙個懶惰演算法,根據給出的樣本自己進行判斷,比較耗時
舉例:
# 匯入模組
from sklearn.neighbors import kneihborsclassifier
# 構造資料集
x = [[0],[1],[2],[3]]
y = [0,0,1,1]
# 機器學習--模型訓練
# 例項化api
estimator = kneighborsclassifier(n_neighbors=2)
# 使用fit方法進行訓練
estimator.fit(x,y)
實際計算流程:
1)計算已知類別資料集中的點與當前點之間的距離
2)按距離遞增次序排序
3)選取與當前點距離最小的k個點
4)統計前k個點所在的類別出現的頻率
5)返回前k個點出現頻率最高的類別作為當前點的**分類
距離度量距離
1、歐式距離
就是通過平方,求和,然後開根號進行求解
2、曼哈頓距離
就是通過絕對值,求和進行求解
3、切比雪夫距離
就是通過絕對值,然後取最大值
4、閔可夫斯基距離
是前三個距離的乙個綜合稱呼
p = 1時,就是曼哈頓距離;
p = 2時,就是歐式距離;
p = ∞時,就是切比雪夫距離。
前四個距離的總結:1)將各個分量的量綱,也就是「單位」相同的看待了;2)未考慮各個分量的分布(期望、方差等)可能是不用的。
5、馬氏距離
是基於樣本分佈的乙個距離,在計算過程中,與量綱無關。要求:總體樣本數大於樣本的維數(特徵值)
6、標準化歐氏距離
在使用歐式距離計算之前把每個維度的特徵求了標準化
7、漢明距離
就是計算字串替換的乙個長度(次數),【漢明重量】
8、傑卡德距離
通過資料的交集和並集進行求解
k值的選擇
如果k值過小:
容易受到異常點的影響,意味著整體模型變得複雜,容易發生過擬合
若k值過大:
容易受到樣本均衡的問題,k值增大就意味著整體模型變得簡單,容易發生欠擬合
k=n(n為訓練樣本個數)
此時訓練的模型完全失效,判斷的類別只會選擇樣本中樣本資料最多的類別
個人理解:這個k值的選擇方面,可以把k值當做之前的特徵,在模型訓練時,特徵過少會導致過擬合,特徵過多會導致欠擬合。
kd樹目標:對訓練資料進行快速k近鄰搜尋
實現思路:
1、構建樹
1)構造根節點
2)通過遞迴方式不斷的構造
3)直到子區域沒有例項(節點)停止
2、最近領域搜尋
1)構造乙個佇列,使遍歷過的點在這個佇列裡面
2)進行是否過了超平面的判斷,如果沒有過,跳過,若過了,則需要把當前的子節點新增進去
3)迴圈操作,求得最近點
附加案例
鳶尾花種類**
基本實現流程:
1、獲取資料集
2、資料基本處理
1)資料集分隔
3、特徵工程
4、機器學習
5、模型評估
# 匯入模組
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import standardscaler
from sklearn.neighbors import kneighborsclassifier
# 1、獲取資料集
iris = load_iris()
# 2、資料的預處理
# x_train,x_test,y_train,y_test為訓練集特徵值,測試集特徵值,訓練值目標值,測試目標值
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target, test_size=0.2,random_state=22)
# 3、特徵工程標準化
transfer = standardscaler()
x_train = trasfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4、機器學習(模型訓練)
estimator = kneighborsclassifier(n_neighbors=5)
estimator.fit(x_train,y_train)
# 5、模型評估
# 1)比對真實值和**值
y_predict = estimator.predict(x_test)
print("**結果為:\n",y_predict)
print("比對真實值和**值:\n",y_predict == y_test)
# 2)直接 計算準確率
score = estimator.score(x_test, y_test)
print("準確率為:\n",score)
交叉驗證、網格搜尋(模型選擇與調優)api:
sklearn.model_selection.gridsearchcv(estimator, param_grid=none,cv=none)
鳶尾花案例增加k值調優
# 使用gridsearchcv構建估計器
# 匯入模組
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import standardscaler
from sklearn.neighbors import kneighborsclassifier
# 1、獲取資料集
iris = load_iris()
# 2、資料的預處理
# x_train,x_test,y_train,y_test為訓練集特徵值,測試集特徵值,訓練值目標值,測試目標值
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target, test_size=0.2,random_state=22)
# 3、特徵工程標準化
transfer = standardscaler()
x_train = trasfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4、機器學習(模型訓練)
# 1)knn預估器流程
estimator = kneighborsclassifier()
# 2)準備要調的引數
param_dict =
estimator = gridsearchcv(estimaor, param_grid=param_dict, cv=3)
# 3)fit資料進行訓練
estimator.fit(x_train,y_train)
# 5、模型評估
# 1)比對真實值和**值
y_predict = estimator.predict(x_test)
print("**結果為:\n",y_predict)
print("比對真實值和**值:\n",y_predict == y_test)
# 2)直接 計算準確率
score = estimator.score(x_test, y_test)
print("準確率為:\n",score)
k 近鄰演算法
此文章參考機器學習實戰一書,具體的理論知識可以參考該書。本文的初衷只是為了做乙個複習,將學過的知識加以整理,其中不免有一定的錯誤。2.k 近鄰演算法的原理介紹 k 近鄰演算法通過測量不同的特徵值之間的距離進行分類。它的工作原理如下 存在乙個樣本的資料集合,也成為訓練樣本集合。並且樣本集中的每個資料都...
K 近鄰演算法
k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定 缺點 計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入...
K 近鄰演算法
首先,我們將 k 近鄰演算法的基本理論 其次我們將使用python從文字檔案中匯入並解析資料 再次,討論當存在許多資料 的時,如何避免計算距離時可能碰到的一些常見錯誤 最後,利用實際的例子講解如何使用k 近鄰演算法改進約會 1.1 knn演算法 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且...