监督学习-k近邻算法模板

from numpy import *
import operator
def classify0(inX,dataSet,labels,k):
        dataSetSize=dataSet.shape[0]#类特征向量个数   
        diffMat=tile(inX,(dataSetSize,1))-dataSet#检验类到训练集的距离
        sqDiffMat=diffMat**2
        sqDistances=sqDiffMat.sum(axis=1)
        distances=sqDistances**0.5
        sortedDistIndicies=distances.argsort()#排序确定邻近类,每个数据位置不变,返回矩阵为其在排序中的位置  
        classCount={}
        for i in range(k):
                voteIlabel=labels[sortedDistIndicies[i]]#获得每个类标签
                classCount[voteIlabel]=classCount.get(voteIlabel,0)+1#排序给每个类加一
        sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)#将字典按权排序,取权值大的类
        return sortedClassCount[0][0]
def file2matrix(filename): 
        fr = open(filename)#打开训练集文本 
        arrayOLines = fr.readlines()#读取训练集并按特征向量分类,列表字符串
        numberOfLines =len(arrayOLines)#特征向量(类)个数
        returnMat = zeros((numberOfLines,3))#list属性描述用tuple 行三列三(3,3)
        classLabelVector = []
        index = 0
        for line in arrayOLines:
                line = line.strip()#去掉数据两端非数据字符 截取掉所有的回车字符
                listFromLine = line.split('\t')#切割字符串为列表 使用tab字符将上一步得到的整行数据分割成一个元素列表 我们选取前3个元素,将它们存储到特征矩阵中
                returnMat[index,:] = listFromLine[0:3]#index的整行复制属性
                classLabelVector.append(int(listFromLine[-1]))#添加每个特征向量的类别
                index += 1
        return returnMat,classLabelVector#返回训练集的类别矩阵,特征向量矩阵
def autoNorm(dataSet):#训练集,典型模式,归一化数据,减小数据规模
        minVals= dataSet.min(0)#每列最小值
        maxVals = dataSet.max(0)#每列最大值
        ranges = maxVals - minVals#每列跨度矩阵,通过最小矩阵可以求最大矩阵,注意四则运算为元素四则运算,需要保证矩阵规模一致
        normDataSet = zeros(shape(dataSet))#创建dataset同规模的矩阵
        m = dataSet.shape[0]
        normDataSet = dataSet - tile(minVals, (m, 1) )#矩阵元素减法
        normDataSet = normDataSet/tile(ranges, (m,1))#矩阵元素除法得到0-1的减小规模的数据
        return normDataSet, ranges, minVals#返回小规模数据,归一化数据
def datingClassTest():#测试分类器性能,数据百分之十用作测试,其他训练
        hoRatio = 0.10
        filename='datingTestSet2.txt'
        datingDataMat,datingLabels = file2matrix(filename)#整理数据
        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)#normMat[i,:] i行的所有元素的特征向量 normMat[numTestVecs;m,:] 后百分之九十的所有特征向量
                print('the classifier came back, with: %d, the real answer is: %d' % (classifierResult, datingLabels[i]))
                if (classifierResult != datingLabels[i]):
                        errorCount += 1#错误数
        print ("the total error rate is: %f" % (errorCount/float(numTestVecs)) )#错误率


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值