KNN学习笔记

一、什么是KNN算法

k个最近邻居,原理就是当预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。

比如该图,绿色是预测的点,若K=3,KNN算法就会找到与它距离最近的三个点,看是哪个类别比较多,绿色的点就归为哪个类别。K不一样,判定就不一样。

二、KNN实现步骤

1、计算距离(欧几里得距离或马氏距离) 

2、升序排列

3、取前K个

K过大,分类模糊

K太小,受个例影响,波动大

4、加权平均

 三、实例

读取数据

# 读取数据
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:]

计算距离

# 计算对应的距离
def distance(x, y):
    res = 0
    for k in ("radius", "texture", "perimeter", "area", "smoothness", "compactness", "symmetry", "fractal_dimension"):
        res += (float(x[k]) - float(y[k])) ** 2
    return res ** 0.5

处理完数据后使用KNN算法

    # 1. 计算距离
    res = [
        {"result": train["diagnosis_result"], "distance": distance(data, train)}
        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"

计算准确率

# 预测结果和真实结果对比,计算准确率
for k in range(1, 11):
    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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值