机器学习-K近邻算法

目录

一、K-近邻算法概述

二、实施KNN分类算法


一、K-近邻算法概述

1.K-近邻算法的概念:

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

2.K-近邻算法的优缺点及适用范围:

 优点:数学基础低、精度高、对异常值不敏感、无数据输入假定。

 缺点:计算复杂度高、空间复杂度高。

 适用数据范围:数值型和标称型。

3.K-近邻算法中K值的选择:

 若K值过大:预测标签较稳定,但可能过平滑。

 若K值过小:预测标签容易受样本异常点影响。

4.K-近邻算法的一般流程:

(1)收集数据

(2)准备数据:将数据结构化

(3)分析数据

(4)测试算法:计算错误率

(5)使用算法:输入样本数据和结构化的输出成果,然后使用K-近邻算法判定输入的样本数据属于哪个类别,最后得出结果。

二、实施KNN分类算法

1.伪代码如下:

对于未知类别的数据集中的每个点,依次执行以下操作:

(1)计算获取已知数据集中的点与当前点的距离并保存;

(2)按照一定的大小顺序对获取到的距离数据排序;

(3)选取k值,即选取与当前点距离最小的k个点;

(4)确定k个点所在类别的出现的频率;

(5)返回k个点中出现频率最高的类别以此作为当前点的预测分类。

2.准备数据:

jmdx建筑物数据集

数据来源:百度查找以及大致估算(与实际相比并不是非常准确的数据)

3.KNN算法的距离计算:

使用欧氏距离公式,以二维平面为例,计算两个向量点x和y之间的距离:

        d = sqrt((x1-x2)^2+(y1-y2)^2)  

三维空间:d=sqrt(x1-x2)^2+(y1-y2)^2+(z1-z2)^2)

n维空间:d=sqrt( ∑(xi1-xi2)^2 ) 这里i=1,2..n。

4.KNN算法的实现:

(1)输入数据集

import math

building_data = {"01": [80.56, 9.38, 35.00, "宿舍楼"],
                 "02": [82.52, 9.63, 36.10, "宿舍楼"],
                 "03": [82.42, 9.01, 35.10, "宿舍楼"],
                 "04": [84.23, 9.12, 36.80, "宿舍楼"],
                 "05": [88.66, 9.38, 38.00, "宿舍楼"],
                 "06": [25.55, 43.22, 31.10, "教学楼"],
                 "07": [25.23, 43.10, 30.10, "教学楼"],
                 "08": [25.44, 44.12, 31.80, "教学楼"],
                 "09": [24.54, 43.38, 32.00, "教学楼"],
                 "10": [25.55, 41.63, 30.10, "教学楼"],
                 "11": [24.55, 43.01, 31.10, "教学楼"],
                 "12": [70.55, 30.42, 22.34, "餐厅"],
                 "13": [62.58, 31.44, 26.34, "餐厅"],
                 "14": [64.54, 34.41, 25.45, "餐厅"],
                 "15": [63.55, 24.54, 25.30, "餐厅"]}

(2)设置测试样本

# 测试样本  test1: [23, 33, 25, "?"]
A = [64, 55, 25]

(3)设置KNN算法计算距离公式并将结果引入数组中存储

# 获取测试样本与数据集中所有数据的距离:
KNN = []
for key, B in building_data.items():
    d = math.sqrt((A[0] - B[0]) ** 2 + (A[1] - B[1]) ** 2 + (A[2] - B[2]) ** 2)
    KNN.append([key, round(d, 2)]) #保留2位小数

(4)将距离数组排序并选取k值

#按照距离从小到大进行排序
KNN.sort(key=lambda dis: dis[1])
print(KNN,'\n')

#选取距离最小的k个样本,这里设k值为4;
k = 5
KNN=KNN[:k]

(5)设置各类别数据,对k个最近的数据集进行匹配,并输出出现频率最高的类别

#设置各类别数据,对k个最近的数据集进行匹配,并输出出现频率最高的类别
labels = {"宿舍楼":0,"教学楼":0,"餐厅":0}
for s in KNN:
    label = building_data[s[0]]
    labels[label[3]] += 1
labels =sorted(labels.items(),key=lambda l: l[1],reverse=True)
print(labels,labels[0][0],sep='\n')

(6)运行结果为

5.实验总结:

        通过KNN算法,可以解决基本的分类问题。而在运用该算法时要注意k值的选取。

6.参考教材:

机器学习实战

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值