KNN 流程图如下
完整代码
from numpy import *
import matplotlib.pyplot as plt
# 故事背景
# 游客 吃冰淇淋数目 喝水数目 互动时长 天热感觉
# 张三 8 4 2 非常热
# 李四 7 1 1 非常热
# 王五 1 4 4 一般热
# 刘六 3 0 5 一般热
# 陈七 2 4 4 ?
# 分别求 陈七 和 其他人的距离,分别是 6.3、6.5、1.0、4.2
# 进行排序获得索引,分别是 2、3、0、1。分别对应 王五、刘六、张三、李四
# 2、3、0、1 对应的标签分别是 一般热、一般热、非常热、非常热
# 取前k条数据,这里k=3,进行分类统计数据,得到 {'一般热': 2, '非常热': 1}
# 根据数量倒序排序后,得到 [('一般热', 2), ('非常热', 1)]
# 取结果的[0][0],即 “一般热” 是陈七的天热感觉预测值
# 总而言之,就是求陈七的点到其他数据点的距离,然后取前k个数据进行统计数量,获取数量最多的标签名,就是陈七的预测值
# 创建数据源,返回数据集和类标签
def create_dateset():
datesets = array([[8, 4, 2],
[7, 1, 1],
[1, 4, 4],
[3, 0, 5]]) # 数据集,4个样本
labels = ['非常热', '非常热', '一般热', '一般热'] # 类标签
return datesets, labels
plt.rcParams['font.sans-serif'] = 'SimHei'
def analyze_data_plot(x, y):
fig = plt.figure()
# 将画布划分为1行1列1块
ax = fig.add_subplot(111) # 1行1列第1块
ax.scatter(x, y)
# 设置散点图标题和横纵坐标
plt.title('游客冷热感知点散点图')
plt.xlabel('天热吃冰淇淋数目')
plt.ylabel('天热喝水数目')
# 保存截图
plt.savefig('data_plot.png')
plt.show()
# 计算两点之间的欧氏距离3
def compute_euclidean_distance(newV, datasets):
rowsize, colsize = datasets.shape # 获取数据集的行数和列数
diffMat = tile(newV, (rowsize, 1)) - datasets # 将newV重复4次,生成一个4行1列的矩阵,然后减去数据集
sqDiffMat = diffMat ** 2 # 对矩阵中的每个元素进行平方
result = sqDiffMat.sum(axis=1) ** 0.5 # 对矩阵中的每一行进行求和,然后开方。axis=1表示按行求和
return result
# KNN分类器, 作用是对新数据进行分类
def knn_classifier(newV, datasets, labels, k):
import operator
# 1 计算newV与datasets中每个点的距离
SqrtDist = compute_euclidean_distance(newV, datasets)
# 2 根据距离排序,获取索引
sortedDistIndexs = SqrtDist.argsort(axis=0) # 对距离进行排序,返回排序后的索引值。axis=0表示按列向量排序
# 3 针对k个点,统计各个类别数量
classCount = {}
for i in range(k):
votelabel = labels[sortedDistIndexs[i]] # 获取排序后的索引值对应的类标签
classCount[votelabel] = classCount.get(votelabel, 0) + 1 # 统计各个类标签的数量
# 4 投票机制,少数服从多数原则,输入类别
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1),
reverse=True) # 对classCount字典进行排序, itemgetter(1) 表示按照第二个元素进行排序. reverse=True表示降序
# print(newV, 'KNN投票预测结果是:', sortedClassCount[0][0])
return sortedClassCount[0][0]
def predict_temperature():
# 1. 创建数据集和类标签
datesets, labels = create_dateset()
# 2. 采访新访客
# newV = [2, 4, 4]
# newV = [8, 8, 1]
x1 = float(input('请输入吃冰淇淋个数:'))
x2 = float(input('请输入喝水杯数:'))
x3 = float(input('请输入户外活动小时数:'))
newV = [x1, x2, x3]
res = knn_classifier(newV, datesets, labels, 3) # k=3表示取最近的3个点
print('预测结果:', res)
if __name__ == '__main__':
# 预测
predict_temperature()
代码参考:https://www.imooc.com/learn/1069
流程图来自:https://blog.csdn.net/m0_74405427/article/details/133714384
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏