1. 综述

1.1 Cover和Hart在1968年提出了最初的邻近算法
1.2 分类(classification)算法|回归算法,这里讨论的是分类算法
1.3 输入基于实例的学习(instance-based learning), 懒惰学习(lazy learning)

2.1 步骤

为了判断未知实例的类别,以所有已知类别的实例作为参照
选择参数K
计算未知实例与所有已知实例的距离
选择最近K个已知实例
根据少数服从多数的投票法则(majority-voting),让未知实例归类为K个最邻近样本中最多数的类别 

2.2 细节:

关于K
关于距离的衡量方法:
2.2.1 Euclidean Distance 定义
        
其他距离衡量:余弦值(cos), 相关度 (correlation), 曼哈顿距离 (Manhattan distance)

2.3 举例

 

3. 例子

未知电影属于什么类型?
 

4、python代码实现

利用Python的机器学习库sklearn: SkLearnExample.py

import csv
import random
import math
import operatordef loadDataset(filename, split, trainingSet = [], testSet = []):'''导入数据:param filename::param split: 将数据总集以split为界限 分成训练集和测试集:param trainingSet::param testSet::return:'''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):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):'''计算euclideanDistance:param instance1::param instance2::param length: 维度:return:'''distance = 0for x in range(length):distance += pow((instance1[x]-instance2[x]), 2)return math.sqrt(distance)def getNeighbors(trainingSet, testInstance, k):'''返回最近的k个邻居:param trainingSet: 训练集:param testInstance: 一个测试实例:param k: 参数k:return:'''distances = []length = len(testInstance)-1for x in range(len(trainingSet)):#testinstancedist = euclideanDistance(testInstance, trainingSet[x], length)distances.append((trainingSet[x], dist))#distances.append(dist)distances.sort(key=operator.itemgetter(1))neighbors = []for x in range(k):neighbors.append(distances[x][0])return neighborsdef getResponse(neighbors):'''以距离排序,返回最近的几个点:param neighbors::return:'''classVotes = {}for x in range(len(neighbors)):response = neighbors[x][-1]if response in classVotes:classVotes[response] += 1else:classVotes[response] = 1sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True)  # python3 里的.items()返回的是列表,.iteritems()返回的是一个迭代器return sortedVotes[0][0]def getAccuracy(testSet, predictions):'''预测值和实际值的准确率:param testSet::param predictions::return:'''correct = 0for x in range(len(testSet)):if testSet[x][-1] == predictions[x]:correct += 1return (correct/float(len(testSet)))*100.0def main():#prepare datatrainingSet = []testSet = []split = 0.67loadDataset(r'irisdata.txt', split, trainingSet, testSet)print('Train set: ' + repr(len(trainingSet)))print('Test set: ' + 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)print ('>predicted=' + repr(result) + ', actual=' + repr(testSet[x][-1]))accuracy = getAccuracy(testSet, predictions)print('Accuracy: ' + repr(accuracy)+ '%')if __name__ == '__main__':main()

  

5. 算法优缺点

5.1 算法优点

简单
易于理解
容易实现
通过对K的选择可具备丢噪音数据的健壮性          

5.2 算法缺点

需要大量空间储存所有已知实例
算法复杂度高(需要比较所有已知实例与要分类的实例)
当其样本分布不平衡时,比如其中一类样本过大(实例数量过多)占主导的时候,新的未知实例容易被归类为这个主导样本,因为这类样本实例的数量过大,但这个新的未知实例实际并木接近目标样本

 

转载于:https://www.cnblogs.com/momo072994MLIA/p/9435102.html

机器学习之KNN算法学习笔记相关推荐

  1. 机器学习knn算法学习笔记使用sklearn库 ,莺尾花实例

    ** 机器学习knn算法学习笔记使用sklearn库 ,莺尾花实例. 具体knn算法是怎样的我这里就不再详细论述.在这里我注意总结我使用knn算法进行一个分类的分析 ** 分析过程 1.前期准备 引入 ...

  2. 机器学习入门 —— 超级详细的KNN算法学习笔记、KNN算法的三要素、KNN算法的优缺点

    文章目录 KNN(K nearest neighbors) K值的选择和影响 k取值偏小 k取值偏大 样本点距离的计算方式 闵可夫斯基距离 曼哈顿距离 欧几里得距离 切比雪夫距离 余弦距离 决策函数的 ...

  3. 机器学习篇01:在线学习的支持向量机算法学习笔记

    在线学习的支持向量机算法学习笔记 oisvm算法实现说明 oisvm算法实现说明 % 本程序是用于实现基于在线学习的调制信号识别的程序 % % % 第一步:调制信号的生成 % 首先是7个信号:2ASK ...

  4. 【1】机器学习实战peter Harrington——学习笔记

    机器学习实战peter Harrington--学习笔记 综述 数据挖掘十大算法 本书结构 一.机器学习基础 1.1 机器学习 1.2 关键术语 1.3 机器学习主要任务 1.4 如何选择合适的算法 ...

  5. 机器学习框架ML.NET学习笔记【1】基本概念与系列文章目录

    一.序言 微软的机器学习框架于2018年5月出了0.1版本,2019年5月发布1.0版本.期间各版本之间差异(包括命名空间.方法等)还是比较大的,随着1.0版发布,应该是趋于稳定了.之前在园子里也看到 ...

  6. 机器学习框架ML.NET学习笔记【5】多元分类之手写数字识别(续)

    一.概述 上一篇文章我们利用ML.NET的多元分类算法实现了一个手写数字识别的例子,这个例子存在一个问题,就是输入的数据是预处理过的,很不直观,这次我们要直接通过图片来进行学习和判断.思路很简单,就是 ...

  7. Python最优化算法学习笔记(Gurobi)

    微信公众号:数学建模与人工智能 github地址:https://github.com/QInzhengk/Math-Model-and-Machine-Learning Python最优化算法学习笔 ...

  8. python3《机器学习实战系列》学习笔记----3.2 决策树实战

    前言 一.ID3算法构造决策树 1.1 背景 1.2 信息增益计算 1.3 递归生成决策树 二.使用Matplotlib注解绘制树形图 2.1 Matplotlib注解 2.2 构造注解树 三.测试和 ...

  9. 机器学习之KNN算法原理

    机器学习之KNN算法原理 1 KNN算法简介 2 算法思想 3 多种距离度量公式 ① 欧氏距离(Euclidean distance) ② 曼哈顿距离(Manhattan distance) ③ 闵式 ...

最新文章

  1. 深度学习计算机视觉常见的29道面试题及解析
  2. 浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案
  3. win2000输入密码后循环登陆,不能进入用户桌面
  4. 没有建立对验证码签名的目录的发布者信任
  5. IP地址分类及ISO-OSI、三次握手
  6. 基于javaweb(springboot+mybatis)宠物医院预约管理系统设计和实现以及论文报告
  7. python3文档字符串_python3基础:字符串、文本文件
  8. Speaker Recognition: Feature Extraction
  9. java发送hotmail邮件,使用javamail将电子邮件发送到hotmail时遇到问题
  10. LVS 实现负载均衡
  11. abaqus2018+intel fortran2019+vs2015安装全记录
  12. Ubuntu/Win10双系统安全删除Ubuntu的方法
  13. Github上传代码及解决main主分支问题
  14. 六款超好用的大数据分析工具
  15. 组织人事领域信息化探索:开启编制、干部、人事一体化管理新模式
  16. GTX1050Ti和GTX1060的差距 哪个好
  17. 一文搞懂蓝绿部署和金丝雀发布
  18. 三峡大学计算机与信息学院王,周欢,三峡大学 计算机与信息学院
  19. springboot 和 js (vue) 实现SM3加密 防篡改
  20. Tridium niagara N4---报警告警信息点设置

热门文章

  1. NumPy、TensorFlow和scikit-learn简介
  2. 统一操作系统 UOS 龙芯版上线
  3. .NET Core 2.1.12 与 2.2.6 发布,修复 URL 重定向欺骗漏洞
  4. 使用dotMemory Unit发现并修复内存问题
  5. .NET中的异步编程——常见的错误和最佳实践
  6. python生成随机数random操作_Python random生成随机数示例
  7. gradle 不支持多级子模块_解决gradle多模块依赖在Idea中能运行,gradle build失败的问题。...
  8. PHP 5.6 中 Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future
  9. android7.1以太网动态ip,android7.1编译路上的那些坑!(部分转自网络整理)
  10. laravel mysql 视图_Laravel框架控制器,视图及模型操作图文详解