1. 程式人生 > >[1] python 實現簡單KNN

[1] python 實現簡單KNN

nbsp 設置 輸入一個數 簡單的 .py num knn .net 可變

KNN基本步驟:計算與已知數據的距離,選擇k個最近距離的數據,看這k個數據的標簽最多屬於什麽類,預測未知數據的分類

1、新建一個KNN.py模塊

需要使用numpy

from numpy import *
import operator

2. 向模塊添加已知的數據和標簽

def createDataSet():
    group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels=[A,A,B,B]
    return group, labels

3.對未知數據的分類

def classify0(inX, dataset,labels,k):
    
# 計算輸入數據和已有所有數據的距離 dataSetSize=dataset.shape[0] diffMat=tile(inX,(dataSetSize,1))-dataset sqDiffMat=diffMat**2 sqDistances=sqDiffMat.sum(axis=1) #沒有axis參數表示全部相加,axis=0表示按列相加,axis=1表示按照行的方向相加 distances=sqDistances**0.5 #排序 sortedDistIndex=distances.argsort() #argsort將數據從小到大排列,並返回其索引值
# 選擇距離最小的k個點 classCount={} #字典類型 for i in range(k): votelabel=labels[sortedDistIndex[i]] classCount[votelabel]=classCount.get(votelabel,0)+1 sortedClasscount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) return sortedClasscount[0][0]

4.測試一下這個模型

import KNN
group,labels=KNN.createDataSet()
newlabel=KNN.classify0([0,0],group,labels,3)
print(newlabel)

結果是B

也可以測試其他數據;這是最簡單的KNN例子,參照機器學習實戰;

主要是為了自己理解和記憶(新手入門)

其中,關於python的一些用法,記錄在此,方便查閱

  • shape函數是numpy.core.fromnumeric中的函數,它的功能是讀取矩陣的長度,比如shape[0]就是讀取矩陣第一維度的長度。它的輸入參數可以使一個整數表示維度,也可以是一個矩陣。

輸入一個數,返回空;可以快速讀取一個數組的形狀;可以只讀取一維的長度;

shape(3)
Out[4]: ()

e=eye(3)

e
Out[6]: 
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

e.shape
Out[7]: (3, 3)

e.shape[0]
Out[8]: 3
  • tile函數位於python模塊 numpy.lib.shape_base中,他的功能是重復某個數組。比如tile(A,n),功能是將數組A重復n次,構成一個新的數組
  • a=[0,1,2]
    
    b=tile(a,2)
    
    b
    Out[12]: array([0, 1, 2, 0, 1, 2])
    
    c=tile(a,(1,2))
    
    c
    Out[14]: array([[0, 1, 2, 0, 1, 2]])
    
    d=tile(a,(3,1))
    
    d
    Out[16]: 
    array([[0, 1, 2],
           [0, 1, 2],
           [0, 1, 2]])
  • sum
  • sum(iterable[, start])
    • iterable -- 可叠代對象,如列表。
    • start -- 指定相加的參數,如果沒有設置這個值,默認為0
  • .sum

aa=array([[0,1,2],[3,4,5]]); aa.sum() Out[22]: 15 aa.sum(axis=0) Out[23]: array([3, 5, 7]) aa.sum(axis=1) Out[24]: array([ 3, 12])

默認所有數相加,axis=0,列相加;axis=1,行相加。

  • argsort

argsort(a, axis=-1, kind=quicksort, order=None)

具體實例可參見:https://blog.csdn.net/maoersong/article/details/21875705

a是需要排序的數組,返回的是索引值

distance=array([0.3,0.5,0.8,0.4])

index=distance.argsort()

index
Out[27]: array([0, 3, 1, 2], dtype=int64)
aa=array([[0,1,2],[3,4,5]]);

x=aa.argsort(axis=0)

x
Out[30]: 
array([[0, 0, 0],
       [1, 1, 1]], dtype=int64)

x=aa.argsort(axis=1)

x
Out[32]: 
array([[0, 1, 2],
       [0, 1, 2]], dtype=int64)

axis=0 按列;axis=1 按行;

  • 字典類型

字典是另一種可變容器模型,且可存儲任意類型對象。

字典的每個鍵值 key=>value 對用冒號 : 分割,每個鍵值對之間用逗號 , 分割,整個字典包括在花括號 {} 中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }
dict = {a: 1, b: 2, b: 3}

dict[b]
Out[34]: 3

dict
Out[35]: {a: 1, b: 3}

鍵一般是唯一的,如果重復會被後一個覆蓋,但是值不是唯一的;

  • sorted

詳細講解參見:http://www.cnblogs.com/woshitianma/p/3222989.html

sorted(iterable[,cmp,[,key[,reverse=True]]])
students = [(john, A, 15), (jane, B, 12), (dave, B, 10),]

sorted(students, key=lambda student : student[2])
Out[42]: [(dave, B, 10), (jane, B, 12), (john, A, 15)]

from operator import itemgetter, attrgetter

sorted(students, key=itemgetter(2))
Out[44]: [(dave, B, 10), (jane, B, 12), (john, A, 15)]

sorted(students, key=itemgetter(1,2))
Out[45]: [(john, A, 15), (dave, B, 10), (jane, B, 12)]

對字典排序,返回list,不再是字典

d = {data1:3, data2:1, data3:2, data4:4}

sorted(d.items(), key=itemgetter(1), reverse=True)
Out[47]: [(data4, 4), (data1, 3), (data3, 2), (data2, 1)]

sorted(d.items(), key=itemgetter(1))
Out[48]: [(data2, 1), (data3, 2), (data1, 3), (data4, 4)]

  • items
 dict = {Google: www.google.com, Runoob: www.runoob.com, taobao: www.taobao.com}

dict.items()
Out[39]: dict_items([(Google, www.google.com), (Runoob, www.runoob.com), (taobao, www.taobao.com)])

Python 字典(Dictionary) items() 函數以列表返回可遍歷的(鍵, 值) 元組數組。

新版本不再使用iteritems

[1] python 實現簡單KNN