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")