ML in action代码学习/CH02 KNN/约会网站配对效果改进

来源:互联网 发布:php短信接口怎么写 编辑:程序博客网 时间:2024/06/03 17:09
from numpy import *import operator

分类

def classify0(inX,dataSet,labels,k): #用于分类的是inX,用于训练的是dataSet    dataSetSize = dataSet.shape[0] # 获取dataSet矩阵的行数    diffMat =tile(inX,(dataSetSize,1))-dataSet #将行向量inX复制dataSetSize行,求inX与每一个实例之间的距离    sqDiffMat = diffMat**2 #对距离求平方    sqDistance = sqDiffMat.sum(axis=1) # 距离平方和 axis=0列相加 =1行相加    distances = sqDistance**0.5 #开根号    sortedDistIndicies = distances.argsort() #取距离的索引(从小到大)    classCount ={} #生成一个用于存放label及其对应次数的字典    for i in range(k):         voteIlabel = labels[sortedDistIndicies[i]] #取前k个距离对应的label        classCount[voteIlabel] =classCount.get(voteIlabel,0)+1 #取label对应的次数,加1。没有时默认取0加1    sortedClassCount =sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)    #这里的知识点有:    #dict.iteritems() 返回迭代器,占内存少,但是访问慢   ps:dict.item()返回列表,占内存多,访问快    #operator.itemgetter(item)  返回一个可调用的对象,取操作对象的items     #eg:f = itemgetter(2), call f(r) returns r[2]    #sorted(iterable[, cmp[, key[, reverse]]])    # iterable 是进行排序的list或者iterator    # cmp 是进行比较的函数    # key是取待排序元素的哪一项进行排序    # reverse默认为false升序,true为降序    # https://docs.python.org/2/library/functions.html?highlight=sorted#sorted    return sortedClassCount[0][0]

数据预处理

def file2matrix(filename):    fhand = open(filename)    arrayOfLines = fhand.readlines()     # read() 一次性读取成一个字符串,换行显示表示成\n    # readlines() 一次性读取,按行解析成列表    # readline() 一次读取一行,没有足够内存一次性读取使用    numOfLines = len(arrayOfLines)    returnMat = zeros((numOfLines,3))    # numpy.zeros(shape, dtype=float, order='C') 返回一个新的array ,可以是list,也可以是mmatrix    classLabelVector = []    index = 0    for line in arrayOfLines:        line = line.strip()         listFromLine = line.split("\t") # 有4个元素,前三个是特征,最后一个是target        returnMat[index,:] = listFromLine[0:3]        classLabelVector.append(int(listFromLine[-1])) #用int的原因是元素存储为整形,否则会被python认为是字符串        index += 1    return returnMat,classLabelVector

reload(knn)datingDataMat,datingLabels = knn.file2matrix("datingTestSet2.txt")

import matplotlib import matplotlib.pyplot as pltfig = plt.figure()  #新建一个Figure画布对象ax = fig.add_subplot(111)  #将整个画布分成1行1列,在第一个块区域里面生成Axes对象ax.scatter(xDataSet,yDataSet)#matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)plt.show()

数据归一化

newValue = (oldValue - minValue)/(max-min)

def autoNorm(dataSet):    minVals = dataSet.min(0) #取每列的最小值,参数为1取行    maxVals = dataSet.max(0) #取每列的最大值    ranges = maxVals - minVals   # 区间距离,分母    normDataSet =zeros(shape(dataSet))  #新建一个同dataSet行列的0阵来存放归一化后的矩阵    m = dataSet.shape[0] #取行数    normDataSet = dataSet - tile(minVals,(m,1)) #分子biao'shi'ju'ti'de'zhi'xiang    normDataSet = normDataSet /tile(ranges,(m,1))  #想起来matlab里面./和/的差别。在numpy中,matrix/matrix只表示    return normDataSet,ranges,minVals

reload(knn)normMat,ranges,minVals = knn.autoNorm(datingDataMat)

测试

def datingClassTest():    hoRatio = 0.10    datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')    normMat,ranges,minVals = autoNorm(datingDataMat)    m=normMat.shape[0] # 行数,即样例总数    numTestVecs = int(m*hoRatio)  #样例的10%作为测试样例    errorCount=0.0    for i in range(numTestVecs):        classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs,:],3)        #测试数据需要随机选择,而数据本身并没有特定的排序,所以可以直接选择前面的10%行来作为测试数据,后面的作为训练集        print "the classifier came back with:%d,the real answer is %d" % (classifierResult,datingLabels[i])        #print 输入带精度数字的用法 print "%d/f" %(variable)   %r是万能符        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 doses","in large doses"] #结果列表    percenrTats=float(raw_input("percentage of time spent playing video games?")) #输入参数1    ffMiles = float(raw_input("frequent flier miles earned per year")) #输入参数2    iceCream = float(raw_input("liters of ice cream consumed per year")) #输入参数3    datingDataMat,datingLabels = file2matrix("datingTestSet2.txt") #获取训练集,标签    normMat,ranges,minVals = autoNorm(datingDataMat) # 归一化    inArr =array([ffMiles,percenrTats,iceCream])  # 输入参数向量化    classifierResult = classify0((inArr-minVals)/ranges,normMat,datingLabels,3)  #分类    print "you will probably like this person:",resultList[classifierResult-1]  #输出结果
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 陕西省志愿云忘记密码和邮箱怎么办 国寿易学堂忘记登录密码怎么办 百度云下载显示本地空间不足怎么办 百度云离线内容违规无法下载怎么办 百度云压缩包要压解密码没有怎么办 用2016酷我音乐制作铃音怎么办 邮箱跟手机号一同绑定支付宝怎么办 网易邮箱取消账户关联没反应怎么办 剑三重置版客户端修复不成功怎么办 网易闪电邮的邮件满了怎么办 忘了手机的账号和密码怎么办 手机绑定的扣扣达到十个上限怎么办 邮箱发送邮件到上限无法发送怎么办 路由器重置后不知道账号密码怎么办 发出的邮件别人看了撤回不了怎么办 域名和邮箱是不同的公司怎么办 qq音乐听过的歌单找不到了怎么办 快手开直播前置摄像头太暗怎么办 小米手机帐号绑定无法侠用怎么办 用交易猫买完游戏账号被骗了怎么办 一个华为账号有两个游戏账号怎么办 加密u盘电脑上打开空怎么办 国网加密u盘电脑打开为空怎么办 足球竞彩软件下架后里面的钱怎么办 竞彩足球提现不到账怎么办 竞彩足球投注后输了怎么办 英雄联盟鼠标箭头右键点不了怎么办 上古卷轴5数值修改错了怎么办 小时候打针把屁股脂肪打扁了怎么办 大繁盛满腹市场2对话时闪退怎么办 月经来了一个月了还不停怎么办 对办公室的异性老师产生好感怎么办 上古卷轴5任务NPC老打我怎么办 1岁半宝宝走路内八字怎么办 最近几个月例假周期都25天怎么办 从pr导出的视频大小不一样怎么办 合作医疗收据丢了不给报销怎么办 沧州新生医院—老人腹胀了该怎么办 内痔疮术后一个月吃了点辣椒怎么办 肛周脓肿手术后大便干怎么办 月经半个月了还没干净怎么办