機器學習 02 K近鄰模型

2021-10-08 08:47:59 字數 4375 閱讀 2191

機器學習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 近鄰法模型實際上對應於模型空間的劃分。模型有三個基本要素 距離度量 不同距離度量下得到的最近鄰點是不同的。這意味著整體模型變的複雜,容易發生過擬合。如果選擇較大的 多數表決。多數表決法等價於經驗風險最小化。開始,構造根節點,根節點對應所有資料。依此對每個特徵做劃分,以特徵的中位數作為切分點,將資...