Machine Learning in Action/机器学习实践:kNN算法之约会问题

来源:互联网 发布:感恩节的由来 知乎 编辑:程序博客网 时间:2024/05/16 17:48

因为自己比较忙,就没有太多时间去学习python的基础知识,所以简单的看了一点py的语法,就直接上书开始敲代码了,中间遇到比较多的问题,所以就加了很多注释(用的python3)

from numpy import * #导入科学计算包Numpyimport operator   #导入运算符包# 创建数据集和标签def createDataSet():    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])    labels = ['A', 'A', 'B', 'B']    return group, labels'''    (1)计算已知类别数据集中的点与当前点的距离    (2)按照距离递增次序排列    (3)选取与当前点距离最小的k个点    (4)确定前k个点所属类别出现的频率    (5)返回频率最高的类别,作为当前点的预测分类'''def classify0(inX, dataSet, labels, k):    #set.shape[0] 求数组的行数。 set.shape[1]求数组的列数。求出源数据的行数    dataSetSize = dataSet.shape[0]    #tile(inX,(dataSetSize,1))将inX复制成一个dataSetSize行的数列, inX用于分类的向量,dataSet用于训练的向量,diffMat,用于分类的点,到各个点的向量    diffMat = tile(inX, (dataSetSize, 1)) - dataSet    sqDiffMat = diffMat**2    #.sum(axis=1)矩阵的每一行相加的和    sqDistances = sqDiffMat.sum(axis=1)    distances = sqDistances**0.5    #argsort()将数组排序之后的下标,由大到小返回    sortedDistIndicies = distances.argsort()    classCount = {}    for i in range(k):        #从1到k读取第一到第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]#创建file2matrix讲txt文件中的数据转化为矩阵的形式,并返回def file2matrix(filename):#打开filename文件,并返回文件指针    fr = open(filename)    #读取文件的所有行并作为一个列表放回,包含所有的行结束符    arrayOLines = fr.readlines()#获取文件的行数    numberOfLines = len(arrayOLines)#创建一个列为3,行为数据行数的矩阵,用于储存数据    returnMat = zeros((numberOfLines,3))    classLabelVector = []    index = 0    for line in arrayOLines:        #line.strip()删除行中的空白字符        line = line.strip()        #通过制表字符\t对line切片        listFromLine = line.split('\t')#将数据读取到returnMat矩阵中        returnMat[index,:] = listFromLine[0:3]#将标签读取到classLabelVecor矩阵中        classLabelVector.append(int(listFromLine[-1]))        index += 1    return returnMat,classLabelVector#将数据归一化def autoNorm(dataSet):    #找到最大和最小的数据    minVals = dataSet.min(0)    maxVals = dataSet.max(0)    ranges = maxVals - minVals    #创建一个行数和dataSet相同的空矩阵    normDataSet = zeros(shape(dataSet))    #获取数据集合的行数    m = dataSet.shape[0]    #将数据集合的每个数据都减去最小值    normDataSet = dataSet - tile(minVals,(m,1))    #将减之后的数据,处以范围    normDataSet = dataSet/tile(ranges,(m,1))    #返回归一化之后的数据,数据的极差,数据的最小值    return normDataSet, ranges, minVals#testdef datingClassTest():    #测试的数据和总数据的占比    hoRatio = 0.10    #通过文件读取约会数    datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')    #归一化约会数据    normMat, ranges, minVals = autoNorm(datingDataMat)    #获取归一化数据后的行数    m = normMat.shape[0]    #得到需要测试的数据大小    numTestVecs = int(m*hoRatio)    #用于计算预测失误的数量    errorCount = 0.0    #遍历测试数据    for i in range(numTestVecs):        #将数据带入函数进行比较,k取3        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 rate is :%f" %(errorCount/float(numTestVecs)))#预测函数def classifyPerson():    #创建结果集合    resultList = ['not at all', 'in small does', 'in large doess']    #对数据进行输出 py3将raw_input改为input    percentTats = float(input("percenttage of time spent playing video games?"))    ffMiles = float(input("frequent flier miles earned per year?"))    iceCream = float(input("liters of ice cream consumed per year?"))    #获取原始数据    datingDataMat, datingLabels = file2matrix("datingTestSet2.txt")    normMat, ranges, minVals = autoNorm(datingDataMat)    #获取需要测试数据    inArr = array([ffMiles, percentTats, iceCream])    #进行预测    classifierResult = classify0((inArr-minVals)/ranges,normMat,datingLabels,3)    #打印    print("you will probably like this man:%s" %(resultList[classifierResult-1]))
阅读全文
0 0
原创粉丝点击