0%

第二章 :k-近邻算法

摘要

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

KNN

俗话说近朱者赤近墨者黑,如果你想判断这个人是怎么样的人,你不妨先去看看他的朋友圈是怎么样的,所谓观其友,而识其人。

在这里插入图片描述

从图中我们能够看到,如果要判断 绿色的是什么形状我们可以通过先判断他距离他最近的K个图形

当K=3,基于统计,两个三角形(2/3),一个正方形(1/3),我们可以判断绿色为三角形

当K=5,两个三角形(2/5),三个正方形(3/5),我们判断绿色为正方形

························

k-近邻算法的一般流程

(1) 收集数据:可以使用任何方法。
(2) 准备数据:距离计算所需要的数值,最好是结构化的数据格式。
(3) 分析数据:可以使用任何方法。
(4) 训练算法:此步骤不适用于k-近邻算法。
(5) 测试算法:计算错误率。
(6) 使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输 入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

KNN简单实现(1)

python=3.7

1
2
3
4
5
# Created on 2019/10/24 by wvdon
# website wvdon.com
# 导入使用的包
from numpy import *
import operator

创建训练的数据

1
2
3
4
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

利用matplotlib观察数据分布

1
2
3
from matplotlib import pyplot as plt
group,labels = createDataSet()
x = group[:,0]
1
y = group[:,1]
1
2
plt.scatter(x,y)
plt.show()

png

定义一个KNN函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def classify0(inX,dataSet,labels,k):
dataSetSize = dataSet.shape[0] #获得训练集的长度
diffMat = tile(inX,(dataSetSize,1))-dataSet # 复制数组 并将差值计算出来
#下面三个是计算欧氏距离
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5

#获得distances从小到大的索引值
sortedDistIndicies = distances.argsort()
classCount = {}
#找到前K个标签,输出最大的
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount [voteIlabel] = classCount.get(voteIlabel,0)+1
sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True)
return sortedClassCount[0][0]
1
2
a = classify0([1.2,0.1],group,labels,1)
a
1
'A'

补充

欧氏距离,最常见的两点之间或多点之间的距离表示法,又称之为欧几里得度量,它定义于欧几里得空间中,如点 x = (x1,…,xn),到 y(y1,….yn)

二位平面上

numpy 函数

tile
sum(axis=1)
argsort()
numpy总结

使用 k-近邻算法改进约会网站的配对效果(2)

参考

百度百科

-------------本文结束感谢您的阅读-------------