1,KNN是什么
KNN(k-nearest neighbor classification)K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。
该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
举例:如果张三的行为举止,言谈,家庭背景等和村里面的K个人都很相似,恰好这K个人又都是属于某种特征的人,比如说都是好人,那么我们就可以推测张三也是一个好人。
2,算法原理
2.1,通用步骤
- 计算距离(常用欧几里得距离或马氏距离或欧氏距离)
- 升序排列
- 取前K个
- 加权平均
2.2,K的选取
- K太大:导致分类模糊
- K太小:受个例影响,波动较大
2.3,如何选取K值
- 靠经验
- 均方根误差
3,实践应用
以一份医学数据为例,数据集来源:https://pan.baidu.com/s/1w8cyvknAazrAYnAXdvtozw
提取码:zxmt
代码及必要注释:
# 读取数据
with open('Prostate_Cancer.csv', 'r') as file:
reader = csv.DictReader(file)
datas = [row for row in reader]
# 随机打乱分组
random.shuffle(datas)
n = len(datas) // 3
# 取前1/3作为测试集,余下做训练集
test_set = datas[0:n]
train_set = datas[n:]
# 关键就在于K的选取,K值过大或者过小都不适合
K = 5
# 计算测试和训练数据之间的距离
def distance(d1, d2):
res = 0
for key in ('radius', 'texture', 'perimeter', 'area', 'smoothness', 'compactness', 'symmetry', 'fractal_dimension'):
res += (float(d1[key]) - float(d2[key])) ** 2
return res ** 0.5
# KNN具体实现
def knn(data):
# 1距离
res = [
{"result": train["diagnosis_result"], "distance": distance(data, train)}
for train in train_set
]
# 2排序--升序
res = sorted(res, key=lambda item: item['distance'])
# print(res)
# 3取前k个
res2 = res[0:K]
# print(res2)
# 4加权平均
result = {"B": 0, "M": 0}
# 总距离
total_distance = 0
for r in res2:
total_distance += r['distance']
for r in res2:
result[r['result']] += 1 - r['distance'] / total_distance
if result['B'] > result['M']:
return 'B'
else:
return 'M'
# 测试阶段
correct = 0
for test in test_set:
result_real = test['diagnosis_result']
result_predict = knn(test)
if result_real == result_predict:
correct += 1
print("准确率:{:.2f}%".format(100 * correct / len(test_set)))
本文内容来源:https://www.bilibili.com/video/BV1Nt411i7oD?spm_id_from=333.999.0.0
我是dyson不只是吹风机,若是对大数据-数据仓库技术感兴趣的可以加我沟通交流,一起进步。VX:daijun1211
ps:若文章侵权、触犯隐私请联系作者删除,谢谢~~