1.KNN原理:

存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中最相似数据(最近邻)的分类标签。一般来说,只选择样本数据集中前 $k$ 个最相似的数据,这就是KNN算法 $k$ 的出处, 通常 $k$ 是不大于20的整数。最后,选择 $k$ 个最相似数据中出现次数最多的分类,作为新数据的分类。

2.实验准备:

  • Python
  • scikit-learn(一个基于python的机器学习库)

3.实验代码:

代码有两个版本,一个是自己编写的简单的KNN算法实现,一个是基于scikit-learn库中KNN算法实现的,数据均采用scikit-learn中的手写体数据集。

版本1(自己编写):

# -*- coding: utf-8 -*-
"""
This script is an exercise on KNN.

Created on Tue Nov 03 21:21:39 2015

@author: 90Zeng
"""

import numpy as np
from sklearn import datasets
import operator

#-----------------function classify--------------------------------------
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[ 0 ]
    # 计算输入的向量inX与所有样本的距离
    diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
    sqDiffMat = diffMat ** 2
    sqDistances = sqDiffMat.sum(axis = 1)
    distances = sqDistances ** 0.5
    # 对距离大小进行排序
    sortedDistIndices = distances.argsort()
    classCount = {}
    # 选择距离最小的 K 个点
    for i in range(k):
        voteLabel = labels[ sortedDistIndices[i] ]
        classCount[ voteLabel ] = classCount.get(voteLabel, 0) + 1
    # 按照类别的数量多少进行排序
    sortedClassCount = sorted(classCount.iteritems(),
                                 key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]  # 返回类别数最多的类别名称
#-------------------end of function classify--------------------------------

def handwritingClassTest():
    # 导入数据
    digits = datasets.load_digits()
    totalNum = len(digits.data)
    # 选出90%样本作为训练样本,其余10%测试
    trainNum = int(0.8 * totalNum)
    trainX = digits.data[0 : trainNum]
    trainY = digits.target[0 : trainNum]

    testX = digits.data[trainNum:]
    testY = digits.target[trainNum:]

    errorCount = 0
    testExampleNum = len( testX )
    for i in range( testExampleNum ):
        # 测试样本在测试集中真实的类别
        trueLabel = testY[i]
        classifierResult = classify0( testX[ i, : ], trainX, trainY, 5 )
        print "\nThe classifier came back with: %d, the real answer is: %d"\
            % ( classifierResult, trueLabel )
        if trueLabel != classifierResult:
            errorCount += 1
        else:
            pass
    print "\nThe total number of errors is: %d" % errorCount
    print "\nthe total error rate is: %f" % (
        errorCount / float( testExampleNum)
        )

if __name__ == '__main__':
    print "start..."
    handwritingClassTest()
    

运行结果:

版本2(使用库函数):

# -*- coding: utf-8 -*-
"""
This script is an exercise on KNN.

Created on Tue Nov 06 21:26:39 2015

@author: ZengJiulin
"""
print(__doc__)

import numpy as np
from sklearn import neighbors, datasets

digits = datasets.load_digits()
totalNum = len(digits.data)
# 选出90%样本作为训练样本,其余10%测试
trainNum = int(0.8 * totalNum)
trainX = digits.data[0 : trainNum]
trainY = digits.target[0 : trainNum]

testX = digits.data[trainNum:]
testY = digits.target[trainNum:]

n_neighbors = 10

clf = neighbors.KNeighborsClassifier(n_neighbors, weights='uniform')
clf.fit(trainX, trainY)
Z = clf.predict(testX)

print "\nthe total error rate is: %f" % ( 1 - np.sum(Z==testY) / float(len(testX)) )

运行结果:

4.总结

KNN的优点:精度高、对异常值不敏感,无数据输入假定

缺点:计算复杂度高(要计算待分类样本与所有已知类别样本的距离),空间复杂度高(存储所有样本点和目标样本的距离)

基于Python的机器学习实战:KNN的更多相关文章

  1. 基于Python的机器学习实战:Apriori

    目录: 1.关联分析 2. Apriori 原理 3. 使用 Apriori 算法来发现频繁集 4.从频繁集中挖掘关联规则 5. 总结 1.关联分析  返回目录 关联分析是一种在大规模数据集中寻找有趣 ...

  2. 基于Python的机器学习实战:AadBoost

    目录: 1. Boosting方法的简介 2. AdaBoost算法 3.基于单层决策树构建弱分类器 4.完整的AdaBoost的算法实现 5.总结 1. Boosting方法的简介 返回目录 Boo ...

  3. 机器学习实战kNN之手写识别

    kNN算法算是机器学习入门级绝佳的素材.书上是这样诠释的:“存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都有标签,即我们知道样本集中每一条数据与所属分类的对应关系.输入没有标签的新数据 ...

  4. K近邻 Python实现 机器学习实战(Machine Learning in Action)

    算法原理 K近邻是机器学习中常见的分类方法之间,也是相对最简单的一种分类方法,属于监督学习范畴.其实K近邻并没有显式的学习过程,它的学习过程就是测试过程.K近邻思想很简单:先给你一个训练数据集D,包括 ...

  5. 朴素贝叶斯算法的python实现 -- 机器学习实战

    import numpy as np import re #词表到向量的转换函数 def loadDataSet(): postingList = [['my', 'dog', 'has', 'fle ...

  6. 基于python的机器学习开发环境安装(最简单的初步开发环境)

    一.安装Python 1.下载安装python3.6 https://www.python.org/getit/ 2.配置环境变量(2个) 略...... 二.安装Python算法库 安装顺序:Num ...

  7. 机器学习实战-KNN

    KNN算法很简单,大致的工作原理是:给定训练数据样本和标签,对于某测试的一个样本数据,选择距离其最近的k个训练样本,这k个训练样本中所属类别最多的类即为该测试样本的预测标签.简称kNN.通常k是不大于 ...

  8. 机器学习实战knn

    最近在学习这本书,按照书上的实例编写了knn.py的文件,使用canopy进行编辑,用shell交互时发现运行时报错: >>> kNN.classify0([0,0],group,l ...

  9. 基于python的机器学习实现日元币对人民币汇率预测

    ## 导入所需的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import tensorflow a ...

随机推荐

  1. D2.Reactjs 操作事件、状态改变、路由

    下面内容代码使用ES6语法 一.组件的操作事件: 1.先要在组件类定义内定义操作事件的方法,如同event handler.若我需要监听在组件内的Button的点击事件onClick,首先定义监听方法 ...

  2. 如何为Swift进行宏定义

    这阵子一直在自学Swift, 因为之前iOS的开发一直用Objective-C, 所以习惯了C语言那种宏定义方式, Swift作为一款更加安全的语言, 放弃了C语言中的宏定义, 有效的防止预编译时代码 ...

  3. Yii中事件触发机制

    控制器初始化中添加事件处理方法,在需要触发的地方直接触发 public function init() { parent::init(); // TODO: Change the autogenera ...

  4. Singleton模式

    Singleton模式的特点: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 定义一个Instance操作,允许客户访问它的唯一实例.Instance是一个类操作(C++中的一个静态成员函数 ...

  5. 嵌入式 hi3518平台获取网关

    </pre><pre code_snippet_id="495447" snippet_file_name="blog_20141024_1_70650 ...

  6. shell echo打印换行的方法

    echo要支持同C语言一样的\转义功能,只需要加上参数-e,如下所示: [~]#echo "Hello world.\nHello sea" Hello world.\nHello ...

  7. tablib源代码学习

    tablib简介 ----------- Tablib is a format-agnostic tabular dataset library, written in Python. Tablib ...

  8. kvm上安装xp

    主要为了看看图像显示是否有问题,跑起来系能如何,网络连接.文件共享是怎样的. 用的是雨林木风xp sp3的iso.为了提高性能,决定使用qcow2格式,预分配metadata,cache=none(查 ...

  9. git 本地给远程仓库创建分支 三步法

    命令如下: 1:本地创建分支dev Peg@PEG-PC /D/home/myself/Symfony (master) $ git branch dev 2:下面是把本地分支提交到远程仓库 Peg@ ...

  10. 20162311 实验三 敏捷开发与XP实践 实验报告

    20162311 实验三 敏捷开发与XP实践 实验报告 实验内容 一.研究学习IDEA中的Code菜单 使用Code ->Reformate Code功能将以下代码格式化 public clas ...