python中knn算法实现

来源:互联网 发布:一宿觉禅修营网络讲堂 编辑:程序博客网 时间:2024/05/10 18:40
代码参考机器学习实战那本书

有兴趣你们可以去了解下

#coding:  utf-8'''@author:zhoumeixucreatedate:2015年8月27日'''#np.zeros((4,2))#np.zeros(8).reshape(4,2)#x=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])    np.zeros_like(x)# 最值和排序:最值有np.max(),np.min() 他们都有axis和out(输出)参数, # 而通过np.argmax(), np.argmin()可以得到取得最大或最小值时的 下标。# 排序通过np.sort(), 而np.argsort()得到的是排序后的数据原来位置的下标# 简单实现knn算法的基本思路import numpy as npimport   operator  #运算符操作包from _ctypes import Arrayfrom statsmodels.sandbox.regression.kernridgeregress_class import plt_closealldef  createDataSet():    group=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])    labels=['A','A','B','B']    return group ,labelsgroup,labels=createDataSet()def  classify0(inx,dataSet,labels,k):    dataSetSize=dataSet.shape[0]    diffMat=np.tile(inx,(dataSetSize,1))-dataSet    sqDiffMat=diffMat**2    sqDistances=sqDiffMat.sum(axis=1)    distances=sqDistances**0.5            #计算距离 python中会自动广播的形式    sortedDistIndicies=distances.argsort()  #排序,得到原来数据的在原来所在的下标    classCount={}    for  i in range(k):        voteIlabel=labels[sortedDistIndicies[i]]  # 计算距离最近的值所在label标签        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1    # 计算距离最近的值所在label标签,对前k哥最近数据进行累加            sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)  #排序得到距离k个最近的数所在的标签    return sortedClassCount[0][0]if __name__=='__main__':    print(classify0([0,0],group,labels,4))    # 利用knn算法改进约会网站的配对效果def  file2matrix(filename):    fr=open(filename)    arrayOLines=fr.readlines()    numberOfLines=len(arrayOLines)    returnMat=np.zeros((numberOfLines,3))    classLabelVector=[]    index=0    for line in arrayOLines:        line=line.strip()        listFromLine=line.split('\t')        returnMat[index,:]=listFromLine[0:3]        classLabelVector.append(int(listFromLine[-1]))        index+=1    return returnMat ,classLabelVector   #生成训练数据的array和目标arraypath=u'D:\\Users\\zhoumeixu204\\Desktop\\python语言机器学习\\机器学习实战代码   python\\机器学习实战代码\\machinelearninginaction\\Ch02\\'datingDataMat,datingLabels=file2matrix(path+'datingTestSet2.txt')import  matplotlibimport  matplotlib.pyplot as pltfig=plt.figure()ax=fig.add_subplot(111)ax.scatter(datingDataMat[:,1],datingDataMat[:,2])plt.show()ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*np.array(datingLabels),15*np.array(datingDataMat[:,2]))plt.show()      #生成训练数据的array和目标arraydef  autoNorm(dataset):    minVals=dataset.min(0)    maxVals=dataset.max(0)    ranges=maxVals-minVals    normeDataSet=np.zeros(np.shape(dataset))    m=dataset.shape[0]    normDataSet=dataset-np.tile(minVals,(m,1))    normDataSet=normDataSet/np.tile(ranges,(m,1))    return  normDataSet ,ranges,minVals    normMat,ranges,minVals=autoNorm(datingDataMat)  def   datingClassTest():    hoRatio=0.1    datingDataMat,datingLabels=file2matrix(path+'datingTestSet2.txt')    normMat,ranges,minVals=autoNorm(datingDataMat)    m=normMat.shape[0]    numTestVecs=int(m*hoRatio)    errorCount=0.0    for  i in range(numTestVecs):        classifierResult=classify0(normMat[i,:], normMat[numTestVecs:m,:], datingLabels[numTestVecs:m],3)        print "the classifier came back  with :%d,the  real answer is :%d"\                  %(classifierResult,datingLabels[i])        if  classifierResult!=datingLabels[i]:            errorCount+=1.0    print "the  total error rare is :%f"%(errorCount/float(numTestVecs))  #利用knn算法测试错误率 if __name__=='__main__':    datingClassTest()#利用构建好的模型进行预测def   classifyPerson():    resultList=['not at all','in same doses','in large d oses']    percentTats=float(raw_input("percentage  if time spent playin cideo  games:"))    ffMiles=float(raw_input("frequnet  fliter  miles earned  per year:"))    iceCream=float(raw_input("liters of ice cream consumed per year:"))      datingDataMat,datingLabels=file2matrix(path+'datingTestSet2.txt')       normMat,ranges,minVals=autoNorm(datingDataMat)    inArr=np.array([ffMiles,percentTats,iceCream])    classifierResult=classify0((inArr-minVals)/ranges,normMat,datingLabels,3)    print("you  will probably  like  the person:",resultList[classifierResult-1])    if  __name__!='__main__':    classifyPerson()#利用knn算法进行手写识别系统验证path=u'D:\\Users\\zhoumeixu204\\Desktop\\python语言机器学习\\机器学习实战代码   python\\机器学习实战代码\\machinelearninginaction\\Ch02\\'def img2vector(filename):    returnVect=np.zeros((1,1024))    fr=open(filename)    for i in range(32):        lineStr=fr.readline()        for j in range(32):            returnVect[0,32*i+j]=int(lineStr[j])    return returnVecttestVector=img2vector(path+'testDigits\\0_13.txt')print(testVector[0,0:31])import osdef   handwritingClassTest():    hwLabels=[]    trainingFileList=os.listdir(path+'trainingDigits')    m=len(trainingFileList)    trainingMat=np.zeros((m,1024))    for   i in range(m):        fileNameStr=trainingFileList[i]        fileStr=fileNameStr.split('.')[0]        classNumStr=int(fileStr.split('_')[0])        hwLabels.append(classNumStr)        trainingMat[i,:]=img2vector(path+'trainingDigits\\'+fileNameStr)    testFileList=os.listdir(path+'testDigits')    errorCount=0.0    mTest=len(testFileList)    for j in range(mTest):        fileNameStr=testFileList[j]        fileStr=fileNameStr.split('.')[0]        classNumStr=int(fileNameStr.split('_')[0])        classNumStr=int(fileStr.split('_')[0])        vectorUnderTest=img2vector(path+'testDigits\\'+fileNameStr)        classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)        print("the  classifier canme back with:%d,the real answer is :%d"%(classifierResult,classNumStr))        if classifierResult!=classNumStr:            errorCount+=1.0    print("\nthe total  number of  errors is :%d"%errorCount)    print("\n the total error rate is :%f"%(errorCount/float(mTest)))if  __name__=='__main__':    handwritingClassTest()


0 0