栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

梅科尔工作室-李庆浩 深度学习-KNN算法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

梅科尔工作室-李庆浩 深度学习-KNN算法

1.KNN算法介绍

         KNN算法全称为(k-Nearest Neighbors),是一种分类算法,是最简单的一个人机器学习的算法,简单来说就是取一个新元素距离最近的K个元素,然后判断哪个类别的元素最多,就把这个新元素的类别归为元素多的那个类别,举个例子就可以明白。

                                         图1                                                                                图2

如图一所示有一个新元素正方形,当取K为3时,取离他最近的三个元素,有两个三角和1个圆圈,则就将这个新元素归为三角形的类别。结果为图2。

KNN算法的结果与K的取值有很大关系,还是以这个例子为例。

                                         图3                                                                        图4

如图3所示,当K取值为5时,距离最近的5个元素中圆圈的个数最多,为三个,所以将新元素分类为圆圈,如图4所示。

由此可知,K的取值很重要,可以改变算法的结果,一般我们对K取值是从1-10。

2.KNN算法模型建立 2.1计算距离

通过欧几里得算法计算各元素与新元素的距离,公式为

 2.2升序排列

将各元素按照与新元素的距离由小到大进行排列。

2.3选取元素

定K值,选取排列后的元素中的前K个元素。

有关K取值的问题:

K太大:导致分类模糊

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

2.4加权平均

就是计算这个K个元素中谁的比例大,谁的比例大,新元素就属于那个类别。

3.Python代码案例实现

数据集为100个癌症病人的数据,如图,只做讲解用,所以数据集量比较小。

 表中的id为病人的序列号,第二列的M/B为病人评估情况,M为良性,B表示恶性。

整个python代码如下,其他的案例算法模型也大致如此,看懂这个案例模型后,其他的案例也可自行设计更改。

#先导入两个库
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", "compactness", "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, 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"


# print(distance(train_data[0],train_data[1]))
# 预测结果和真实结果对比,计算准确率
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)))

运行结果如下所示

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1037318.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号