KNN_python

#coding:utf-8
from numpy import *
import operator
def file2matrix(filename):
    fr=open(filename)
    arrline=fr.readlines()
    lenth=len(arrline)
    matrix=zeros((lenth,3))#3表示特征个数
    label=[]
    index=0
    for line in arrline:
        line=line.strip()
        linearr=line.split("	")
        matrix[index,:]=linearr[0:3]
        label.append(linearr[-1])
        index=index+1
    return matrix,label
def Norm(data):#特征取值差异较大时,容易出现向取值大特征偏向,故一般情况都需要正则化训练集
    minval=data.min(0)
    maxval=data.max(0)
    m=len(data)
    maxjmin=maxval-minval
    fenmu=data-tile(minval,(m,1))
    norm=fenmu/tile(maxjmin,(m,1))
    return norm
def classifier(testdata,data,label,k):#采用欧式距离作为量度
    lenth=data.shape[0]
    jian=data-tile(testdata,(lenth,1))
    sqr=jian**2
    add=sqr.sum(1)
    ksqr=add**0.5
    sortindex=ksqr.argsort()#为了统计标签频次,将索引作为列表值
    dict={}
    for i in range(k):
        lab=label[sortindex[i]]
        dict[lab]=dict.get(lab,0)+1
    resort=sorted(dict.iteritems(),key=operator.itemgetter(1),reverse=True)
    return resort[0][0]
def testclassifier():
    rat=0.05#将训练集的%5作为测试集
    data,label=file2matrix("dat.txt")
    norm=Norm(data)
    m=norm.shape[0]
    testdata=int(rat*m)
    error=0.0
    for i in range(testdata):
        result=classifier(norm[i,:],norm[testdata:m,:],label[testdata:m],3)
        if result!=label[i]:
            error+=1.0
    print error/float(testdata)
testclassifier()
原文地址:https://www.cnblogs.com/semen/p/6958978.html