機器學習實戰 KNN演算法

2021-08-29 20:47:35 字數 3493 閱讀 8570

k 近鄰演算法的工作機制非常簡單:對給定的測試樣本,基於某種距離度量找出訓練集中與其最靠近的 k 個訓練樣本,然後基於這 k 個"鄰居"的資訊來進行**。通常, 在分類任務中可使用"投票法" ,即選擇這 k 個樣本中出現最多的類別標記作為**結果;在回歸任務中時使用"平均法" ,即將這k 個樣本的實值輸出標記的平均值作為**結果;還可基於距離遠近進行加權平均或加權投票,距離越近的樣本權重越大。k 的取值不同,其分類結果會發生變化。為了提高運算的效率,常利用 kd 樹對其進行優化。

《機器學習實戰》中的**是基於py2編寫的,py3中有部分變化,全書的py3**鏈結為:機器學習實戰python3的github位址,**中有幾個包和函式沒有使用過,因此對其用法進行記錄。

operator:內建的操作符函式,其中的 itemgetter(獲取指定位置的閾)

tile:numpy包中的函式,函式格式tile(a,reps),a和reps都是array_like,a的型別眾多,幾乎所有型別都可以:array, list, tuple, dict, matrix以及基本資料型別int,string, float以及bool型別。reps的型別也很多,可以是tuple,list, dict, array, int, bool.但不可以是float, string, matrix型別。

np.tile([1

,2],

2)out[2]

: array([1

,2,1

,2])

np.tile([1

,2],

(2,1

))out[3]

:array([[

1,2]

,[1,

2]])

sorted:sorted(iterable,cmp,key,reverse),引數:iterable可以是list或者iterator;cmp是帶兩個引數的比較函式;key 是帶乙個引數的函式;reverse為false或者true;

classcount

out[59]

:# 按字典中values的大小排序,並返回元素為元組的列表

sortedclasscount =

sorted

(classcount.items(

), key=operator.itemgetter(1)

, reverse=

true

)sortedclasscount

out[61]

:[('b',2

),('a',1

)]

本文主要介紹knn演算法的實現

sklearn.neighbors.kneighborsclassifier(n_neighbors=5, weights=『uniform』, algorithm=『auto』, leaf_size=30, p=2, metric=『minkowski』, metric_params=none, n_jobs=1, **kwargs)

n_neighbors:預設為5,就是k-nn的k的值,選取最近的k個點。

weights:預設是uniform,引數可以是uniform(均等權重)、distance(非均等權重,距離近的點比距離遠的點的影響大)。

algorithm:快速k近鄰搜尋演算法,預設引數為auto,可以理解為演算法自己決定合適的搜尋演算法。也可以自己指定搜尋演算法 ball_tree 、kd_tree 、brute 方法進行搜尋,brute是蠻力搜尋,也就是線性掃瞄,當訓練集很大時,計算非常耗時。kd_tree :構造kd樹儲存資料以便對其進行快速檢索的樹形資料結構,kd樹也就是資料結構中的二叉樹,以中值切分構造的樹,每個結點是乙個超矩形,在維數小於20時效率高。ball tree :是為了克服kd樹高緯失效而發明的,其構造過程是以質心c和半徑r分割樣本空間,每個節點是乙個超球體。

leaf_size:預設是30,這個是構造的kd樹和ball樹的大小。這個值的設定會影響樹構建的速度和搜尋速度,同樣也影響著儲存樹所需的記憶體大小。需要根據問題的性質選擇最優的大小。

metric:用於距離度量,預設度量是minkowski,也就是p=2的歐氏距離(歐幾里德度量)。

p:距離度量公式。引數預設為2,即使用歐式距離公式進行距離度量。1 表示使用曼哈頓距離公式進行距離度量。

metric_params:距離公式的其他關鍵引數,這個可以不管,使用預設的none即可。

n_jobs:並行處理設定。預設為1,臨近點搜尋並行工作數。

以sklearn中的 iris 資料集為例說明其呼叫過程

# 引入sklearn機器學習包中的knn演算法

import numpy as np

import matplotlib.pyplot as plt

from sklearn.neighbors import kneighborsclassifier

from sklearn.model_selection import train_test_split

from sklearn.datasets import load_iris

# 載入iris資料集,其是乙個150*4的資料集,代表150個樣本,每個樣本有4個屬性

iris = load_iris(

)iris_data = iris.data # 資料集

iris_labels = iris.target # 對應的分類標籤

# 使用train_test_split對資料集按比例進行隨機抽取,本文按37開進行抽取

x_train, x_test, y_train, y_test = train_test_split(iris_data, iris_labels, test_size=

0.3, random_state=0)

# 定義knn分類器物件

knn = kneighborsclassifier(n_neighbors=

6, weights=

'uniform'

)# 呼叫所定義的分類器的訓練方法,主要接收兩個引數:訓練資料集及訓練標籤

knn.fit(x_train,y_train)

#呼叫該物件的測試方法,主要接收乙個引數:測試資料集

y_predict = knn.predict(x_test)

#計算各測試樣本屬於不同類的概率**值,本文中為陣列的大小為45*3,3代表資料集可以分成的類別,在每一行中按照從小到大的類別順序排列

probility=knn.predict_proba(x_test)

# 呼叫打分方法,計算模型在測試集上的準確率

score = knn.score(x_test,y_test)

機器學習實戰 kNN演算法

今天看了第乙個機器學習演算法 k 鄰近演算法。大概意思就是,先根據已有分劃分好類別的資料集,然後輸入新的資料向量,就計算與資料集裡各個向量的距離,排序找到前k個資料,統計前k資料中各個類別 標籤 出現的次數,最多的那個類別 標籤 就是輸入向量所屬的類別,然後返回。哈哈get乙個機器學習的演算法開心。...

機器學習實戰 KNN演算法

機器學習作為人工智慧的重要分支,同時也是資料探勘中不可或缺的演算法支撐。本人接觸時間不短,但研究尚淺。我計畫用python來實現機器學習中較為常見的演算法。看透了自己,便無須小看別人。老舍 機器學習 機器學習是一類演算法的總稱,可以分為監督學習和無監督學習。半監督學習是結合監督學習與無監督學習的一種...

機器學習實戰之knn演算法

程式 author xiaoyun from numpy import import operator def createdataset group array 1.0,0.9 1.0,1.0 0.1,0.2 0.0,0.1 labels a a b b return group,labels d...