《機器學習實戰》實踐心得 kNN篇

2021-07-10 02:11:07 字數 4435 閱讀 8732

首先建立乙個模組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個最相似的...