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個點就是乙個為正方形,兩個為三...