K-最近邻算法

目  录

一.简 介

二.核心思想与步骤

三.样例分析

四.代码展示

正  文

一. 简介

         K最近邻算法(K-Nearest Neighbor, KNN)是最基本的分类算法,其基本原理是:从最近的K个邻居(样本)中,选择出现次数最多的类别作为判定类别,该算法是数据挖掘分类技术中最简单的方法之一,K最近邻算法可以理解为是一个分类算法,常用于标签的预测,如性别。

二. 核心思想与步骤

        1.核心思想:

        如果一个样本在特征空间中的K个最相邻的样本中的大多数属于同一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

        2.算法步骤分析:

  • 计算距离(测试数据与训练数据之间的距离)

  • 将距离排序(通常采用升序)

  • 得到距离最小的前K个样本

  • 确认K个点它所在类别出现的频率

  • 出现次数最多的标签即为最终类别

  •  注意:计算距离我们通常采用最熟悉的欧几里得距离计算法(即为勾股定理法),读者也可  采用其他简便且熟悉的算法对距离进行计算

三. 样例分析

        1.电影分类。
           样本数据:

电影名称打斗镜头亲密镜头电影类型
California Man594爱情片
He’s Not Really into Dudes699爱情片
Beautiful woman393爱情片
Kevin Longblade918动作片
Robo Slayer 3000995动作片
Amped II7822动作片
?1890未知

如果我们计算出已知电影与未知电影的距离:

电影名称与未知电影的距离
California Man20.5
He’s Not Really into Dudes18.7
Beautiful woman19.2
Kevin Longblade115.3
Robo Slayer 3000117.4
Amped II118.9

按照距离递增排序,可以找到k个距离最近的电影。假定k=3,则三个最靠近的电影依次是:

  1. He’s Not Really into Dudes
  2. Beautiful woman
  3. California Man

kNN按照距离最近的三部电影的类型,决定未知电影的类型——爱情片。

        2.小球颜色分类

        我们需要确定绿色的测试点属于哪个颜色(测试点也可以定为其他颜色),要做的就是选出距离目标点距离最近的k个点,看这k个点的大多数颜色是什么颜色。以绿点为圆心做圆,可以直观地看到其他样本与其目标点距离大小的排序,当k取3的时候,我们可以看出距离最近的三个,分别是红色,红色,蓝色,因此得到目标点为红色;但当k取5时,我们可以看出距离最近的五个,分别是红色,红色,蓝色,蓝色,蓝色,所以得到的目标点为蓝色,因此我们可以知道k的取值不同,得到的结果也是不同的。如图:

 四. 代码与结果展示

        1.Python代码展示

#引库
import numpy as np
import matplotlib.pyplot as plt
from math import sqrt
%matplotlib inline
#原始数据
data=[[1,0.9],[1,1],[0.1,0.2],[0,0.1]]
labels=['A','A','B','B']
test_data=[[0.1,0.3]]
#绘制原始数据散点图
print("------------------------数据准备----------------------")
print("原始数据图像绘制...")
for i in range(len(data)):
    plt.scatter(data[i][0],data[i][1],color='b')
plt.scatter(test_data[0][0],test_data[0][1],color='r')
plt.show()
#测试数据x=(0.1,0.3)
#采用欧氏距离进行计算
print("------------------------距离计算----------------------")
x=[[0.1,0.3]]
distance=[]
labels_vz=[]
for i in range(len(data)):
    d=0
    d=sqrt((x[0][0]-data[i][0])**2+(x[0][1]-data[i][1])**2)
    distance.append(d)
    labels_vz.append(i)
print("计算的距离为:\n",distance)
print("现在对应的标签位置为:\n",labels_vz)
#按照升序排序,并取距离最小的前3个
print("-----------------------距离排序-----------------------")
for i in range(len(data)-1):
    for j in range(i+1,len(data)):
        if distance[i]>distance[j]:
            distance[i],distance[j]= distance[j],distance[i]
            labels_vz[i],labels_vz[j]= labels_vz[j],labels_vz[i]
print("排序后的距离为:\n",labels_vz)
print("取距离最近的3个值:",distance[0:3])
#进行投票表决
print("-----------------------表决投票-----------------------")
A=0
B=0
for i in range(len(labels_vz[0:3])):
    if labels[labels_vz[i]]=='A':
        A+=1
    else:
        B+=1
print("投票为A的数量为:",A)
print("投票为B的数量为:",B)
print("\n对照初始图中红色点(测试点)与前两个标签为A的离的最近,所以我们的计算与图中所呈现的绘图一致")

        2.运行结果展示

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值