KNN算法(机器学习的分类算法)基本思想:
一个样本与数据集中的k个样本最相似,如果这k个样本大多数属于某一类,则该样本也属于这一类
通俗的说,即一个样本可以用离它最近的K个邻居来代表,是机器学习中最简单的分类算法
KNN算法距离计算:
使用欧氏距离计算方法,以二维平面为例,欧氏距离计算公式如下:
拓展到多维空间:
KNN算法特点:
KNN算法不需要训练数据,只需要存储大量数据并在分析样本时拿出来作对比
并且相对于有预测的回归模型,KNN不需要对数据进行任何的预测,只需要获得大量训练数据并在分析数据时拿来用就行了
相对优势:
简单,数学基础低,预测效果好,对异常值不敏感
相对劣势:
需要内存空间非常大用于存储训练数据
分析阶段需要大量时间进行对比和运算并存储
用游戏得分数据编写实例:
import math
import numpy
import operator
def createDataSet():
playerdata ={1: [633, "黄金"],
2: [426, "黄金"],
3: [315, "白银"],
4: [422, "白银"],
5: [753, "白金"],
6: [862, "钻石"],
7: [456, "白银"],
8: [675, "白金"],
9: [1358, "大师"],
10: [985, "钻石"],
11: [765, "白金"],
12: [554, "黄金"],
13: [113, "青铜"],
14: [102, "青铜"],
15: [151, "青铜"],
}
x = [233]
KNN = []
for key, v in playerdata.items():
d = math.sqrt((x[0] - v[0]) ** 2 )
KNN.append([key, round(d, 2)])
KNN.sort(key=lambda dis: dis[1])
print(KNN)
KNN = KNN[:5]
labels = {"青铜": 0, "白银": 0, "黄金": 0, "白金": 0, "钻石": 0, "大师": 0}
for s in KNN:
label = playerdata[s[0]]
labels[label[1]] += 1
labels = sorted(labels.items(), key=lambda l: l[1], reverse=True)
print(labels, labels[0][0], sep='\n')
createDataSet()
解释:
输入样本
playerdata ={1: [633, "黄金"],
2: [426, "黄金"],
3: [315, "白银"],
4: [422, "白银"],
5: [753, "白金"],
6: [862, "钻石"],
7: [456, "白银"],
8: [675, "白金"],
9: [1358, "大师"],
10: [985, "钻石"],
11: [765, "白金"],
12: [554, "黄金"],
13: [113, "青铜"],
14: [102, "青铜"],
15: [151, "青铜"],
}
设置样本
x = [233]
设置KNN算法距离计算公式并引入数组存储
KNN = []
for key, v in playerdata.items():
d = math.sqrt((x[0] - v[0]) ** 2 )
KNN.append([key, round(d, 2)])
排序经过计算之后的距离数组并选取K=5
KNN.sort(key=lambda dis: dis[1])
print(KNN)
KNN = KNN[:5]
设置各段位数据,对5个最近的数据集进行匹配,输出匹配最多次的段位
labels = {"青铜": 0, "白银": 0, "黄金": 0, "白金": 0, "钻石": 0, "大师": 0}
for s in KNN:
label = playerdata[s[0]]
labels[label[1]] += 1
labels = sorted(labels.items(), key=lambda l: l[1], reverse=True)
print(labels, labels[0][0], sep='\n')
结束
代码运行结果为
[[3, 82.0], [15, 82.0], [13, 120.0], [14, 131.0], [4, 189.0], [2, 193.0], [7, 223.0], [12, 321.0], [1, 400.0], [8, 442.0], [5, 520.0], [11, 532.0], [6, 629.0], [10, 752.0], [9, 1125.0]]
[('青铜', 3), ('白银', 2), ('黄金', 0), ('白金', 0), ('钻石', 0), ('大师', 0)]
青铜