天天看點

KNN近鄰分類

from numpy import *
import operator
def createDataSet():#建立訓練集
    group=array([[,],[,],[,],[,]])
    labels=['A','A','B','B']
    return group,labels
def classify0(inX,dataSet,labels,k):
    #index為輸入 如[2,3],dataset為訓練樣本集,k為選擇最近鄰居的數目
    dataSetSize=dataSet.shape[]  #行數
    diffMat=tile(inX,(dataSetSize,))-dataSet
    sqDiffMat=diffMat**
    sqDistances=sqDiffMat.sum(axis=)#行向量相加
    distances=sqDistances**  #計算歐氏距離
    sortedDisIndicies=distances.argsort() #距離由小到大的數組索引值,
    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDisIndicies[i]] #統計前k個點所在類别出現的頻率
        classCount[voteIlabel]=classCount.get(voteIlabel,)+
        sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(),reverse=True)#按類别的頻率書降序排列
        return sortedClassCount[][]#排第一的類别
group,labels=createDataSet()
myclass=classify0([,],group,labels,)
print myclass
           

結果: B

# -*- coding:utf-8 -*-  
from numpy import *
import operator

def classify0(inX,dataSet,labels,k):
    #index為輸入 如[2,3],dataset為訓練樣本集,k為選擇最近鄰居的數目
    dataSetSize=dataSet.shape[]  #行數
    diffMat=tile(inX,(dataSetSize,))-dataSet
    sqDiffMat=diffMat**
    sqDistances=sqDiffMat.sum(axis=)#行向量相加
    distances=sqDistances**  #計算歐氏距離
    sortedDisIndicies=distances.argsort() #距離由小到大的數組索引值,
    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDisIndicies[i]] #統計前k個點所在類别出現的頻率
        classCount[voteIlabel]=classCount.get(voteIlabel,)+
        sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(),reverse=True)#按類别的頻率書降序排列
        return sortedClassCount[][]#排第一的類别

def file2matrix(filename):#資料處理
    fr=open(filename)
    arrayOfLines=fr.readlines()
    numberOfLines=len(arrayOfLines)
    returnMat=zeros((numberOfLines,))
    classLabelVector=[]
    i=
    for line in arrayOfLines:
        line=line.strip()
        listFromLine=line.split('\t')
        returnMat[i,:]=listFromLine[:]
        classLabelVector.append(int(listFromLine[-]))
        i=i+
    return returnMat,classLabelVector

def autoNorm(dataSet):#歸一化特征值
    minValues=dataSet.min()
    maxValues=dataSet.max()
    DValues=maxValues-minValues
    normDataSet=zeros(shape(dataSet))
    m=dataSet.shape[]
    normDataSet=dataSet-tile(minValues,(m,))
    normDataSet=normDataSet/tile (DValues,(m,))
    return normDataSet,DValues,minValues

def datingClassTest():#劃分訓練集和測試集
    hoRatio=#10%用于test
    datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
    normMat,Dvalues,minValues=autoNorm(datingDataMat)
    m=normMat.shape[]
    numTestVecs=int(m*hoRatio)
    errorCount=
    for i in range(numTestVecs):
        classifierResult=classify0(normMat[i,:],normMat[numTestVecs:,:],datingLabels[numTestVecs:],)
        print "the classifier comeback with:%d,the real answer is:%d"%(classifierResult,datingLabels[i])
        if(classifierResult!=datingLabels[i]):
            errorCount+=
    print "the total error rate is:%f"%(errorCount/float(numTestVecs))
           

繼續閱讀