機器學習02 k近鄰模型
k近鄰的主要思想就是首先將資料分為訓練資料集和測試資料集。然後用訓練資料集來建立模型。通過判斷測試資料到其他訓練資料集中的歐式距離然後排序,選取離測試資料點最近的k個資料,然後根據這k個資料的類別及多數表決原則,來決定此測試點的資料類別。
接下來是具體例項:
這裡僅用乙個測試點來說明問題。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import kneighborsclassifier
import matplotlib as mpl
from collections import counter
#data載入資料
iris=
load_iris()
df=pd.
dataframe
(iris.data,columns=iris.feature_names)
df['label'
]=iris.target
df.columns =
['sepal length'
,'sepal width'
,'petal length'
,'petal width'
,'label'
]plt.
scatter
(df[:50
]['sepal length'
],df[:50
]['sepal width'
],label=
'0')
plt.
scatter
(df[50:
100]
['sepal length'
],df[50:
100]
['sepal width'
],label=
'1')
plt.xlabel=
('sepal length'
)plt.ylabel=
('sepal width'
)plt.
legend()
plt.
show()
data=np.
array
(df.iloc[
:100,[
0,1,
-1]]
)x,y=data[:,
:-1]
,data[:,
-1]x_train,x_test,y_train,y_test=
train_test_split
(x,y,test_size=
0.2)
class knn:
def __init__
(self, x_train, y_train, n_neighbors=
3, p=2)
:"""
parameter: n_neighbors 臨近點個數
parameter: p 距離度量
"""self.n = n_neighbors
self.p = p
self.x_train = x_train
self.y_train = y_train
def predict
(self, x)
: # 取出n個點
knn_list =
for i in range
(self.n)
:#np.linalg.norm用來進行範數運算,ord=2表示二範數
dist = np.linalg.
norm
(x - self.x_train[i]
, ord=self.p)
#將測試點與取出的n個數之間的距離,以及這n個數的類別儲存在knn_list中
knn_list.
((dist, self.y_train[i]))
#再從剩下的x_train-n個資料中進行依次距離計算,
#將這些資料中與測試點距離小於剛剛取出來的k個資料中的距離時,進行替換。
#達到取出來的k個資料到測試點的距離為最短距離的目的。
for i in range
(self.n,
len(self.x_train)):
#max(knn_list,key=lambda x:x[0])是把knn_list中的資料按照x[0]第一位素(距離)進行比較取最大值,再取其索引賦值給max_index。
max_index = knn_list.
index
(max
(knn_list, key=lambda x: x[0]
))#計算測試點到剩餘資料的距離
dist = np.linalg.
norm
(x - self.x_train[i]
, ord=self.p)
#如果knn_list中的最大距離的點的距離大於其餘點計算的距離,
if knn_list[max_index][0
]> dist:
knn_list[max_index]
=(dist, self.y_train[i]
) # 統計
#將knn_list中的k[-1
](即,點的類別)進行統計。
knn =
[k[-1]
for k in knn_list]
#counter()可以用於計數,會返回乙個key為列表的值,value為該值出現個數,的對
count_pairs =
counter
(knn)
# max_count = sorted(count_pairs, key=lambda x: x)[-1]
#將count_pairs中的資料排序,最終將[-1
][0]即出現次數最多的類別給max_count
max_count =
sorted
(count_pairs.
items()
, key=lambda x: x[1]
)[-1
][0]
return max_count
def score
(self, x_test, y_test)
: right_count =
0 n =
10#zip即打包為元組
for x, y in zip
(x_test, y_test)
: label = self.
predict
(x)if label == y:
right_count +=1
return right_count /
len(x_test)
#clf即classifier的縮寫
clf =
knn(x_train, y_train)
clf.
score
(x_test, y_test)
test_point =
[5.0
,3.5
]#輸出測試點的分類
print
('test point: {}'
.format
(clf.
predict
(test_point)))
plt.
scatter
(df[:50
]['sepal length'
], df[:50
]['sepal width'
], label=
'0')
plt.
scatter
(df[50:
100]
['sepal length'
], df[50:
100]
['sepal width'
], label=
'1')
plt.
plot
(test_point[0]
, test_point[1]
,'bo'
, label=
'test_point'
)plt.
legend()
plt.
show
()
至此我們可以簡單了解了knn模型的原理。但是為了提高k近鄰搜尋的效率,可以考慮用特殊的結構來儲存訓練資料。即kd樹。 機器學習演算法02 K近鄰演算法實戰
摘要 本文主要介紹knn演算法的原理和實列。包括演算法描述 演算法缺點 演算法概述。若乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本的大多數是屬於類別a,則該樣本也是屬於a類。已存在乙個帶標籤的資料庫,對輸入沒有標籤的新資料後。將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演...
機器學習實戰 02 k臨近
採用測量不同特徵值之間的距離 優點 精度高 對異常值不敏感 無資料輸入假定。缺點 計算複雜度高 空間複雜度高。適用資料範圍 數值型和標稱型。工作原理 存在乙個樣本資料集,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料...
機器學習 k 近鄰模型
k 近鄰法模型實際上對應於模型空間的劃分。模型有三個基本要素 距離度量 不同距離度量下得到的最近鄰點是不同的。這意味著整體模型變的複雜,容易發生過擬合。如果選擇較大的 多數表決。多數表決法等價於經驗風險最小化。開始,構造根節點,根節點對應所有資料。依此對每個特徵做劃分,以特徵的中位數作為切分點,將資...