K 值 近邻算法
某样本在特征空间中如果有一个与其最相似的样本属于某个类别,那么这个样本也是属于这个类别
比如距离:
p
=
(
x
1
−
x
2
)
2
+
(
y
1
−
y
2
)
2
p = \sqrt {(x_1 - x_2)^2 + (y_1 - y_2)^2}
p=(x1−x2)2+(y1−y2)2
当然我们数据之间可以没有距离这种差别, 比如电影的类别,员工的分类都是可以使用该公式的
案例分析
太糟糕了 ! 斯卡蒂突然找到博士,说自己是忘记了自己一起在深海猎人时候的伙伴 ! 幸好我们有数据来帮忙,快帮忙找找吧!
名字 对猫的好感 对狗的好感 喜欢运动的程度
0 斯卡蒂 70 92 100
1 幽灵鲨 80 79 80
2 凯尔希 100 82 0
3 阿米娅 100 100 100
代码:
import pandas as pd
finder = 0 # 斯卡蒂在数据的第0行
df = pd.read_excel('./我要贴贴.xlsx') # 读取文件
df['评分'] = (
(
(df['对猫的好感'][0] - df['对猫的好感']) ** 2 +
(df['对狗的好感'][0] - df['对狗的好感']) ** 2 +
(df['喜欢运动的程度'][0] - df['喜欢运动的程度']) ** 2
) ** .5
) # 对斯卡蒂的距离做评分
print(df)
这是结果
名字 对猫的好感 对狗的好感 喜欢运动的程度 评分
0 斯卡蒂 70 92 100 0.000000
1 幽灵鲨 80 79 80 25.865034
2 凯尔希 100 82 0 104.880885
3 阿米娅 100 100 100 31.048349
除了自己 斯卡蒂大概的伙伴就是离他最相似的幽灵鲨吧~ 事实上确实如此
(话说斯卡蒂甚至92点喜欢我~)
案例二
又是健忘的斯卡蒂找到博士,说忘记自己是干什么的了,这可真是下头,但是我们还是可以进行操作
名字 | 法伤 | 物伤 | 防御 | 类型 |
---|---|---|---|---|
斯卡蒂 | 0 | 400 | 100 | |
幽灵鲨 | 0 | 350 | 80 | 近卫 |
凯尔希 | 0 | 200 | 0 | 医疗 |
阿米娅 | 400 | 0 | 0 | 法师 |
星熊 | 0 | 430 | 800 | 盾 |
德克萨斯 | 30 | 300 | 200 | 先锋 |
拉普兰德 | 0 | 380 | 90 | 近卫 |
闪灵 | 0 | 320 | 0 | 医疗 |
霞光 | 0 | 130 | 400 | 盾 |
捣蛋鬼 | 0 | 390 | 90 | 辅助 |
还是这么操作:
"""
需求:
"""
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
finder = 0 # 斯卡蒂在数据的第0行
df = pd.read_excel('./干员表.xlsx') # 读取文件
df['评分'] = (
(
(df['法伤'][0] - df['法伤']) ** 2 +
(df['物伤'][0] - df['物伤']) ** 2 +
(df['防御'][0] - df['防御']) ** 2
) ** .5
) # 对斯卡蒂的距离做评分
print(df)
名字 法伤 物伤 防御 类型 评分
0 斯卡蒂 0 400 100 NaN 0.000000
1 幽灵鲨 0 350 80 近卫 53.851648
2 凯尔希 0 200 0 医疗 223.606798
3 阿米娅 400 0 0 法师 574.456265
4 星熊 0 430 800 盾 700.642562
5 德克萨斯 30 300 200 先锋 144.568323
6 拉普兰德 0 380 90 近卫 22.360680
7 闪灵 0 320 0 医疗 128.062485
8 霞光 0 130 400 盾 403.608721
9 捣蛋鬼 0 390 90 辅助 14.142136
emm 斯卡蒂和捣蛋鬼最近 那他就是辅助吧!
是吗? 不是!
我们可以看见如果吧捣蛋鬼拿开我们可以看见两个近卫角色都紧挨着斯卡蒂很明显斯卡蒂是个近卫嘛!
所以我们不能单独看一个挨着样本的相似样本而是找一个组,通过组内,这个组有X人不等(X最好是奇数方便我们投票选择) 这个X就是我们的K值 所以才叫K值近邻算法嘛。
Sklearn 的使用
白咕咕说博士真是个笨蛋(实际上也是的), 明明可以使用 sklearn 非要那么麻烦
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier # sklearn.neighbors是相邻算法之一
finder = 0 # 斯卡蒂在数据的第0行
df: pd.DataFrame = pd.read_excel('./干员表.xlsx') # 读取文件
X_TZ, X_GROUP = df.iloc[1:, 1:4], df.iloc[1:, 4]
"""
X_TZ 放置着数据的特征值 如法伤物伤防御 记住不要把斯卡蒂的数据放进去了 他是需要进行预测而不是训练的的!
X_GROUP 这些特征值可以得到的结果是什么 他的数据个数需要和X_TZ相似
但是形状可以不同
"""
model = KNeighborsClassifier(n_neighbors=3) # n_neighbors就是我们所说的 K值
model.fit(X_TZ, X_GROUP) # 把数据交给模型吧
ret = model.predict(df.iloc[:1, 1:4]) # 把斯卡蒂带进去看看?
print(ret)
# ['近卫']
这样的数据确实舒服了
总结
我们做个总结
- 什么是K值邻近算法(一个分类算法)
- K值近邻算法的原理(欧式距离公式)
- sklearn实现K值近邻算法
- 取多个样本的好处:避免异常的问题出现导致(数值相似但是不是同一类型样本的出现)我们的模型Bug