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降维处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值