K-近邻算法的直观理解就是:给定一个训练集合,对于新的实例,在训练集合中找到k个与该实例最近的邻居,然后根据“少数服从多数”原则判断该实例归属于哪一类,又称“随大流”

K-近邻算法的三大要素:K值得选取,邻居距离度量,分类决策的制定。

(1)K值选取:通常采用交叉验证选取最优的K值(自己了解)

(2)邻居距离度量:根据不同的应用场景选取相应的距离度量。常见的距离度量有欧几里得距离、曼哈顿距离、马氏距离。同时要注意的是归一化机制。

(3)分类决策制定:一般分为平等投票表决原则和加权投票原则。

import operator
import csv
import math
import random def loadDataSet(filename,split,trainingSet=[],testSet=[]):
#读取本地数据#
with open(filename,'r') 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 EuclidDist(instance1,instance2,len):
#求欧几里得距离#
distance=0.0
for x in range(len):
distance+=pow((instance1[x]-instance2[x]),2)
return math.sqrt(distance) def getNeighbors(trainSet,testInstance,k):
#获取最近邻居#
distance=[]
length=len(testInstance)-1
for x in range(len(trainSet)):
dist=EuclidDist(testInstance,trainSet[x],length)
distance.append((trainSet[x],dist))
distance.sort(key=operator.itemgetter(1))
#列表的sort(key)方法用来根据关键字排序
neighbors=[]
for x in range(k):
neighbors.append(distance[x][0])
return neighbors def getClass(neighbors):
#分类与评估函数#
classVotes={}
for x in range(len(neighbors)):
instance_class=neighbors[x][-1]
if instance_class in classVotes:
classVotes[instance_class]+=1
else:
classVotes[instance_class]=1
sortedVotes=sorted(classVotes.items(),key=operator.itemgetter(1),reverse=True)
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():
trainingSet=[]
testSet=[]
split=0.7
loadDataSet('iris.data.csv',split,trainingSet,testSet)
print('训练集合:'+repr(len(trainingSet)))
print('测试集合:'+repr(len(testSet)))
predictions=[]
k=3
for x in range(len(testSet)):
neighbors=getNeighbors(trainingSet,testSet[x],k)
result=getClass(neighbors)
predictions.append(result)
print('>预测='+repr(result)+',实际='+repr(testSet[x][-1]))
accuracy=getAccuracy(testSet,predictions)
print('精确度为:'+repr(accuracy)+'%') main()

针对此代码中的数据来源为UCI机器学习库中的鸢尾花卉数据集,可以直接获取(https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data),也可以下载我转换好的CSV文件(链接:https://pan.baidu.com/s/1YSLhrPMn3RflGE8VDGGbHQ 提取码:42se )

本次范例属于“自己动手丰衣足食”,每个函数都自己实现,可以在入门阶段对K-近邻算法流程有个初步认识,在有了一定基础之后,我们就没有必要重造轮子,可以使用常见的机器学习算法,毕竟其专业性远远目前超过我们自己的程序。例如scikit-learn模块。

K-近邻算法入门的更多相关文章

  1. 数据挖掘入门系列教程(三)之scikit-learn框架基本使用(以K近邻算法为例)

    数据挖掘入门系列教程(三)之scikit-learn框架基本使用(以K近邻算法为例) 简介 scikit-learn 估计器 加载数据集 进行fit训练 设置参数 预处理 流水线 结尾 数据挖掘入门系 ...

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

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

  3. 算法入门系列2:k近邻算法

    用官方的话来说,所谓K近邻算法(k-Nearest Neighbor,KNN),即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个 ...

  4. 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)

    No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...

  5. 基本分类方法——KNN(K近邻)算法

    在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...

  6. K近邻算法:机器学习萌新必学算法

    摘要:K近邻(k-NearestNeighbor,K-NN)算法是一个有监督的机器学习算法,也被称为K-NN算法,由Cover和Hart于1968年提出,可以用于解决分类问题和回归问题. 1. 为什么 ...

  7. 机器学习实战笔记--k近邻算法

    #encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...

  8. k近邻算法的Java实现

    k近邻算法是机器学习算法中最简单的算法之一,工作原理是:存在一个样本数据集合,即训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据和所属分类的对应关系.输入没有标签的新数据之后, ...

  9. 从K近邻算法谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...

  10. 机器学习之K近邻算法(KNN)

    机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...

随机推荐

  1. C# 缓存工厂类

    描 述:缓存工厂类 /// <summary> /// 描 述:缓存工厂类 /// </summary> public class CacheFactory { /// < ...

  2. 用Vue的父子组件通信实现todolist的功能

    先上代码 <body> <div id="root"> <div> <input v-model="inputValue&quo ...

  3. 用JS遍历循环时覆盖了之前的值

    使用js遍历Echarts时,三个数据项,七个分类,遍历如下, 其他都没有问题,就是series.data里的数据只加载了一组,控制台显示数组的长度是7,可是下面的数据只有一个 发现把给数据项赋值的语 ...

  4. Delphi跨平台下的GetTickCount,GetCurrentThreadID

    在Windows下只要uses Windows,就有这两个API可调用GetTickCount,GetCurrentThreadID 如果我们需要跨平台使用这两个函数,就不能仅仅Uses Window ...

  5. 数据立方体(Cube)

    如上图所示,这是由三个维度构成的一个OLAP立方体,立方体中包含了满足条件的cell(子立方块)值,这些cell里面包含了要分析的数据,称之为度量值.显而易见,一组三维坐标唯一确定了一个子立方. 多位 ...

  6. python多进程详解和协程

    1.由于python多线程适合于多IO操作,但不适合于cpu计算型工作,这时候可以通过多进程实现.python多进程简单实用 # 多进程,可以cpu保持一致,python多线程适合多io.对于高cpu ...

  7. Myeclipse破解总结

    今天安装svn,Myeclipse莫名的崩了,然后就重装,然后不知为什么一直失败...经过无数次尝试,终于成功,应该是把这个破解过程遇到的所有问题都遇到了吧.有个别细节我没尝试,但以下总结用于Myec ...

  8. Eclipse怎么恢复默认界面

    Eclipse里面将界面恢复到默认状态: 1.选择Eclipse的工具栏里面的“窗口(Window)”,找到“复位透视图(Reset Perspective)”选项: 2.单击“复位透视图(Reset ...

  9. #《JAVA程序设计》 20155214 实验五 网络编程与安全

    <JAVA程序设计> 20155214 实验五 网络编程与安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 要求一 结对实现中缀表达式转后缀 ...

  10. 20155339 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile以及myod

    20155339 2017-2018-1<信息安全系统设计>第四周课堂测试.Makefile以及myod 测试1-vi 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号 用Vi ...