Python实现的KNN分类器

来源:互联网 发布:mfc图形界面编程实例 编辑:程序博客网 时间:2024/06/06 16:40

knn.py

# -*- coding: UTF-8 -*-'''Created on 2016-4-24@author: taiji1985'''import numpy as npimport operatorimport matplotlib.pyplot as plt#创建一个测试用的数据集def createDataSet():    X = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])    ylabel = np.array([0,0,1,1])    return {'X':X,'ylabel':ylabel}#根据x和y创建数据集def createDataset2(x,y):    return {'X':x,'ylabel':y}#绘图def plotData(ds,type='o'):    X= ds['X']    y=ds['ylabel']    n = X.shape[0]    cn = len(np.unique(y))    cs = ['r','g']    dd  = np.arange(n)    for i in range(2):        index= y == i        xx=X[dd[index]]        plt.plot(xx[:,0],xx[:,1],type,markerfacecolor=cs[i],markersize=14)#对多个样本进行分类def classify(x,dataSet,k):    n = x.shape[0]    ret = np.zeros(n,'uint8')    for i in range(n):        ret[i] = _classify(x[i], dataSet, k)    return ret    pass#对一个样本进行分类def _classify(x,dataSet,k):    X= dataSet['X']    ylabel = dataSet['ylabel']    n = X.shape[0]    cls_label = np.unique(ylabel)    cn=len(cls_label)    # $d=\sqrt{\sum{(x-x_i)^2}}$ 下面公式忽略求平方根因为不影响结果    d=np.tile(x,(n,1)) - X #扩展为n行并求差    d = (d*d).sum(axis=1) #求和    sort_idx  = d.argsort()    vote = np.zeros((cn,1),'uint8')    for i in range(k):        vl = ylabel[sort_idx[i]]        vote[vl]+= 1    #print vote    return np.argmax(vote)    pass

测试

'''Created on 2016-4-24@author: taiji1985'''import numpy as npimport matplotlib.pyplot as pltfrom ml import knnd=knn.createDataSet()X= d['X']y=d['ylabel']cn = 2plt.figure()knn.plotData(d,'o')plt.axis([-1, 2, -1, 2])x = np.random.randn(100,2)+1r =  knn.classify(x, d,2)#plt.plot(x[0],x[1],'*',markerfacecolor=cs[r],markersize=12)d2=knn.createDataset2(x,r)print d['ylabel'].shapeprint d2['ylabel'].shapeknn.plotData(d2, '*')plt.show()

参考

[1] 《机器学习实战》

0 0
原创粉丝点击