"""
knn算法,二分类的简单实现:物以类聚,人以群分,要判断一个新数据的类别,就看他的邻居是谁
计算距离时既可以使用欧氏距离,也就是两点之间的直线距离,也可以使用曼哈顿距离,也就是坐标轴距离的绝对值的和。
"""
import numpy as np
import math
# 训练集
train_x = [[15, 3],
[10, 2],
[5, 14],
[18, 4],
[3, 15],
[4, 11],
[5, 13],
[2, 10],
[14, 5],
[11, 2]]
# 结果集,设男是0,女是1
train_y = [1, 1, 0, 1, 0, 0, 0, 0, 1, 1]
# 将数据集转化为numpy类型的
trainx = np.array(train_x)
trainy = np.array(train_y)
# x 为测试的点的位置
x = np.array([20, 2])
# 计算出测试点到各个点之间的距离并输出,用math开平方根
distances = []
for x_train in trainx:
d = math.sqrt(np.sum((x_train - x)**2))
distances.append(d)
print(distances)
distances.sort()
# 将存放距离的列表进行排序, 这里用numpy下的argsort进行排序。返回下标
argsort = np.argsort(distances)
print(argsort)
# 定义k的值
k = 5
topK_y = [trainy[i] for i in argsort[:k]]
# Counter用来计数
from collections import Counter
# Counter是对topK_y中的0, 1进行计数,返回的是 字典
votes = Counter(topK_y)
# 将字典中最多的这一组取出并取出它所属类
x_lei = votes.most_common(1)[0][0]
print(x_lei)
总结:,本次knn算法是一个二分类问题,根据购买商品种类不同来区分男性和女性。导入了两个包,numpy和math,起名为np,math,首先定义了训练集数据和结果集数据,随后将测试集和结果集数据传入numpy中的array数组中,然后定义一个测试点数据,计算他和训练集中所有点的距离,并且按照距离的远近进行排序,可选择邻居个数来确定测试点属于哪一类,本次选用5近邻,然后将离测试点最近的5个点进行统计,将记数最多的一类记为测试点的类别,即0或者1,具体的记数函数为counter,最后打印类别。
算法设计(两点之间的距离公式):欧氏距离公式,sqrt((x-x0)2-(y-y0)2)。
排序算法:按照距离远近进行排序。
决策:测试点所属类别由最近k近邻决定