K邻近算法(KNN,k-NearestNeighbor)算法学习记录

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/leemu0822/article/details/101759467

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

其实,对于机器学习来说,KNN是最简单的一个入门算法,类似于编程的“hello world”,所谓近朱者赤近墨者黑,如果你想了解一个人,你看他身边的朋友大概就能知道这个人是怎么样的,KNN算法的核心思想也是这样,下面来看看这个图:

要想知道图中绿色的圆圈是属于哪一类的数据,取决于K的值,由图可知,当K=2时,它靠近最多样本的的是红色的三角形,由此可以推断当K=2时,新样本属于三角形类别的,当K=3时,新样本属于蓝色正方形,这就是KNN算法,它一般同归一下几个步骤来预测或者判断新样本属于哪一个类别的:

1.计算距离(常用欧几里得距离或者马氏距离)

其实我们中学所学的计算两个点或者两个向量的距离

二维空间的公式

其中,为点  与点之间的欧氏距离;为点 到原点的欧氏距离。

三维空间的公式

n维空间的公式

2.升序排列

通过计算新样本与所有点的距离,然后进行升序排列

3.取前K个

升序排列后,取前K个值

4.加权平均

对于离得比较近的点,应该给高一点的权重,比较远的点,给相对低的权重,而不是使用算数平均


KNN算法处理大概是以上几个步骤,而其实算法核心最关键的是K值的选取,那么怎么来选取K值呢?

根据经验来讲,K值一般选取奇数效果比较好,为什么选取奇数呢?因为一般对于二分类问题来说,把K设置为奇数是容易防止平局的现象。但对于多分类来说,设置为奇数未必一定能够防平局。

下面通过一个简单的例子来实现以下这个算法,这个例子是通过电影的接吻镜头和武打镜头作为标签,来预测一部电影属于什么类别的电影,先看看代码:

import  numpy as np
import  pandas as pd
from  pandas import  Series,DataFrame
from sklearn.neighbors import  KNeighborsClassifier

data=pd.read_excel('movies.xlsx',sheet_name='Sheet1')
X=data[['武打镜头','接吻镜头']]
y=data['分类情况']
knn=KNeighborsClassifier(n_neighbors=5)
knn.fit(X,y)
X_test=np.array([[100,2],[2,15]])
print(knn.predict(X_test))

再看看excel的数据:

这篇属于总结学习,接下来会更深入的分析,如果对你有用,给我点赞

猜你喜欢

转载自blog.csdn.net/leemu0822/article/details/101759467