首先建立乙個模組knn.py,寫乙個生成資料的函式
from numpy import *
import operator
defcreatedataset
(): group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['a','a','b','b']
return group, labels
在python shell 中要呼叫這個函式,首先要到該模組所在路徑,使用os模組中的函式:
import os
檢視當前路徑 os.getcwd()
更改當前路徑 os.chdir()
在所在路徑下先import knn,再使用group, labels = knn.createdataset()即可生成資料。
: 1.計算當前點和訓練集中的每個點的歐氏距離
2.從小到大排序後取訓練集中前k個點
3.返回這些點中出現頻率最高的
python實現:
def
classify0
(inx,dataset,labels,k):
size = dataset.shape[0]
tmp = tile(inx,(size,1)) - dataset
tmp **= 2
tmp = tmp.sum(axis = 1)
tmp **= 0.5
indice = tmp.argsort()
count = {}
for i in range(k):
lb = labels[indice[i]]
count[lb] = count.get(lb,0) + 1
sortedcount = sorted(count.iteritems(),key = operator.itemgetter(1), reverse = true)
return sortedcount[0][0]
語法解析:
1.shape返回array大小,shape[0]為第一維大小(訓練集資料數量)
2.tile(a,reg):把a按照reg的形式複製,即:reg是乙個矩陣,把矩陣中的每個元素用a替代就是最後結果。例子:
>>> a = np.array([0, 1, 2])
>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a, (2, 2))
array([[0, 1, 2, 0, 1, 2],
[0, 1, 2, 0, 1, 2]])
>>> np.tile(a, (2, 1, 2))
array([[[0, 1, 2, 0, 1, 2]],
[[0, 1, 2, 0, 1, 2]]])
>>> b = np.array([[1, 2], [3, 4]])
>>> np.tile(b, 2)
array([[1, 2, 1, 2],
[3, 4, 3, 4]])
3.argsort(),返回排序後的下標array
4.字典dict.get(key,x)查詢鍵為key的value,如果不存在返回x。(用來初始化很方便)
5.sorted只能用於可迭代型別,因此字典必須用dict.iteritems()返回迭代器。sorted返回結果為list。
6.operator.itemgetter(i)返回物件的第i+1個元素,相當於匿名函式。
5,6的詳解可以看
def
file2matrix
(filename):
fr = open(filename)
classvector =
data = fr.readlines()
linenumber = len(data)
resmat = zeros((linenumber,3))
index = 0
for line in data:
line = line.strip()
linelist = line.split(' ')
resmat[index,:] = linelist[0:3]
index += 1
return resmat, classvector
語法解析:
1.readlines從乙個檔案中逐行讀入,並存入乙個list中
2.str.strip():去掉首尾的指定字元,若沒有則去掉首尾空格
3.str.split():以指定字元為分割符分割字串,不指定則為空格
4.把字串型數字賦值給numpy.array時會自動轉成數字型別
def
plot
(datingdatamat):
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingdatamat[:,1],datingdatamat[:,2])
plt.show()
語法解析:
1.figure 建立一張新的影象
2.add_subplot(111) 表示把影象分割為1行1列,當前子影象畫在第1塊
3.scatter(x,y) 以x為x座標,y為y座標繪製散點圖
每個數字由32*32的灰度圖表示,即256個0,1值組成的向量,後面緊跟乙個大小為10的label向量
def
readdata
(filename):
fr = open(filename)
data = fr.readlines()
fr.close()
n = len(data)
datamat = zeros((n,256))
datalabels =
for i in range(n):
vals = data[i].split()
datamat[i,:] = vals[0:256]
return datamat, datalabels
def
test
(): datamat, datalabels = readdata(r"e:\mldata\handwritednumbers\semeion.data")
m = datamat.shape[0]
testnum = int(m * 0.1)
wrongnum = 0
for i in range(testnum):
ans = classify0(datamat[i,:], datamat[testnum:,:], datalabels[testnum:], 5)
if (ans != datalabels[i]): wrongnum += 1
print double(wrongnum) / testnum
list.index(n)返回list中第乙個n的下標
最終發現**錯誤率只有3%。(這麼簡單的演算法竟然效果這麼好,感受到了ml的強大)。
最後附上k值為1~20內的錯誤率:
1 0.0440251572327
2 0.062893081761
3 0.0440251572327
4 0.0503144654088
5 0.0314465408805
6 0.0503144654088
7 0.0440251572327
8 0.0377358490566
9 0.0377358490566
10 0.0503144654088
11 0.0377358490566
12 0.0377358490566
13 0.0440251572327
14 0.0440251572327
15 0.0440251572327
16 0.0377358490566
17 0.0440251572327
18 0.0440251572327
19 0.0377358490566
可以發現並沒有明顯規律 機器學習實戰 kNN
一 演算法過程 1 首先存在乙個資料集作為訓練樣本集dataset,比如訓練樣本的資料中,每一條資料都包含乙個城市的某一天空氣中的pm2.5,no2濃度等維度的特徵值。每一條資料同時包含乙個標籤,比如這一天的空氣質素是優,良,輕度汙染,中度汙染,重度汙染中的乙個。2 現在我們輸入一條資料inx,如包...
機器學習實戰 KNN
import numpy as np import operator def createdataset group np.array 1.0,1.1 1.0,1.0 0,0 0,0.1 labels a a b b return group,labels def classify0 inx,dat...
機器學習實戰 kNN
k 近鄰演算法 knn k nearest neighbors 測量不同特徵值之間的距離方法進行分類。有乙個樣本資料集 每個樣本都存在標籤 輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,提取樣本集中特徵最相似資料 最近鄰 的分類標籤。一般,只選擇樣本資料中前k個最相似的...