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)以sklearn中的 iris 資料集為例說明其呼叫過程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機器學習包中的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...