本篇文章分为两个部分,前一部分主要简单介绍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 = 0for 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)-1for x in range(len(trainingSet)):#testinstancedist = 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] += 1else: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 = 0for x in range(len(testSet)):if testSet[x][-1] == predictions[x]:correct += 1return (correct/float(len(testSet)))*100.0#主函数
def main():#prepare datatrainingSet = []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 predictionspredictions = []k = 3for 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 = Trueelse:correct = Falseprint ('预测结果:' + 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%

转载于:https://www.cnblogs.com/gunduzi/p/10623013.html

[机器学习]-K近邻-最简单的入门实战例子相关推荐

  1. 机器学习——K近邻算法(KNN)(K Nearest Neighbor)

    参考视频与文献: python与人工智能-KNN算法实现_哔哩哔哩_bilibili 机器学习--K近邻算法(KNN)及其python实现_清泉_流响的博客-CSDN博客_python实现knn 机器 ...

  2. android php实战,android编程开发入门实战例子–hello word

    android开发入门实战编程例子–hello word 1.打开Eclipse,选择菜单File->New->Other,打开新建对话框.选择Android Project后,点击Nex ...

  3. 机器学习-分类之K近邻算法(KNN)原理及实战

    k近邻算法(KNN) 简介 KNN算法是数据挖掘分类技术中最简单的方法之一.它通过测量不同特征值之间的距离进行分类的.其基本思路为:如果一个样本在特征空间中的k个最近邻样本中的大多数属于某一个类别,则 ...

  4. 机器学习-K近邻项目实战

    Airbnb 房价预测任务 数据读取 import pandas as pd features = ['accommodates','bedrooms','bathrooms','beds','pri ...

  5. 【机器学习-K近邻算法】

    K-近邻算法 K-近邻算法的快速入门 K-近邻(KNN)算法概念 殴式距离公式 电影分类案例 K-近邻算法API Scikit-learn工具 Scikit-learn包含内容 K-近邻算法API方法 ...

  6. [机器学习]K近邻算法及其应用--WEKA工具

    K近邻算法理论基础 k近邻模型 距离度量 k值的选择 分类决策规则 WEKA实战 问题背景 数据预处理 得到分类器 对未知的数据进行分类预测 K近邻算法理论基础 (本节内容参考了:李航<统计学习 ...

  7. python 机器学习——K 近邻分类理论及鸢尾( Iris )数据集实例操作

    K 近邻分类理论及鸢尾( Iris )数据集实例操作 一.K 近邻分类理论 二.K 近邻分类实例操作 (1)导入数据 划分训练集测试集 (3)数据标准化 (4)用 K 近邻法建立模型 (5)性能评估 ...

  8. 深入理解机器学习——k近邻(kNN,k-Nearest Neighbor)算法:基础知识

    分类目录:<深入理解机器学习>总目录 k近邻(k-Nearest Neighbor,kNN)算法是一种常用的有监督学习算法,可以完成分类与回归的任务,其工作机制非常简单:给定测试样本,基于 ...

  9. python机器学习 | K近邻算法学习(1)

    K近邻算法学习 1 K近邻算法介绍 1.1算法定义 1.2算法原理 1.3算法讨论 1.3.1 K值选择 1.3.2距离计算 1.3.3 KD树 2 K近邻算法实现 2.1scikit-learn工具 ...

最新文章

  1. 2021年大数据Kafka(一):❤️消息队列和Kafka的基本介绍❤️
  2. 高通创投在中国区的投资重点,目前主要聚焦在AI+5G、XR+5G、机器人/自动驾驶+5G、物联网+5G四个方面。
  3. ACM模板--邻接矩阵 有向图
  4. asp.net 加载xml到menu
  5. Followme Devops step by step
  6. 10G 职场晋升/IT干货/生活技能/理财秘籍 【全套】学习资料免费送!
  7. 共筑计算新生态 共赢数字新时代
  8. Hibernate 多表关联
  9. 数据卡片_手把手教你构建企业实时数据大屏
  10. (16)数据结构-并查集
  11. 发那科机器人接线电源_电源开关上的L1和L2是不是火线和零线?
  12. 数据挖掘案例(1):泰坦尼克号-数据挖掘流程
  13. “新基建”对下沉市场意味着什么?
  14. 马克思主义哲学(认识论)
  15. 如何在Microsoft Word 2010中创建自定义封面
  16. es-从搜索中检索选定的字段
  17. 网络安全知识竞赛选择题(121-160题)
  18. 一元二次方程组的简单解法
  19. 打印机如何打印白色_打印机可以打印白色吗?
  20. 数据挖掘中的模式发现(七)GSP算法、SPADE算法、PrefixSpan算法

热门文章

  1. 操作系统linux配置php,操作系统--Linux的详细介绍
  2. pycharm TabError: inconsistent use of tabs and spaces in indentation
  3. SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND 0.5MB MODEL SIZE
  4. 安装kinnect v1驱动
  5. mex 1 hello,world
  6. 基于深度学习的青菜病害区域图像语义分割与定位
  7. [Java]toString的用法
  8. 小红书下拉词是什么?小红薯下拉框怎么做?下拉词框如何应用?
  9. 抖音下拉框中的下拉词是怎么出来的?
  10. 安卓java代码写控件_安卓自定义流程进度图控件实例代码