Python實現的KNN分類器

2021-07-11 09:57:33 字數 2133 閱讀 9750

# -*- coding: utf-8 -*-

'''created on 2016-4-24

@author: taiji1985

'''import numpy as np

import operator

import matplotlib.pyplot as plt

#建立乙個測試用的資料集

defcreatedataset

(): x = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

ylabel = np.array([0,0,1,1])

return

#根據x和y建立資料集

defcreatedataset2

(x,y):

return

#繪圖def

plotdata

(ds,type='o'):

x= ds['x']

y=ds['ylabel']

n = x.shape[0]

cn = len(np.unique(y))

cs = ['r','g']

dd = np.arange(n)

for i in range(2):

index= y == i

xx=x[dd[index]]

plt.plot(xx[:,0],xx[:,1],type,marke***cecolor=cs[i],markersize=14)

#對多個樣本進行分類

defclassify

(x,dataset,k):

n = x.shape[0]

ret = np.zeros(n,'uint8')

for i in range(n):

ret[i] = _classify(x[i], dataset, k)

return ret

pass

#對乙個樣本進行分類

def_classify

(x,dataset,k):

x= dataset['x']

ylabel = dataset['ylabel']

n = x.shape[0]

cls_label = np.unique(ylabel)

cn=len(cls_label)

# $d=\sqrt}$ 下面公式忽略求平方根因為不影響結果

d=np.tile(x,(n,1)) - x #擴充套件為n行並求差

d = (d*d).sum(axis=1) #求和

sort_idx = d.argsort()

vote = np.zeros((cn,1),'uint8')

for i in range(k):

vl = ylabel[sort_idx[i]]

vote[vl]+= 1

#print vote

return np.argmax(vote)

pass

'''

created on 2016-4-24

@author: taiji1985

'''import numpy as np

import matplotlib.pyplot as plt

from ml import knn

d=knn.createdataset()

x= d['x']

y=d['ylabel']

cn = 2

plt.figure()

knn.plotdata(d,'o')

plt.axis([-1, 2, -1, 2])

x = np.random.randn(100,2)+1

r = knn.classify(x, d,2)

#plt.plot(x[0],x[1],'*',marke***cecolor=cs[r],markersize=12)

d2=knn.createdataset2(x,r)

print d['ylabel'].shape

print d2['ylabel'].shape

knn.plotdata(d2, '*')

plt.show()

[1] 《機器學習實戰》

利用python實現KNN分類器

雖然已經熟悉掌握了knn分類器,但是關鍵還是要實現一遍,參考一些資料之後,實現如下 加了注釋 該程式實現了knn演算法 import numpy import operator def knnclassifier inx,dataset,labels,k inx 被分類的測試樣本 向量形式 data...

kNN分類器和Python演算法實現

假設生活中你突然遇到乙個陌生人,你對他很不了解,但是你知道他喜歡看什麼樣的電影,喜歡穿什麼樣的衣服。根據以前你的認知,你把你身邊的朋友根據喜歡的電影型別,和穿什麼樣的衣服,簡單的分為了兩類,有錢的和沒錢的。那你該怎麼將這個陌生人分類呢?物以類聚,人以群分,你看他喜歡看的電影和穿衣服的衣服和那群人比較...

python 實現 KNN 分類器 手寫識別

優點 進度高,對異常值不敏感,無資料輸入假定 缺點 計算複雜度高,空間複雜度高 適用資料範圍 數值型和標稱型 1 計算已知類別資料集中的點與當前點的距離 2 按照距離遞增次序排序,選取與當前點距離最小的 k 個點 3 確定前 k 個點所在類別的出現頻率 4 返回前 k 個點出現頻率最高的類別作為當前...