本篇文章分为两个部分,前一部分主要简单介绍K近邻,后一部分是一个例子

第一部分--K近邻简介

  从字面意思就可以容易看出,所谓的K近邻,就是找到某个样本距离(这里的距离可以是欧式距离,曼哈顿距离,切比雪夫距离等)最近的K个数据,根据最近的K个邻居属于什么分类,来判断这个样本属于什么分类。 

  简单说一下优缺点:

    优点:简单,适合于多分类问题(multi-modal,对象具有多个类别标签), kNN比SVM的表现要好。

    缺点:I:计算量大    II.如果某个分类占绝对优势,分类的效果很差,比如,印度阿三主要是黑人,如果你随便找个人,

       使用K近邻判断这个人是不是黑人,这个人周围可能都是黑人,所以不适合这种类型的数据集。

第二部分--实战例子

  数据集:iris数据集,这是个什么样的数据集呢?

    通过3种鸢尾属植物的花的四个属性(萼片长度(sepal length)、萼片宽度sepalwidth)、花瓣长度(petal length)和花瓣宽度(petal width)) 来判断属于哪一种鸢尾属植物,这三种鸢尾属植物分别是setosa、versic010r和virginica。

  数据集地址:iris数据集     将数据复制到txt文件中。

  代码:

import csv
import random
import math
import operator #装载数据集
def loadDataset(filename, split, trainingSet = [], testSet = []):
with open(filename, 'rt') as csvfile:
lines = csv.reader(csvfile)
dataset = list(lines)
for x in range(len(dataset)-1):
for y in range(4):
# print(type(dataset[x][y]))
dataset[x][y] = float(dataset[x][y])
if random.random() < split:
trainingSet.append(dataset[x])
else:
testSet.append(dataset[x]) #计算样本之间的欧式距离
def euclideanDistance(instance1, instance2, length):
distance = 0
for x in range(length):
distance += pow((instance1[x]-instance2[x]), 2)
return math.sqrt(distance) #找到相邻的k个样本
def getNeighbors(trainingSet, testInstance, k):
distances = []
length = len(testInstance)-1
for x in range(len(trainingSet)):
#testinstance
dist = euclideanDistance(testInstance, trainingSet[x], length)
distances.append((trainingSet[x], dist))
"""
operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号
"""
#distances是一个list里面放的tuple,tuple第二个元素是距离,这里就是根据距离排序,默认升序
distances.sort(key=operator.itemgetter(1))
neighbors = []
for x in range(k):
neighbors.append(distances[x][0])
return neighbors #找到k个样本中出现最多的分类,并返回
def getResponse(neighbors):
classVotes = {}
for x in range(len(neighbors)):
response = neighbors[x][-1]
if response in classVotes:
classVotes[response] += 1
else:
classVotes[response] = 1
"""
注意,python3中字典的iteritems()方法已经取消,只有item()
"""
# sortedVotes = sorted(classVotes.iteritems(), key=operator.itemgetter(1), reverse=True)
"""
sort 与 sorted 区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)
""" """
print(classVotes)
输出格式为:{'Iris-versicolor': 1, 'Iris-virginica': 2}
""" """
print(classVotes.items())
输出格式为:dict_items([('Iris-versicolor', 1), ('Iris-virginica', 2)])
"""
sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True) """
print(sortedVotes)
输出格式为:[('Iris-virginica', 3)]
"""
return sortedVotes[0][0] #得到最后全部测试样本的预测准确率
def getAccuracy(testSet, predictions):
correct = 0
for x in range(len(testSet)):
if testSet[x][-1] == predictions[x]:
correct += 1
return (correct/float(len(testSet)))*100.0 #主函数
def main():
#prepare data
trainingSet = []
testSet = []
split = 0.67 #0.67相当于2/3,就是说2/3是训练集,1/3是测试集,整个iris数据集中有150个数据
loadDataset(r'../data/DTree/irisdata.txt', split, trainingSet, testSet)
# print(trainingSet)
print ('训练集样本数: ' + repr(len(trainingSet)))
print ('测试集样本数: ' + repr(len(testSet)))
#generate predictions
predictions = []
k = 3
for x in range(len(testSet)):
# trainingsettrainingSet[x]
neighbors = getNeighbors(trainingSet, testSet[x], k)
result = getResponse(neighbors)
predictions.append(result)
if result == testSet[x][-1]:
correct = True
else:
correct = False
print ('预测结果:' + repr(result) + ', 实际值=' + repr(testSet[x][-1]) + ', 是否预测正确=' + repr(correct))
accuracy = getAccuracy(testSet, predictions)
#整个测试集预测准确率
print('准确率: ' + repr(accuracy) + '%') if __name__ == '__main__':
main()

输出结果为:

训练集样本数: 109
测试集样本数: 41
预测结果:'Iris-setosa', 实际值='Iris-setosa', 是否预测正确=True
预测结果:'Iris-setosa', 实际值='Iris-setosa', 是否预测正确=True
预测结果:'Iris-setosa', 实际值='Iris-setosa', 是否预测正确=True
预测结果:'Iris-setosa', 实际值='Iris-setosa', 是否预测正确=True
预测结果:'Iris-setosa', 实际值='Iris-setosa', 是否预测正确=True
预测结果:'Iris-setosa', 实际值='Iris-setosa', 是否预测正确=True
预测结果:'Iris-setosa', 实际值='Iris-setosa', 是否预测正确=True
预测结果:'Iris-setosa', 实际值='Iris-setosa', 是否预测正确=True
预测结果:'Iris-setosa', 实际值='Iris-setosa', 是否预测正确=True
预测结果:'Iris-setosa', 实际值='Iris-setosa', 是否预测正确=True
预测结果:'Iris-setosa', 实际值='Iris-setosa', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-versicolor', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-versicolor', 实际值='Iris-virginica', 是否预测正确=False
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
预测结果:'Iris-virginica', 实际值='Iris-virginica', 是否预测正确=True
准确率: 97.5609756097561%

[机器学习]-K近邻-最简单的入门实战例子的更多相关文章

  1. Python3入门机器学习 - k近邻算法

    邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...

  2. [机器学习] k近邻算法

    算是机器学习中最简单的算法了,顾名思义是看k个近邻的类别,测试点的类别判断为k近邻里某一类点最多的,少数服从多数,要点摘录: 1. 关键参数:k值 && 距离计算方式 &&am ...

  3. 机器学习--K近邻 (KNN)算法的原理及优缺点

    一.KNN算法原理 K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法. 它的基本思想是: 在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对 ...

  4. 机器学习-K近邻(KNN)算法详解

    一.KNN算法描述   KNN(K Near Neighbor):找到k个最近的邻居,即每个样本都可以用它最接近的这k个邻居中所占数量最多的类别来代表.KNN算法属于有监督学习方式的分类算法,所谓K近 ...

  5. 机器学习—K近邻

    一.算法原理 还是图片格式~ 二.sklearn实现 import pandas as pd import numpy as np import matplotlib.pyplot as plt im ...

  6. 机器学习 Python实践-K近邻算法

    机器学习K近邻算法的实现主要是参考<机器学习实战>这本书. 一.K近邻(KNN)算法 K最近邻(k-Nearest Neighbour,KNN)分类算法,理解的思路是:如果一个样本在特征空 ...

  7. 机器学习(1)——K近邻算法

    KNN的函数写法 import numpy as np from math import sqrt from collections import Counter def KNN_classify(k ...

  8. 每日一个机器学习算法——k近邻分类

    K近邻很简单. 简而言之,对于未知类的样本,按照某种计算距离找出它在训练集中的k个最近邻,如果k个近邻中多数样本属于哪个类别,就将它判决为那一个类别. 由于采用k投票机制,所以能够减小噪声的影响. 由 ...

  9. 1.K近邻算法

    (一)K近邻算法基础 K近邻(KNN)算法优点 思想极度简单 应用数学知识少(近乎为0) 效果好 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 图解K近邻算法 上图是以 ...

随机推荐

  1. ES6新特性6:模块Module

    本文摘自ECMAScript6入门,转载请注明出处. 一.Module简介 ES6的Class只是面向对象编程的语法糖,升级了ES5的构造函数的原型链继承的写法,并没有解决模块化问题.Module功能 ...

  2. 东芝线阵CCD芯片TCD1305DG驱动时序设计

    最近在做微型光谱仪,用到了东芝的CCD芯片TCD1305DG,该芯片是单行3648像素,输出信号是时间上离散的模拟信号,典型输出速率为0.5M,即每2000ns输出一个像素值(模拟信号),芯片内部集成 ...

  3. 包学会之浅入浅出Vue.js:结业篇

    在第一篇<包学会之浅入浅出Vue.js:开学篇>和上一篇<包学会之浅入浅出Vue.js:升学篇>的学习中,我们首先了解了Vue环境的搭建以及两个重要思想——路由和组件的学习,通 ...

  4. Scala_类和对象

    类是对象的抽象,而对象是类的具体实例.类是抽象的,不占用内存,而对象是具体的,占用存储空间. import scala.beans.BeanProperty class ChecksumAccumul ...

  5. Scala的高级特性

    高阶函数 概念 Scala混合了面向对象和函数式的特性,我们通常将可以作为参数传递到方法中的表达式叫做函数.在函数式编程语言中,函数是“头等公民”,高阶函数包含:作为值的函数.匿名函数.闭包.柯里化等 ...

  6. 基于 Keras 用深度学习预测时间序列

    目录 基于 Keras 用深度学习预测时间序列 问题描述 多层感知机回归 多层感知机回归结合"窗口法" 改进方向 扩展阅读 本文主要参考了 Jason Brownlee 的博文 T ...

  7. Facebook如何管理150亿张照片

    Facebook 的照片分享很受欢迎,迄今,Facebook 用户已经上传了150亿张照片,加上缩略图,总容量超过1.5PB,而每周新增的照片为2亿2000万张,约25TB,高峰期,Facebook ...

  8. 20155305mypwd的实现和测试

    20155305mypwd的实现和测试 pwd命令及其功能 命令格式: pwd 命令功能: 查看"当前工作目录"的完整路径 常用参数: 一般情况下不带任何参数 作业mypwd代码实 ...

  9. 2017-2018-1 20155313 《信息安全系统设计基础》 Myod

    2017-2018-1 20155313 <信息安全系统设计基础> Myod Myod要求 1.复习c文件处理内容 2.编写myod.c 用myod XXX实现Linux下od -tx - ...

  10. Linux常用文件权限控制命令

    一,查看文件属主属组ls -l [root@localhost app]# ls -l total 302832 drwxr-xr-x. 4 lhc lhc 4096 Nov 18 16:05 apa ...