关闭

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

标签: 机器学习实战pythonnumpy代码学习
151人阅读 评论(0) 收藏 举报
分类:
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 plt

fig = 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
查看评论

kNN算法改进约会网站的配对效果

#coding = utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as plt def createDataset(): group = array([[1.0, 1.1]...
  • Unin88
  • Unin88
  • 2016-01-15 15:59
  • 458

k-近邻算法(KNN)--2改进约会网站的配对效果---by香蕉麦乐迪

参考书籍:《机器学习实战》 实验说明:预测约会对象对用户是否具有吸引力 输入数据:每个待约会的对象有三个属性,分别是 每年飞行里程数、玩游戏占时间比、每周吃的冰淇淋(单位公升);(ps:我觉得这三个参数,分别代表一个人是否有钱,生活娱乐,饮食习惯) 样本集:有1000个约会对象的数据,并且每个对象...
  • sloanqin
  • sloanqin
  • 2015-12-02 17:00
  • 929

机器学习实战—k近邻算法(kNN)02-改进约会网站的配对效果

示例:使用k-近邻算法改进约会网站的配对效果在约会网站上使用k-近邻算法: 1.收集数据:提供文本文件。 2.准备数据:使用Python解析文本文件。 3.分析数据:使用matplotlib画二维扩散图。 4.训练算法:此步骤不适用于k-近邻算法 5.测试数据:使用提供的部分数据作为测试样...
  • u012150360
  • u012150360
  • 2017-05-07 20:29
  • 625

k-近邻算法改进约会网站的配对效果

在上一篇的基础上增加如下代码:''' 将文本记录转换到NumPy的解析程序 输入为文件名字符串 输出为训练样本矩阵和类标签向量 ''' def file2matrix(filename): fr = open(filename) arr...
  • u012319493
  • u012319493
  • 2016-05-14 18:18
  • 1053

机器学习实战笔记——利用KNN算法改进约会网站的配对效果

一、案例背景 我的朋友海伦一直使用在线约会网站寻找合适自己的约会对象。尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人。经过一番总结,她发现曾交往过三种类型的人: (1)不喜欢的人; (2)魅力一般的人; (3)极具魅力的人; 尽管发现了上述规律,但海伦依然无法将约会网站推荐的匹配对象归入恰当...
  • geekmanong
  • geekmanong
  • 2016-01-17 12:57
  • 3311

机器学习实战(①)——KNN算法改进约会网站的配对效果和手写字识别系统

KNN 又名K近邻算法 用于:客户流失预测、欺诈检测等。 算法思想:近朱者赤近墨者黑!步骤: 1. 算距离、计算新数据和训练数据之间的距离 2. 去排序、对算出来的距离进行排序 3. 找邻居、确定最近的K个训练对象 4. 做分类、根据K个近邻对象归属的类最高的为对测试对象分类 # -*- ...
  • sinat_36458870
  • sinat_36458870
  • 2017-08-10 15:57
  • 221

机器学习-kNN算法改进约会效果

from numpy import * import operator from os import listdir #训练样本及标签 def createDataSet():     group = array([[1.0,1.1],[1.0,1.0],[0,0],[...
  • z0905073007
  • z0905073007
  • 2014-05-22 17:11
  • 865

学习笔记:使用k-近邻算法改进约会网站的配对效果

# -*- coding: UTF-8 -*- from numpy import * import operator import matplotlib.pyplot as plt def file2matrix(filename): #准备数据-导入数据 fr = open(filename...
  • zz490396674
  • zz490396674
  • 2016-07-06 11:32
  • 570

使用KNN算法改进约会网站的配对效果

#!/usr/bin/python #coding:utf-8 import numpy as np import operator import matplotlib import matplotlib.pyplot as plt ''' KNN算法 1. 计算已知类别...
  • zhujianing1993
  • zhujianing1993
  • 2017-06-29 15:21
  • 151

读懂《机器学习实战》代码—K-近邻算法改进约会网站配对效果

从上一篇文章大概了解了K-近邻算法的原理,并实现了分类函数: #inX为用于分类的输入向量 #dataSet为输入的训练样本集 #lables为标签向量 #参数k表示用于选择最近邻居的数目 def classify0(inX,dataSet,lables,k) 接下来,通过人物特...
  • u013457382
  • u013457382
  • 2016-03-20 18:38
  • 1894
    个人资料
    • 访问:4569次
    • 积分:359
    • 等级:
    • 排名:千里之外
    • 原创:29篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条