目录
一、k-近邻算法
k-近邻算法概述
采用测量不同特征值之间的距离方法进行分类。
1.给定一个训练集合M和一个测试对象n,其中该对象是由一个属性值和未知的类别标签组成的向量。
2.计算对象m和训练集中每个对象之间的距离(一般是欧式距离)或者相似度(一般是余弦相似度),确定最近邻的列表
3.将最近邻列表中数量占据最多的类别判给测试对象z。
一般来说,我们只选择训练样本中前K个最相似的数据,这便是k-近邻算法中k的出处。
k-近邻算法一般流程
1.收集数据:可以使用任何方法。
2.准备数据:距离计算所需要的数值,最好是结构化的数据格式。
3.分析数据:可以使用任何方法。
4.训练算法:此步骤不适用于k-近邻算法。
5.测试算法:计算错误率。
6.使用算法:首先输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
K-近邻算法步骤
1.计算未知实例到所有已知实例的距离。
2.选择参数k
3.根据多数表决规则,将未知实例归类为样本中最多数的类别
点距离的计算
通常使用的距离函数有:欧氏距离、余弦距离、汉明距离、曼哈顿距离等,一般选欧氏距离作为距离度量,但是这是只适用于连续变量。
这里的p值是一个变量,
当p=1的时候就得到了 曼哈顿距离 ;
当p=2的时候就得到了欧氏距离。
K值选取
k值一般是通过交叉验证来确定;经验规则来说,一般k是低于训练样本数的平方根。
交叉验证:通过将原始数据按照一定的比例,比如6/4,拆分成训练数据集和测试数据集,K值从一个较小的值开始选取,逐渐增大,然后计算整个集合的方差,从而确定一个合适的K值。
二、K-近邻算法实现
(网上的一个小示例)
主要步骤为:
1.创建数据集合和标签
2.距离的排序(从大到小)
3.统计K个样本中出现次数多的,归属于该类别
# coding:utf-8
# author: Peter
from numpy import *
import operator
# 给出训练数据以及对应的类别
def createDataSet(): # 创建数据和标签
group = array([[1.0,2.0],[1.2,0.1],[0.1,1.4],[0.3,3.5]])
labels = ['A','A','B','B']
return group,labels
# 使用KNN算法进行分类
def classify(input, dataSet, label, k):
dataSize = dataSet.shape[0]
# 计算欧式距离
diff = tile(input,(dataSize,1)) - dataSet
sqdiff = diff ** 2
squareDist = sum(sqdiff,axis = 1) #行向量分别相加,从而得到新的一个行向量
dist = squareDist ** 0.5
##对距离进行排序:argsort()根据元素的值从大到小对元素进行排序,返回下标
sortedDistIndex = argsort(dist)
classCount={}
for i in range(k):
voteLabel = label[sortedDistIndex[i]]
# K个样本所属的类别个数进行统计
classCount[voteLabel] = classCount.get(voteLabel,0) + 1
# 选取出现的类别次数最多的类别
maxCount = 0
for key,value in classCount.items():
if value > maxCount:
maxCount = value
classes = key
return classes
三、小结
K-近邻算法优缺点
![](https://i-blog.csdnimg.cn/blog_migrate/39f8fc5dca81afa40e4f37a6d73b420a.jpeg)