机器学习实战之KNN算法

本文介绍了通过《机器学习实战》学习KNN算法的过程,强调了理论与实践相结合的重要性。作者通过实现KNN算法并应用于约会对象分类和数字识别两个实例,展示了算法的实用性。在约会对象分类中,错误率为5%,而在数字识别实验中,准确率高达98.7%。文章还讨论了特征选择和归一化处理在KNN算法中的关键作用,并鼓励读者尝试不同K值的影响。
摘要由CSDN通过智能技术生成

前段时间在京东上购买了这本很多人都推荐的书---机器学习实战。刚刚看完第一章,感觉本书很适合   初学者,特别是对急于应用机器学习但又不想深究理论的小白(像我这样的)。不过在这里还是推荐一下李航老师的那本《统计学习方法》,该书注重理论推导及挖掘算法背后的数学本质,和《机器学习实战》配合起来学习,可以达到事半功倍的效果。有这两本书基本可以让我们这些小白开始起飞了。

                                                                   

       看完《统计学习方法》的KNN算法推导,虽然知道了该算法的理论基础,但是对KNN算法还是没有一个宏观的把握,这样估计几天就会忘得一干二净。这几天抽空将《机器学习实战》中的KNN代码动手自己写了一遍,实践以后确实对它有了更深的理解,也知道了它的适用范围。本书是用python语言写的,确实是个正确的选择,感觉用起来很像matlab,特别方便。不过听实验室某位大神说搞大数据R语言用的也不少,现在真心感觉要学语言实在太多了。在大数据领域,两大王牌软件spark和hadoop分别是用scala和java写的,统计处理又推荐使用R,平时仿真又是python。对于我们这种一直用C/C++的,平时没写过什么软件应用,一下子要学这么多高级语言,实在有点招架不住啊!尴尬

废话不多说,谁让我铁了心要进军大数据的奋斗。兄弟们,拿起python来。开干。。。

       KNN算法概况起来一句话:在样本数据中,距离测试样本点的一定范围内,寻找最多的一种样本类型,作为测试点的类型。距离可以是欧式距离,也可以非欧式距离,看具体的情况而定。至于范围大小的选取至关重要,目前貌似学术界也没什么办法可以算出哪个范围最好,所以工程上一般都是穷举测试。然后就是样本点和测试点的构建了,其实也就是特征提取,这部分是最最重要的,这直接决定了机器学习算法的准确性。如果特征不好,即使你的机器学习算法再好也没用。如果特征很棒,即使用的不是最优的机器学习算法效果也不错。这是实验室大牛说的。他说在各种大数据竞赛里,后面起决定性作用的是特征选择与提取,而不是算法(目前是这样的)。当然,非监督学习除外,因为它根本就不用特征提取。至于怎样选择特征最有效,这就要结合具体数据,具体问题而言了。本菜也不在这里YY了。

      书中用了两个实例来测试KNN算法, 一个是约会对象判断,一个是数字识别。本人觉得还是数字识别比较有趣,因为可以自己动手测试一下,特别有成就感吐舌头。废话不多说,上代码:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

"""
Created on Aug 29, 2015

@author: freestyle4568
this module is kNN method, classifying something.
"""
import numpy as np
import operator

def createdataset():
    """该函数用于产生kNN实验用列,返回样本数据集(numpy数组)和样本类型集(列表)
    
    Keyword arguments:
    None
    """
    group = np.array([[1.0, 1.1], 
                      [1.0, 1.0],
                      [0, 0], 
                      [0, 0.1]
                      ])
    labels = ['A', 'A', 'B', 'B']
    return group, labels

def classify(testData, dataSet, labels, k):
    """应用KNN方法对测试点进行分类,返回一个结果类型
    
    Keyword argument:
    testData: 待测试点,格式为数组
    dataSet: 训练样本集合,格式为矩阵
    labels: 训练样本类型集合,格式为数组
    k: 近邻点数
    """
    dataSetSize = dataSet.shape[0]
    multitestData = np.tile(testData, (dataSetSize, 1))
    diffMat = multitestData - dataSet
    sqdiffMat = diffMat**2
    sqdistance = sqdiffMat.sum(axis=1)
    #print(sqdistance)
    distance = sqdistance**0.5
    sortedDistIndex = distance.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndex[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
   
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值