《機器學習實戰》之K 近鄰演算法

2022-06-19 13:45:09 字數 4856 閱讀 6313

k-近鄰演算法實現:

from numpy import *

import

operator

from os import

listdir

#資料集

defcreatedataset():

group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

labels = ['

a','

a','

b','b'

]

return

group, labels#呼叫

group,labels =createdataset()

print('x:'

,group)

print('y:'

,labels)

print('

………………')

#k-近鄰演算法,四個引數:用於分類的輸入向量(新輸入資料),輸入的訓練樣本集,標籤向量,用於選擇最近鄰居的數目

defclassify0(inx, dataset, labels, k):

#返回行數

datasetsize =dataset.shape[0]

#新輸入的資料減去訓練樣本集

diffmat = tile(inx, (datasetsize,1)) -dataset

#計算平方

sqdiffmat = diffmat**2

#計算平方和

sqdistances = sqdiffmat.sum(axis=1)

#對平方和開方

distances = sqdistances**0.5

#distances從小到大排序

sorteddistindicies =distances.argsort()

classcount={}

#只對距離最短的前k個點遍歷

for i in

range(k):

voteilabel =labels[sorteddistindicies[i]]

#計算出現的頻率

classcount[voteilabel] = classcount.get(voteilabel,0) + 1

#以出現的頻率進行排序,從大到小

sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=true)

#返回出現頻率最大的分類

return

sortedclasscount[0][0]

#解析文字資訊

deffile2matrix(filename):

fr =open(filename)

#獲取文字行數

numberoflines =len(fr.readlines())

#建立以0填充的矩陣,為簡化處理將該矩陣的另一維設定為固定值3

returnmat = zeros((numberoflines,3))

classlabelvector =

fr =open(filename)

index =0

for line in

fr.readlines():

line =line.strip()

listfromline = line.split('\t'

)

#將x的所有column取出

returnmat[index,:] = listfromline[0:3]

#將y取出

index += 1

return

returnmat,classlabelvector#呼叫

filename = "

f://python入門//檔案//machinelearninginaction//ch02

"datingdatamat,datinglabels =file2matrix(filename)

print('

x對應的資料集為:\n

',datingdatamat[:10])

print('

y對應的資料集為:\n

',datinglabels[:10])

print('

………………')

#使用matplotlib建立散點圖

#import matplotlib

import

matplotlib.pyplot as plt

fig =plt.figure()

ax = fig.add_subplot(111)

ax.scatter(datingdatamat[:,1],datingdatamat[:,2])

plt.show()

print('

………………')

import

matplotlib.pyplot as plt

fig =plt.figure()

ax = fig.add_subplot(111)

ax.scatter(datingdatamat[:,1],datingdatamat[:,2],\

15.0*array(datinglabels),15.0*array(datinglabels))

plt.show()

print('

………………')

#準備資料:歸一化數值

defautonorm(dataset):

minvals =dataset.min(0)

maxvals =dataset.max(0)

#最大值減最小值

ranges = maxvals -minvals

normdataset =zeros(shape(dataset))

m =dataset.shape[0]

#tile()函式將變數內容複製成輸入矩陣同樣大小的矩陣

normdataset = dataset - tile(minvals, (m,1))

normdataset = normdataset/tile(ranges, (m,1))

#返回歸一化的數值,範圍,最小值

return

normdataset, ranges, minvals#呼叫

normmat,ranges,minvals =autonorm(datingdatamat)

print('

歸一化後的數值:

',normmat[:10])

print('

範圍:'

,ranges)

print('

最小值:

',minvals)

結果:

x: [[1.  1.1]

[1. 1. ]

[0. 0. ]

[0. 0.1]]

y: ['a

', '

a', '

b', 'b'

]………………

x對應的資料集為:

[[4.0920000e+04 8.3269760e+00 9.5395200e-01]

[1.4488000e+04 7.1534690e+00 1.6739040e+00]

[2.6052000e+04 1.4418710e+00 8.0512400e-01]

[7.5136000e+04 1.3147394e+01 4.2896400e-01]

[3.8344000e+04 1.6697880e+00 1.3429600e-01]

[7.2993000e+04 1.0141740e+01 1.0329550e+00]

[3.5948000e+04 6.8307920e+00 1.2131920e+00]

[4.2666000e+04 1.3276369e+01 5.4388000e-01]

[6.7497000e+04 8.6315770e+00 7.4927800e-01]

[3.5483000e+04 1.2273169e+01 1.5080530e+00]]

y對應的資料集為:

歸一化後的數值: [[0.44832535 0.39805139 0.56233353]

[0.15873259 0.34195467 0.98724416]

[0.28542943 0.06892523 0.47449629]

[0.82320073 0.62848007 0.25248929]

[0.42010233 0.07982027 0.0785783]

[0.79972171 0.48480189 0.60896055]

[0.39385141 0.32652986 0.71533516]

[0.46745478 0.63464542 0.32031191]

[0.73950675 0.41261212 0.44153637]

[0.38875681 0.58668982 0.88936006]]

範圍: [9.1273000e+04 2.0919349e+01 1.6943610e+00]

最小值: [0. 0. 0.001156]

機器學習實戰之K 近鄰演算法

k 近鄰演算法工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的資料進行比較,然後演算法提取樣本集中特徵最相似資料 最鄰近 的分類標籤。一般來說,我們只選取樣本資料集...

機器學習實戰之 k 近鄰演算法

k 近鄰演算法 knn 採用測量不同特徵值之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定。缺點 計算複雜度高 空間複雜度高。適用資料範圍 數值型和標稱型。描述 存在乙個樣本資料集合,樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸人沒有標籤的新資料...

機器學習實戰之k近鄰演算法

k近鄰演算法 或者說k最近鄰 knn,k nearestneighbor 在乙個空間中有許多樣本,這時候來了乙個新的樣本即測試點,那麼如何判斷這個樣本的類別。做法就是求測試點和空間中每個樣本的距離,用距離最近的前k個判斷。比如下圖新來了乙個點,這時候k 3,離它最近的3個點就是乙個為正方形,兩個為三...