k-最近邻算法

本文详细介绍了K最近邻(KNN)算法的基本原理和实现过程,包括如何使用Python的matplotlib、pandas和numpy库来绘制数据点。通过距离计算和分类方法,展示了KNN如何进行分类,包括基于范围和K近邻两种策略。通过对黑点周围的数据点进行统计,确定其所属类别,从而阐述了KNN算法的核心思想。
摘要由CSDN通过智能技术生成

K最近邻算法:
K最近邻(K-Nearest-Neighbour , KNN)算法是比较基础的分类算法,易于理解,其核心思想就是距离的比较,即谁离得近就归类与谁。
两点间距离公式:
d = np.sqrt((x1 - x2)**2 + (y1 - y2)**2)
代码实现:
首先画出数据集data1和data2的每个点。(三种方法处理数据:1、for循环,2、pandas模块,3、numpy模块)
1、for循环:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
data1 = [[1,3],[1,2],[1,5],[2,4],[2,3],[3,6],[2,5],[3,7],[3,4],[3,8]]
data2 = [[6,4],[6,3],[6,6],[7,5],[7,4],[7,2],[7,1],[8,2],[8,4],[9,3]]
for i in data1:
    plt.scatter(i[0],i[1])
for i in data2:
    plt.scatter(i[0],i[1])    

在这里插入图片描述
2、pandas模块:

data11 = pd.DataFrame(data1)
data22 = pd.DataFrame(data2)
print(data11)
plt.scatter(data11.iloc[:,0],data11.iloc[:,1])
plt.scatter(data22[0],data22[1])

在这里插入图片描述
3、numpy模块:

data1 = np.array(data1)
data2 = np.array(data2)
plt.scatter(data1[:,0],data1[:,1])
plt.scatter(data2[:,0],data2[:,1])
plt.scatter(4,4,color="black")
print("data1:","\n",data1)

在这里插入图片描述
分类方法
通过范围分类:

#通过范围分类:在黑点两侧找出两个大小相同的方框范围,比较两个方框内点的多少将黑点进行分类。
#分别找出在[2:5]行[3:7]列的data1的点和在[4:7]行[3:7]列的data2的点
nums1=data1[(2<=data1[:,0]) & (data1[:,0]<4) & (3<=data1[:,1]) & (data1[:,1]<=6)]
nums2=data2[(4<data2[:,0]) & (data2[:,0]<=6) & (3<=data2[:,1]) & (data2[:,1]<=6)]
if len(nums1) > len(nums2):
    print("黑点属于:data1")
else:
    print("黑点属于:data2")

在这里插入图片描述
通过距离分类:(K最近邻算法)

#k-近邻:用勾股定理找出离黑点最近的5个点,哪一类的点数占的多就属于哪一类。
l_numlist = []
#计算data1各点与黑点之间的距离
for i in range(len(data1)):
    sqrt_num = (data1[i][0] - 4)**2 + (data1[i][1] - 4)**2
    l_numlist.append(np.sqrt(sqrt_num))

#计算data2各点与黑点之间的距离
for i in range(len(data2)):
    sqrt_num = (data2[i][0] - 4)**2 + (data2[i][1] - 4)**2
    l_numlist.append(np.sqrt(sqrt_num))
p = pd.DataFrame(l_numlist)    #将列表转换为有索引的DataFrame类型 
values_sort = p.sort_values(0)    #按值进行排序
index_list = values_sort[0].index[0:5]  <= len(data1)-1    #找出前5个索引值中属于data1类的索引值,以布尔形式表示
nums_1 = index_list.sum()    #计算出前5个索引值中属于data1类的索引值的个数
nums_2 = len(index_list) - nums_1    #计算出前5个索引值中属于data2类的索引值的个数
#判断
if nums_1 > nums_2:
    print("黑点属于:data1")
elif nums_1 == nums_2:
    print("两边点数相同")
else:
    print("黑点属于:data2")

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值