机器学习k近邻算法_warrah的博客-程序员宝宝

技术标签: 机器学习  

毕业10年,回过头看线性代数,全部还给了老师。翻看《Machine Learning in Action》做做笔记
1 欧式距离计算

# -*- coding: utf-8 -*-
'''
Created on 2017年10月27日

@author: dzm
'''
from numpy import  array, tile
import operator

def createDateSet():
    '''
    创建数据集和标签
    :return: 
        :param group 数据矩阵
        :param labels 向量包含了每个数据点的标签信息
    '''
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels

def classify0(inX, dataSet, labels, k):
    '''
        通过欧式距离公式,计算两个向量点xA和xB之间的距离。
        @see: 瓯氏距离公式 http://blog.csdn.net/Losteng/article/details/50893931
        @see: tile函数  http://blog.csdn.net/ksearch/article/details/21388985
        @see: argsort函数 https://www.cnblogs.com/yyxf1413/p/6253995.html 
        @see: sorted函数 http://www.runoob.com/python/python-func-sorted.html
        @see: operator.itemgetter http://mp.blog.csdn.net/mdeditor/79277992
    :param inX: 用于分类的输入
    :param dataSet: 输入的训练样本集
    :param labels: 标签向量
    :param k: 用于选择最近邻居的数目
    :return: 
    '''
    # dataSet为4*2的矩阵,通过shape获取行向量数量
    dataSetSize = dataSet.shape[0]
    # 将inX在行方向执行dataSetSize,在列方向执行1次, 两矩阵相减
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet
    # 数组的立方
    sqDiffMat = diffMat ** 2
    # 行数据相加,如果axis=0,则是列向量数据相加
    sqDistances = sqDiffMat.sum(axis=1)
    # 取根
    distances = sqDistances ** 0.5
    # 从小到排序,值为索引数组
    sortedDistIndicies = distances.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        # classCount.get(voteIlabel, 0)是指不存在相对应key值的value则返回0
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

if __name__ == '__main__':
    group,labels = createDateSet()
    print classify0([2,3],group, labels, 3)

1
2
2 将文本记录转换为numpy可解析的格式

def file2matrix(filename):
    '''
    将待处理数据的格式改变为分类器可以接受的格式
    @see zeros函数 http://blog.csdn.net/qq_26948675/article/details/54318917
    :param filename: 数据文件路径
    :return: 
    '''
    fr = open(filename)
    numberOfLines = len(fr.readlines())         #get the number of lines in the file
    returnMat = zeros((numberOfLines,3))        #prepare matrix to return
    classLabelVector = []                       #prepare labels return
    index = 0
    fr = open(filename)
    for line in fr.readlines():
        # 移除行数据中的空格
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(int(listFromLine[-1]))
        index += 1
    return returnMat,classLabelVector

if __name__ == '__main__':
    datingDataSet, datingLabels = file2matrix('F:\pythonwork\machinelearninginaction\Ch02\datingTestSet2.txt');
    print datingDataSet

3
3 使用Matplotlib创建散点图

if __name__ == '__main__':
    datingDataSet, datingLabels = file2matrix('F:\pythonwork\machinelearninginaction\Ch02\datingTestSet2.txt');
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(datingDataSet[:,1], datingDataSet[:,2])
    plt.show()

matplotlib.pyplot中add_subplot方法参数111的含义
4 数值归一化
本文中采用的是min-max标准化,也可参见三种常用数据标准化方法,按照最大尺度进行同比例缩放到0-1之间

def autoNorm(dataSet):
    '''
    归一化特征值
    @see http://blog.csdn.net/pipisorry/article/details/52247379
    :param dataSet: 
    :return: 
    '''
    # 以dataSet中以第0列取最小值
    minVals = dataSet.min(0)
    # 以dataSet中以第0列取最大值
    maxVals = dataSet.max(0)
    ranges = maxVals - minVals
    normDataSet = zeros(shape(dataSet))
    m = dataSet.shape[0]
    # 数据归一化:newValue = (oldValue-min)/(max-min)
    normDataSet = dataSet - tile(minVals, (m,1))
    normDataSet = normDataSet/tile(ranges, (m,1))   #element wise divide
    return normDataSet, ranges, minVals

5 计算分类错误率

def datingClassTest():
    '''
    计算分类错误率
    :return: 
    '''
    # 10%的测试数据
    hoRatio = 0.1      #hold out 10%
    datingDataMat,datingLabels = file2matrix('F:\pythonwork\machinelearninginaction\Ch02\datingTestSet2.txt')       #load data setfrom file
    # 将数据归一化
    normMat, ranges, minVals = autoNorm(datingDataMat)
    m = normMat.shape[0]
    numTestVecs = int(m*hoRatio)
    errorCount = 0.0
    for i in range(numTestVecs):
        # 通过k近邻算法进行分类
        classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
        # 筛选出错误分类的数据
        if (classifierResult != datingLabels[i]):
            errorCount += 1.0
            print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i])
    print "the total error rate is: %f" % (errorCount/float(numTestVecs))
    print errorCount

6 通过输入的信息,找到她对对方喜欢程度的预测值

def classifyPerson():
    resultList = ['not at all', 'in small doses', 'in large doses']
    # raw_input是在控制台输入
    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('F:\pythonwork\machinelearninginaction\Ch02\datingTestSet2.txt')
    normMat, ranges, minVals = autoNorm(datingDataMat)
    # inArr是新输入的数据,通过(inArr-minVals)/ranges对数据进行归一化处理
    inArr = array([ffMiles, percentTats, iceCream])
    classifierResult = classify0((inArr-minVals)/ranges, normMat, datingLabels, 3)
    print "you will probably like this person:",resultList[classifierResult-1]

缺点
1 k-近邻算法是基于实例的学习,使用算法时我们必须有接近实际数据的训练样本数数据,存储空间要求大
2 必须对数据集中的每个数据计算距离值,耗时
3 无法给出任何数据的基础结构信息,也无法知晓平均实例样本和典型实例样本具有什么特征。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/warrah/article/details/79277992

智能推荐

设计模式-创建型模式-单例模式-懒汉式_梦幻墟都的博客-程序员宝宝

设计模式-创建型模式-单例模式-懒汉式一、创建型模式二、单例模式三、懒汉式1.单线程懒汉式单例代码段1:单线程懒汉模式单例代码段2:单线程测试懒汉模式单例代码段3:多线程测试懒汉模式单例2.多线程懒汉式单例代码段4:懒汉模式单例加锁(多线程)3.完整版懒汉模式单例一、创建型模式创造型模式主要的关注点是怎么创建对象,主要特点是将对象的创建和使用分离开来。以此降低系统的耦合度,使用者可以不需要过分关注对象的创建细节,直接使用就可以。创造模式例子:去商城购买商品,并不需要知道商品是怎么来的怎么生产的,只

TCP连接三次握手_Java充电桩的博客-程序员宝宝

记漫画半小时第一章总结当数据通过TCP传输协议时,会先建立连接,而这个连接并不是一条线保持长连接,而是通过发送报文的形式.发送方 大雄接收方 静香第一次握手首先由发送方大雄 发送报文告知 我是大雄 我从哪里来 要到哪里去 找谁找静香一路经过路由器的转发后发送到了接收方静香静香收到报文后, 确定了大雄可以发送消息, 静香可以正常接收消息.第二次握手静香回信,告知大雄 我这边可以接信 你那边可以发信第三次握手大雄收到信后, 静香并不知道自己能不能发到大雄那所以大雄开始回信 我知道我自己可

git push 报错提示 ! [rejected] dev -> dev (non-fast-forward)_王坦.的博客-程序员宝宝

git push 出错! [rejected] dev -> dev (non-fast-forward)今天下午 push 代码时,报错! [rejected] dev -> dev (non-fast-forward), pull 了远程代码重新提交,还是同样的提示,最终尝试另外的方式才得解决:git fetch origin dev // 获取远程 dev 分...

【日常学习——论文写作】毕业论文的查重_向过去说再见的博客-程序员宝宝

个人总结:1.网页上的不要照搬照抄,就算是csdn这类社区,只要是百度能搜到的,知网都能查到(查重源包含网络资源)2.修改词语,改变段落顺序,加上语气词避免知网“13个字”原则,这种小伎俩也是会被检测出来的。3.表格数据也是会被查重的,图片不会一定要避免的:一定要避免的抄袭行为:1.论点(结论、观点)直接照搬他人受著作权保护的作品中的论点、观点、结论。2.论据论证(实验和观测结果分析)他人作品中的论据论证分析、科学实验(对象及方法)和观测结果及分析、科学调研、系统设计、问题的解决方法等等

如何做好J1939应用层数据定义_嵌入式程序猿的博客-程序员宝宝

SAE J1939 跟CANOpen,DeviceNet等一样都隶属于CAN的高层协议,J1939广泛应用于卡车,船舶,农林等设备,也正在拓展至其他的行业,因其属于CAN...

recy拖动item_qq_45480938的博客-程序员宝宝

var context: Context = this var myadapter:MyAdapter?=null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activ...

随便推点

ubuntu 12.04 codeblocks undefined reference to ‘pthread_create'解决方法_Jason-xie的博客-程序员宝宝

settings---》compiler and bug settings --》link settings 在左边添加libpthread.a  ,右边添加 -lpthread即可。ubuntu libpthread.a 的路径为 /usr/lib/x86_64-linux-gnu/libpthread.a

Java aio(异步网络IO)初探_xuyan5971的博客-程序员宝宝

按照《Unix网络编程》的划分,IO模型可以分为:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO,按照POSIX标准来划分只分为两类:同步IO和异步IO。如何区分呢?首先一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作,同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO服用、信号驱动IO都是同步IO

STM32单片机 STLINK/V2与TTL下载器使用方法_Xiuyu_Boy的博客-程序员宝宝_stm32下载器接线

STLINK/V2下载器接线方法STLINK/V2下载器下载接线方法文章目录STLINK/V2下载器接线方法一、接线示意图一、接线示意图接线示意图

小米mix2s html,【小米MIX2s评测】性能·骁龙845确实很强 但小米没压住_小米 MIX 2s(6GB RAM/全网通)_手机评测-中关村在线..._樱桃Anne的博客-程序员宝宝

性能·骁龙845确实很强但小米没压住“为发烧而生”的小米手机,当然离不开强悍的性能硬件。小米MIX2S应该是第一款能够买到的骁龙845移动平台的国产手机,并且搭载LPDDR4x内存和UFS2.1存储,最高实现8GB+256GB的搭配,从参数看“为发烧而生”名副其实。骁龙845核心方面,骁龙845采用了ArmCorte技术基础上打造的Kryo385架构,四个大核主频提升到2.8GHz,四...

在Fedora core 5下装Vmware tools_gxuyangming的博客-程序员宝宝

为了配合学习,在IBM T40的笔记本上用虚拟机VMware装了Fedora core 5,装好后想装VMware tools,这样显示效果会比较好,能到达1024*768的分辨率安装VMware tools  步骤如下1 点击VMware tools菜单里面的安装虚拟己工具2 然后进入FC5里面,打开光盘就看见有2个虚拟机工具的软件3 挂载 mkdir /mnt/cdrommount -t is

【网络】tshark 参数说明(tshark 是Wireshark的命令行工具)_bandaoyu的博客-程序员宝宝_tshark

目录1、目的2、首先我们先来看一下网上的一些例子,我对这些例子进行了整理,并给出了说明。3、选项介绍4、部分命令测试5、参考文献原文:https://www.cnblogs.com/liun1994/p/6142505.html1、目的  写这篇博客的目的主要是为了方便查阅,使用wireshark可以分析数据包,可以通过编辑过滤表达式来达到对数据的分析;但我的需求是,怎么样把Data部分导出来,因为后续的工作主要针对数据包的Data部分,主要是对本地存储的.pcap文..