IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> kNN算法(k近邻算法,k Nearest Neighbor) -> 正文阅读

[数据结构与算法]kNN算法(k近邻算法,k Nearest Neighbor)

主要内容:

1.认识kNN算法

2.kNN算法原理

3.应用举例

4.kNN改进方法


1.认识knn算法

????????“看一个人怎么样,看他身边的朋友什么样就知道了”,kNN算法即寻找最近的K个数据,推测新数据的分类。

????????kNN算法可以说是最简单的分类算法之一,也是最常用的分类算法之一。

? ? ? ? 特点

? ? ? ? ? ? ? ? kNN是一种非参的,惰性的算法模型。

? ? ? ? ? ? ? ? 非参即这个模型不会对数据做出任何的假设,与之相对的是线性回归(总假设线性回归是一条直线)。也就是说kNN建立的模型结构是根据数据来决定的,比较符合现实的情况。

? ? ? ? ? ? ? ? 惰性即kNN算法不需要对数据进行大量训练,没有明确的训练数据过程,或者说这个过程很快。同样是分类算法,逻辑回归要先对数据进行大量训练,最后才会得到一个算法模型。

????????????????较其他算法更为适合:① 计算复杂性高,空间复杂性高;②样本不平衡的时候,对稀有类别的预测准确率低;③ 可解释性差,无法给出决策树那样的规则。

? ? ? ? kNN优点

? ? ? ? ? ? ? ? (1).简单易用,相比其他算法,比较简洁明了,即使没有很高的数学基础也能搞清楚原理

? ? ? ? ? ? ? ? (2).模型训练时间快(上面说到KNN算法是惰性的,这里也就不再过多讲述)

? ? ? ? ? ? ? ? (3).预测效果好

? ? ? ? ? ? ? ? (4).对异常值不敏感

? ? ? ? kNN缺点

? ? ? ? ? ? ? ? (1).对内存要求较高,因为该算法存储了所有训练数据

? ? ? ? ? ? ? ? (2).预测阶段可能很慢

? ? ? ? ? ? ? ? (3).对不相关的功能和数据规模敏感

2.kNN算法原理

????????给定一个训练数据集,对新的的输入实例,在训练数据集中找到与该实例最邻近的的K个实例,这K个实例的多数属于某个类,就把该实例分为这个类。

????????K值选择、距离度量、分类决策(一般多数表决)为k近邻算法的三个基本要素。

? ? ? ? (1).通用步骤

? ? ? ? ? ? ? ? 计算距离(常用欧几里得距离或马氏距离)

? ? ? ? ? ? ? ? 升序排列

? ? ? ? ? ? ? ? 取前K个

? ? ? ? ? ? ? ? 加权平均

????????(2).距离度量

? ? ? ? (3).K的选取

????????????????K太大:导致分类模糊
????????????????K太小:受个例影响,波动较大

????????????????如何选取K:经验、均方根误差

3.应用举例(癌症检测)

????????数据集来源:

????????????????链接:https://pan.baidu.com/s/10GrGydkzfTmlmPmxURdWqg?
????????????????提取码:19qe

????????代码:?

import csv
import random


# 读取
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  # “//”求整除

test_set = datas[0:n]
train_set = datas[n:]


'''
KNN
'''
# 距离
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  # 转换不能用int,因为数据有小数,用float;最后“**”求平方
    return res**0.5  # 开方

K = 5
def knn(data):
    # 1.距离
    res = [
        {"result": train['diagnosis_result'], "distance": distance(data, train)}
        for train in train_set
    ]
    # print(res)

    # 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}

    # 总距离
    sum = 0
    for r in res2:
        sum += r['distance']

    for r in res2:
        result[r['result']] += 1-r['distance']/sum

    if result['B']>result['M']:
        return 'B'
    else:
        return 'M'

# 测试阶段
correct = 0
for test in test_set:
    result1 = test['diagnosis_result']
    result2 = knn(test)

if result1 == result2:
    correct += 1

print("准确率:{:.2f}%".format(100*correct/len(test_set)))

?????????运行结果:

?4.kNN改进方法

????????(1).不同的K值加权;

? ? ? ? (2).距离度量据实际问题,使用不同距离;

? ? ? ? (3).特征归一化;

? ? ? ? (4).维数过大,PCA降维处理。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:27:44  更:2021-08-25 12:28:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:33:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码