KNN算法

KNN(K-Nearest Neighbor)算法,意思是K个最近的邻居,从这个名字我们就能看 出一些KNN算法的蛛丝马迹了。K个最近邻居,毫无疑问,K的取值肯定是至关重要 的。那么最近的邻居又是怎么回事呢?其实啊,KNN的原理就是当预测一个新的 值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。

图中绿色的点就是我们要预测的那个点,假设K=3。那么KNN算法就会找到与它距离 最近的三个点(这里用圆圈把它圈起来了),看看哪种类别多一些,比如这个例子中 是蓝色三角形多一些,新来的绿色点就归类到蓝三角了

 

但是,当K=5的时候,判定就变成不一样了。这次变成红圆多一些,所以新来的绿 点被归类成红圆。从这个例子中,我们就能看得出K的取值是很重要的。 

K的取值是很重要的。

KNN实现步骤

实战 演示

import csv
import random

# 读取数据
with open(".\Prostate_Cancer.csv","r") as f:
render = csv.DictReader(f)
datas = [row for row in render]
# 分组,打乱数据
random.shuffle(datas)
n = len(datas)//3
test_data = datas[0:n]
train_data = datas[n:]
# print (train_data[0])
# print (train_data[0]["id"])
# 计算对应的距离
def distance(x, y):
res = 0
for k in
("radius","texture","perimeter","area","smoothness","compactnes
s","symmetry","fractal_dimension"):
res += (float(x[k]) - float(y[k]))**2
return res ** 0.5
# K=6
def knn(data,K):
# 1. 计算距离
res = [
{"result":train["diagnosis_result"],"distance":distance(data,tr
ain)}
for train in train_data
]
# 2. 排序
sorted(res,key=lambda x:x["distance"])
# print(res)
# 3. 取前K个
res2 = res[0:K]
# 4. 加权平均
result = {"B":0,"M":0}
# 4.1 总距离
sum = 0
for r in res2:
sum += r["distance"]
# 4.2 计算权重
for r in res2 :
result[r['result']] += 1-r["distance"]/sum
# 4.3 得出结果
if result['B'] > result['M']:
return "B"
else:
return "M"
# print(distance(train_data[0],train_data[1]))
# 预测结果和真实结果对比,计算准确率
for k in range(1,10):
correct = 0
for test in test_data:
result = test["diagnosis_result"]
result2 = knn(test,k)
if result == result2:
correct += 1
print("k="+str(k)+"时,准确率
{:.2f}%".format(100*correct/len(test_data)))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值