【读书笔记】机器学习实战-kNN(1)

k临近算法(kNN)采用测量不同特征值之间的距离方法进行分类,也是一种非常直观的方法。本文主要记录了使用kNN算法改进约会网站的例子。

任务一:分类算法classify0

就是使用距离公式计算特征值之间的距离,选择最邻近的k个点,通过统计这k个点的结果来得出样本的预测值。

tile函数用法在这里

argsort函数在这里

def classify0(inX,dataset,labels,k):
    #shape 返回行列数,shape[0]是行数,有多少元组
    datasetsize = dataset.shape[0]
    #tile 复制inX,使其与dataset一样大小
    diffmat = tile(inX,(datasetsize,1)) - dataset
    #**表示乘方
    sqdiffmat = diffmat ** 2
    #按行将计算结果求和
    sqdistances = sqdiffmat.sum(axis=1)
    distances = sqdistances ** 0.5
    #使用argsort排序,返回索引值
    sortedDistIndicies = distances.argsort()
    #用于计数,计算结果
    classcount = {}
    for i in range(k) :
        voteIlabel = labels[sortedDistIndicies[i]]
        classcount[voteIlabel] = classcount.get(voteIlabel,0)+1
    #按照第二个元素降序排列
    sortedClasscount = sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=True)
    #返回出现次数最多的那一个label的值
    return sortedClasscount[0][0]           

任务二:读入数据

注意这里书上写错了,应该读入的是datingTestSet2.txt而不是datingTestSet.txt

书上的数据和例子下载:在这里

def file2matrix(filename):
    fr = open(filename)
    #打开文件,按行读入
    arrayOLines = fr.readlines()
    #获得文件行数
    numberOfLines = len(arrayOLines)
    #创建m行n列的零矩阵
    returnMat = 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

任务三:使用Matplotlib画图

安装Matplotlib时还需要numpy, dateutil, pytz, pyparsing, six, setuptools这几个包。可以在这里下载到,挺全的。加入到python27\Lib\site-packages目录下。

在powershell中cd到datingTestSet2.txt所在文件夹

输入python命令并且输入以下命令

粘贴:

import numpy
import matplotlib
import matplotlib.pyplot as plt
import kNN
reload(kNN)
datingDataMat,datingLabels=kNN.file2matrix(‘datingTestSet2.txt‘)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*numpy.array(datingLabels),15.0*numpy.array(datingLabels))
plt.show()

下面使用后两个特征的图片

将scatter函数修改为:

ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15.0*numpy.array(datingLabels),15.0*numpy.array(datingLabels))

使用前两个特征的图片

任务四:归一化

免除较大数值的数据给分类带来的影响,将每一项数据归一化为0~1之间的数字。

def autoNorm(dataSet):
    #找出样本集中的最小值
    minVals = dataSet.min(0)
    #找出样本集中的最大值
    maxVals = dataSet.max(0)
    #最大最小值之间的差值
    ranges = maxVals - minVals
    #创建与样本集一样大小的零矩阵
    normDataSet = zeros(shape(dataSet))
    m = dataSet.shape[0]
    #样本集中的元素与最小值的差值
    normDataSet = dataSet - tile(minVals, (m,1))
    #数据相除,归一化
    normDataSet = normDataSet/tile(ranges, (m,1))
    return normDataSet, ranges, minVals

任务五:

分类并检验书中所给的数据

def datingClassTest():
    #选取多少数据测试分类器
    hoRatio = 0.10
    #从datingTestSet2.txt中获取数据
    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):
        #分类算法
        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))
    print errorCount

出错率为5%

最后是kNN.py文件


#encoding:utf-8
from numpy import *
import 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
#kNN实现0
def classify0(inX,dataset,labels,k):
    #shape 返回行列数,shape[0]是行数,有多少元组
    datasetsize = dataset.shape[0]
    #tile 复制inX,使其与dataset一样大小
    diffmat = tile(inX,(datasetsize,1)) - dataset
    #**表示乘方
    sqdiffmat = diffmat ** 2
    #按行将计算结果求和
    sqdistances = sqdiffmat.sum(axis=1)
    distances = sqdistances ** 0.5
    #使用argsort排序,返回索引值
    sortedDistIndicies = distances.argsort()
    #用于计数,计算结果
    classcount = {}
    for i in range(k) :
        voteIlabel = labels[sortedDistIndicies[i]]
        classcount[voteIlabel] = classcount.get(voteIlabel,0)+1
    #按照第二个元素降序排列
    sortedClasscount = sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=True)
    #返回出现次数最多的那一个label的值
    return sortedClasscount[0][0]
#从txt中读入数据
def file2matrix(filename):
    fr = open(filename)
    #打开文件,按行读入
    arrayOLines = fr.readlines()
    #获得文件行数
    numberOfLines = len(arrayOLines)
    #创建m行n列的零矩阵
    returnMat = 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
#归一化数据
def autoNorm(dataSet):
    #找出样本集中的最小值
    minVals = dataSet.min(0)
    #找出样本集中的最大值
    maxVals = dataSet.max(0)
    #最大最小值之间的差值
    ranges = maxVals - minVals
    #创建与样本集一样大小的零矩阵
    normDataSet = zeros(shape(dataSet))
    m = dataSet.shape[0]
    #样本集中的元素与最小值的差值
    normDataSet = dataSet - tile(minVals, (m,1))
    #数据相除,归一化
    normDataSet = normDataSet/tile(ranges, (m,1))
    return normDataSet, ranges, minVals

def datingClassTest():
    #选取多少数据测试分类器
    hoRatio = 0.50
    #从datingTestSet2.txt中获取数据
    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):
        #分类算法
        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))
    print errorCount
时间: 2024-08-26 17:39:34

【读书笔记】机器学习实战-kNN(1)的相关文章

机器学习实战——kNN分类器

惰性学习法:简单的存储数据,一直等待,直到给定一个测试元组时才进行泛化,根据对存储的元组的相似性进行分类.kNN(k近邻)分类方法于20世纪50年代提出,由于计算密集型算法,因此到60年代之后随着计算能力增强后才逐步应用. kNN基于类比学习,将给定的测试元组表示为n维空间中的一个点,n代表属性数目.然后使用某种距离度量方式来寻找与给定测试元组最近的k个训练元组,对这个k个训练元组的类别进行统计,返回类别数目多的类别作为未知测试元组的类别. 常用的距离度量就是欧几里得距离,也称为二范数.同时为了

数据挖掘与运营化实战读书笔记-机器学习案例技巧实战

[读书笔记]项目管理实战:Microsoft Project精髓与方法

<项目管理实战:Microsoft Project精髓与方法>是Bonnie Biafore 写的一本书.Bonnie Biafore 作为项目管理师(PMP),她有20余年为大中小型客户提供项目管理服务的实践经验:作为多产的作家,著有项目管理.投资.个人理财.Microsoft Project.QuickBooks等领域相关图书20余部,其NAIC Stock Selection Handbook(选股手册)荣获技术交流学会(STC)及APEX优秀出版物大奖.她还为微软项目管理软件用户协会(

机器学习实战knn

最近在学习这本书,按照书上的实例编写了knn.py的文件,使用canopy进行编辑,用shell交互时发现运行时报错: >>> kNN.classify0([0,0],group,labels,3) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'kNN' is not defined 运行的代码如下: from nu

机器学习实战- KNN

KNN:k近邻算法-在训练样本中找到与待测样本距离相近的N个样本,并用这N个样本中所属概率最大的类别作为待测样本的类别. 算法步骤: 1.对训练中的样本数据的不同属性进行归一化处理. 2.计算待测样本到训练样本集中的距离.(欧拉距离或曼哈顿距离): 3.找到N个距离最小的样本属于不同类别的概率. 4.取最大的概率作为待测样本的类别. 例子1: 相亲 相亲考虑的条件: 1) 每年飞行公里 2) 每周打的游戏时长 3)每周消耗的ice cream 态度用1,2,3表示:1表示little like

[读书笔记]机器学习:实用案例解析(5)

第5章  回归模型:预测网页访问量 回归模型:用已知数据集预测另外一个数据集,已知数据集称为输入,也叫预测变量或特征,想要预测的数据称为输出.回归模型与分类模型的不同之处在于回归模型的输出是有意义的数值. 基准模型:用均值作为预测 #machine learing for heckers #chapter 5 library(ggplot2) ages <- read.csv('ML_for_Hackers/05-Regression/data/longevity.csv') #密度图 ggpl

[读书笔记]机器学习:实用案例解析(7)

第7章  优化:密码破译 优化简介:最优点(optimum),优化(optimization) 本章研究的问题:构建一个简单的密码破译系统,把解密一串密文当做一个优化问题. 优化方法:网格搜索(grid search),主要问题是1.步长的选择:2.维度灾难(Curse of Dimensionality):问题规模过大 optim函数:比网格搜索更快,可以通过已经计算出的信息推断出下一步的方向,同时对所有变量一起优化.(根据书中后文,可能的原理是根据导数得出下一步的进行方向,因为该函数对于不可

[读书笔记]机器学习:实用案例解析(2)

第2章  数据分析 #machine learing for heckers #chapter 2 library(ggplot2) heights.weights <- read.csv("ML_for_Hackers/02-Exploration/data/01_heights_weights_genders.csv", header = TRUE, sep = ",") #不同区间宽度的直方图 ggplot(heights.weights, aes(x

AngularJS in Action读书笔记5(实战篇)——在directive中引入D3饼状图显示

前言: "宁肯像种子一样等待  也不愿像疲惫的陀螺  旋转得那样勉强" 这是前几天在查资料无意间看到的一位园友的签名,看完后又读了两遍,觉得很有味道.后来一寻根究底才知这是出资大诗人汪国真之口,出处<她>.且抛开上下文,单从这短短几句,正恰如其分的折射出有一群人,他们穿着不那么fashion,言辞不那么犀利,但是内心某一块地方像是躁动的火山,拥有无尽的动力和激情,矢志不渝种子般投身到技术研究和心得分享当中. 或许每一次的生长都是那么悄无声息,但是无数次的坚持只是为了破土那日