2机器学习实践笔记(k-最近邻)

1:算法是简单的叙述说明

由于训练数据样本和标签,为测试数据的示例,从最近的距离k训练样本,此k练样本中所属类别最多的类即为该測试样本的预測标签。

简称kNN。通常k是不大于20的整数,这里的距离通常是欧式距离。

2:python代码实现

创建一个kNN.py文件,将核心代码放在里面了。

(1)   创建数据

#创造数据集
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

(2)   构照kNN分类器

#第一个kNN分类器  inX-測试数据 dataSet-样本数据  labels-标签 k-邻近的k个样本
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 = {}
    #选择距离最小的k个点
    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)
    return sortedClassCount[0][0]

代码解说:(a)tile函数 tile(inX, i);扩展长度  tile(inX, (i,j)) ;i是扩展个数,j是扩展长度。

如:

(b) python代码路径。须要导入os文件,os.getcwd()显示当前文件夹。os.chdir(‘’)改变文件夹,listdir()显示当前文件夹的全部文件。

此外假设改动了当前.py文件,须要在python shell中又一次载入该py文件(reload(kNN.py)),以确保更新的内容能够生效。否则python将继续使用上次载入的kNN模块。如:

(c)注意列表求平方,求和

如:

3:案例—约会站点

案例描写叙述:

(1)   从文本文件里解析数据

# 将文本记录到转换numPy的解析程序
def file2matrix(filename):
    #打开文件并得到文件行数
    fr = open(filename)
    arrayOLines = fr.readlines()
    numberOfLines = len(arrayOLines)
    #创建返回的numPy矩阵
    returnMat = zeros((numberOfLines, 3))
    classLabelVector = []
    index =0
    #解析文件数据到列表
    for line in arrayOLines:
        line = line.strip()
        listFormLine = line.split('\t')
        returnMat[index,:] = listFormLine[0:3]
        classLabelVector.append(int(listFormLine[-1]))
        index += 1
    return returnMat, classLabelVector

代码解说:(a)首先使用函数line.strip()截取掉全部的回车字符,然后使用tab字符\t将上一步得到的整行数据切割成一个元素列表

(b)int(listFormLine[-1]);python中能够使用索引值-1表示列表中的最后一列元素。此外这里我们必须明白的通知解释器,告诉它列表中存储的元素值为整型。否则python语言会将这些元素当做字符串处理。

(2)使用画图工具matplotlib创建散点图—能够分析数据

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTHU1OTcyMDM5MzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="521" height="389" >

(3)归一化数值

为了防止特征值数量的差异对预測结果的影响(比方计算距离,量值较大的特征值影响肯定非常大)。我们将全部的特征值都归一化到[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

(4)測试代码

測试代码以90%的作为训练样本。10%的作为測试数据

#測试代码
def 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):
        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))

(5)输入某人的信息。便得出对对方的喜欢程度

#输入某人的信息,便得出对对方喜欢程度的预測值
def classifyPerson():
    resultList = ['not at all', 'in small doses', 'in large doses']
    percentTats = float(raw_input("percentage of time spent playing video games?

"))
    ffMiles = float(raw_input("frequent flier miles earned per year?

"))
    iceCream = float(raw_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 person: ', resultList[classifierResult - 1]

代码解说:python中raw_input同意用户输入文本行命令并返回用户所输入的命令

4:案例—手写识别系统

这里能够将手写字符看做由01组成的32*32个二进制文件,然后转换为1*1024的向量即为一个训练样本。每一维即为一个特征值

(1)   将一个32*32的二进制图像转换成1*1024的向量

#将一个32*32的二进制图像矩阵转换成1*1024的向量

def img2vector(filename):
    returnVect = zeros((1,1024))
    fr = open(filename)
    for i in range(32):
        lineStr = fr.readline()
        for j in range(32):
            returnVect[0, 32*i+j] = int(lineStr[j])
    return returnVect

(2)   手写识别系统測试代码

#手写识别系统測试代码
def handwritingClassTest():
    hwLabels = []
    trainingFileList = listdir('trainingDigits')   #获取文件夹内容
    m = len(trainingFileList)
    trainingMat = zeros((m, 1024))
    for i in range(m):
        fileNameStr = trainingFileList[i]              #切割得到标签  从文件名称解析得到分类数据
        fileStr = fileNameStr.split('.')[0]
        classStr = int(fileStr.split('_')[0])
        hwLabels.append(classStr)                 #測试例子标签
        trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)
    testFileList = listdir('testDigits')
    errorCount = 0.0
    mTest = len(testFileList)
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classStr = int(fileStr.split('_')[0])
        vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)
        classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
        print 'the classifier came back with: %d, the real answer is: %d' % (classifierResult, classStr)
        if(classifierResult != classStr): errorCount += 1.0
    print "\nthe total numbers of errors is : %d" % errorCount
    print "\nthe total error rate is: %f" % (errorCount/float(mTest))
        

注明:1:本笔记来源于书籍<机器学习实战>

2:kNN.py文件及笔记所用数据在这下载(http://download.csdn.net/detail/lu597203933/7653991).

作者:小村长  出处:http://blog.csdn.net/lu597203933 欢迎转载或分享。但请务必声明文章出处。

(新浪微博:小村长zack, 欢迎交流!

)

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-13 22:18:51

2机器学习实践笔记(k-最近邻)的相关文章

机器学习实战笔记-K近邻算法2(改进约会网站的配对效果)

案例二.:使用K-近邻算法改进约会网站的配对效果 案例分析: 海伦收集的数据集有三类特征,分别是每年获得的飞行常客里程数.玩视频游戏所耗时间百分比. 每周消费的冰淇淋公升数.我们需要将新数据的每个新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签.一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数.最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类. 流程:在约会网站上使用K

机器学习实践笔记3(树和随机森林)

的优点是,在一个决策树的形式数据是easy理解.和kNN最大的缺点是数据的内在含义,不能给予. 1:这个概念很简单文字说明 决策树的类型有非常多.有CART.ID3和C4.5等.当中CART是基于基尼不纯度(Gini)的.这里不做具体解释,而ID3和C4.5都是基于信息熵的,它们两个得到的结果都是一样的.本次定义主要针对ID3算法.以下我们介绍信息熵的定义. 事件ai发生的概率用p(ai)来表示.而-log2(p(ai))表示为事件ai的不确定程度,称为ai的自信息量,sum(p(ai)*I(a

机器学习实战笔记-K近邻算法1(分类动作片与爱情片)

K近邻算法采用测量不同特征值之间的距离方法进行分类 K近邻算法特点: 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围:数值型和标称型. K近邻算法原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近 邻)的分类标签.一般来说,我们只选择样本数据集中前k个最

机器学习实战笔记--k近邻算法

1 #encoding:utf-8 2 from numpy import * 3 import operator 4 import matplotlib 5 import matplotlib.pyplot as plt 6 7 from os import listdir 8 9 def makePhoto(returnMat,classLabelVector): #创建散点图 10 fig = plt.figure() 11 ax = fig.add_subplot(111) #例如参数为

机器学习实战笔记-K近邻算法3(手写识别系统)

1 准备数据:将图像转换为测试向量 这次数据集还是有两种,训练数据集和测试数据集,分别有2000个,900个. 我们将把一个32*32的二进制图像矩阵转换为1 x 1024的向量,这样前两节使用的分类器就可以处理数字图像信息了. 代码: def img2vector(filename): returnVect = zeros((1,1024)) file = open(filename) for i in range(32): line = file.readline() for j in ra

机器学习---K最近邻(k-Nearest Neighbour,KNN)分类算法

K最近邻(k-Nearest Neighbour,KNN)分类算法 1.K最近邻(k-Nearest Neighbour,KNN) K最近邻(k-Nearest Neighbour,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实

机器学习&amp;数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

http://www.cnblogs.com/tornadomeet/p/3395593.html 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大.

机器学习进阶笔记之一 | TensorFlow安装与入门

原文链接:https://zhuanlan.zhihu.com/p/22410917 TensorFlow 是 Google 基于 DistBelief 进行研发的第二代人工智能学习系统,被广泛用于语音识别或图像识别等多项机器深度学习领域.其命名来源于本身的运行原理.Tensor(张量)意味着 N 维数组,Flow(流)意味着基于数据流图的计算,TensorFlow 代表着张量从图象的一端流动到另一端计算过程,是将复杂的数据结构传输至人工智能神经网中进行分析和处理的过程. -- 由 UCloud

机器学习之笔记一:初认识

本文是作者通过对<机器学习实践>这本书的学习,下面做出了自己的学习笔记.文笔拙劣,望指正! 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能.机器学习已经有了十分广泛的应用,例如:数据挖掘.计算机视觉.自然语言处理.生物特征识别.搜索引擎.医学诊断.检测信用卡欺诈.证券市场分析.DNA序列测序.语音