Machine Learning:k近邻算法(KNN)

2023-05-16

目录

  • 写在前面的话
  • k-近邻算法概述
      • 优点
      • 缺点
      • 适用数据范围
  • 原理
  • Python代码实现
  • Sklearn直接调用
      • weights选项
      • algorithm选项
  • 算法测试与结果评价
      • 原理及方法
      • 函数主要参数说明
      • Python代码实现
  • 示例
  • 反思与总结

写在前面的话

大概是上半年准备美赛的时候,才发现仅仅具备C语言的知识,如果想对数据进行分析和挖掘,实在太过简陋,并且当时对相关算法了解甚少。这个学期有幸选了黄教授的数据科学概论一课,他曾经在课上向我们推荐了《机器学习实战》一书。这段时间抽空读了一下,感觉受益颇深,正巧赶完了期末大作业,便把学到的算法以专栏的形式整理出来。一方面便于自己复习巩固,另一方面书中的Python代码并非最新版本,许多参数已经删改,博主也趁此机会完善一下代码,并且给予充足的注释,以飨读者。

k-近邻算法概述

k-近邻算法本质上是一种分类算法,主要采用测量不同特征值之间距离的方法实现

优点

精度高、对异常值不敏感、无数据输入假定

缺点

计算复杂度高、空间复杂度高

适用数据范围

数值型、标称型

原理

(1)计算输入数据与样本集中数据的距离
(2)对距离进行排序
(3)选出前k个最相似的数据(距离最短)
(4)将这些数据中类别出现次数最多的类别作为新数据的分类

Python代码实现

我们以二维数据为例

import numpy as np
import operator
def createDataSet():   #生成数据集的函数
    group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])   #数值坐标
    labels = ['A','A','B','B']   #类别
    return group, labels
def title(inY, Size):   #对输入数据进行预处理的函数
    x = Size[0]   #数据个数
    y = Size[1]   #数据维数
    result = np.zeros((x, y))
    for i in range(x):
        result[[i],:] = inY   #利用逐层替换的方式生成初始化数据,这一矩阵由输入数据重复x遍构成
    return result
def classify0(inX, dataSet, labels, k):   #分类器函数
    dataSetxSize = dataSet.shape[0]
    dataSetySize = dataSet.shape[1]
    diffMat = title(inX, (dataSetxSize, dataSetySize)) - dataSet   #开始计算欧氏距离
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()   #排序
    classCount={}
    for i in range(k):   #获取前k个数据的类别
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]
group,labels = createDataSet()

classify0([0,0], group, labels, 3)   #测试语句

Sklearn直接调用

当然,强大的Python自带KNN算法包,下面简述一下几个重要参数的意义

def KNeighborsClassifier(n_neighbors,    #k值
                       weights,          #权重
                       algorithm,        #用于实现KNN的算法
                       leaf_size,        #停止建子树的叶子节点数量,默认30
                       p,                #当metric参数设置为“minkowski”时,p=1为曼哈顿距离,p=2为欧式距离,默认p=2
                       metric)           #距离度量方法

此外有两个参数有具体选项

weights选项

uniformdistance自定义函数
不加权权重和距离成反比

algorithm选项

brutekd_treeball_treeauto
暴力实现KD树实现KD球树实现默认参数,自动选择合适的方法
import numpy as np
import operator
from sklearn.neighbors import KNeighborsClassifier
def createDataSet():
    group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group, labels
def classify0(inX, dataSet, labels, k):
    inX = np.array(inX).reshape(-1,2)   #改变输入数据格式以符合要求
    knn = KNeighborsClassifier(n_neighbors=k)   #设定k值,构建分类器
    result = knn.fit(dataSet, labels)   #拟合数据
    pre = knn.predict(inX)   #预测新数据
    return pre
group,labels = createDataSet()

print(classify0([0,0], group, labels, 3))

很明显,用自带的库实现这一算法,其代码实现更为简洁(功能、效率都更加强大)

算法测试与结果评价

这里我们采用的方法是K折交叉验证

原理及方法

(1)不重复抽样,将原始数据随机分为 k 份
(2)挑选其中一份作为测试集,剩余 k-1 份作为样本集,进行测试
(3)重复第二步 k 次
(4)计算 k 组测试结果的平均值,作为模型的性能指标

函数主要参数说明

sklearn.model_selection.cross_val_score(estimator,          #需要验证的算法
                                        X,                  #数据数值
                                        y,                  #数据类别
                                        cv)                 #交叉验证折数

Python代码实现

由于我们构建的数据集已不再适合应用这一检验,遂使用更庞大的数据集
(代码来源)

from sklearn.datasets import load_iris
from sklearn.model_selection  import cross_val_score
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier

iris = load_iris()   #Python自带数据集读取
x = iris.data
y = iris.target
k_range = range(1, 31)
k_error = []

for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, x, y, cv=6, scoring='accuracy')   #cv参数决定数据集划分比例,这里是按照5:1划分训练集和测试集
    k_error.append(1 - scores.mean())

plt.plot(k_range, k_error)
plt.xlabel('Value of K for KNN')
plt.ylabel('Error')
plt.show()

示例

以后有机会用书中实例予以补充

反思与总结

这是这个专栏的第一篇博客,写完后还是有很多感触的。
初次建模,或者说进行数据分析,一定要构建整个过程的框架,从数据的预处理、构建数据集,到模型的选择、建立、优化,再到预测与评估。
记得曾经在知乎上看到过一项挑战,大致意思是给出一张图片,根据图中信息判断拍摄者所处的位置,看视频时我情绪高涨,事后想了想,当初参与建模比赛,其实向往的是数据背后的故事。
死气沉沉的数字,总能带给我们一些现实意义,对于追寻这些意义的过程,最起码到目前为止,我认为是快乐的。
博主非统计专业,这方面不是专家,如有纰漏或需要补充的地方,烦请各位大佬在评论区指出,如您觉得写的不错,记得一键三连哟
(^U^)ノ~YO

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Machine Learning:k近邻算法(KNN) 的相关文章

随机推荐

  • java基础之线程安全问题(一)

    目录 一 xff1a 线程安全判断依据 二 xff1a 解决线程安全问题实现 同步代码块 1 格式 2 同步代码块的锁对象是谁 xff1f 3 xff1a 同步方法的时候 xff0c 锁对象又是谁呢 xff1f 4 xff1a 静态同步方法
  • java基础之线程安全问题(二)

    目录 一 xff1a Lock锁的使用 xff08 解决同步问题 xff09 二 xff1a 例子 三 xff1a 同步的特点 xff08 1 xff09 同步的前提 xff08 2 xff09 同步的好处 xff08 3 xff09 同步
  • redis基础知识

    目录 一 xff1a 概念 二 xff1a NoSQL分类 三 xff1a Redis数据模型 四 xff1a 键Key 一 xff1a 概念 开源的 xff08 BSD协议 xff09 xff0c 使用ANSI C 编写 xff0c 基于
  • Hive建表以及导入数据

    目录 一 xff1a 内部表和外部表 1 xff1a 外部表 2 xff1a 外部表 3 xff1a 外部表和内部表区别 二 xff1a 上传数据方式 一 xff1a 内部表和外部表 1 xff1a 外部表 内部表基础建表语句一 默认指定文
  • Hive行列互转

    目录 一 xff1a 行转列 1 xff1a lateral view 行转列 2 xff1a explode函数 3 xff1a 例子 二 xff1a 列转行 1 概念 2 xff1a 例子 一 xff1a 行转列 1 xff1a lat
  • Hive行转列的应用之计算公司累加收入

    公司代码 年度 1月 12月的收入金额 burk year tsl01 tsl02 tsl03 tsl04 tsl05 tsl06 tsl07 tsl08 tsl09 tsl10 tsl11 tsl12 853101 2010 100200
  • Hive的常用函数

    目录 1 关系运算 2 数值计算 3 条件函数 4 日期函数 5 xff1a 字符串函数 6 xff1a Hive 中的wordCount 1 关系运算 等值比较 61 61 61 lt 61 gt 不等值比较 61 lt gt 区间比较
  • IDEA配置spring环境,并简单测试

    目录 一 下载安装需要的依赖包 二 IDEA的部署 一 下载安装需要的依赖包 首先 xff0c 我们需要下载一点jar包 第一个jar包是第三方依赖的jar包 xff0c Spring的核心容器依赖commons logging的JAR包
  • Unity导出工作台(Console)数据

    首先在Unity中添加C 脚本 xff1a using System Collections using System Collections Generic using UnityEngine using UnityEditor usin
  • Unity利用代码生成空心立方体(立方体挖走一个圆柱)

    先看效果 还未生成mesh时挖去圆柱的立方体 生成mesh后挖去圆柱的立方体 放代码为敬 xff08 脚本挂在空物体上即可 xff09 xff1a using System Collections using System Collecti
  • 企业ERP系统开发总结及建议

    企业ERP系统开发总结及建议 作者 xff1a 成晓旭 对于像我们这种规模的大型公司 xff0c 自己建设 实施和维护满足公司特定管理要求的管理信息系统 xff0c 是目前部分大型公司建设企业ERP 的常见思路 比如 xff1a XXXX
  • Unity 3D导入txt文本文件坐标并打印

    先看打印结果 xff1a 首先我们创建一个txt文件 xff0c 将坐标输入或复制进去 xff0c 从左到右依次为x y z xff0c 中间用逗号 xff08 英文逗号 xff09 隔开 在Unity工程文件下的Assets文件夹下创建R
  • 2022研究生数学建模竞赛(华为杯)B题

    题目 xff1a 方形件组批优化问题 一 背景介绍 智能制造被 中国制造 2025 列为主攻方向 而个性化定制 更短的产品及系统生命周期 互联互通的服务模式等成为目前企业在智能制造转型中的主要竞争点 以离散行业中的产品为例 xff0c 如电
  • 2022研究生数学建模B题思路

    子问题1 xff1a 排样优化问题 要求建立混合整数规划模型 xff0c 在满足生产订单需求和相关约束条件下 xff0c 尽可能减少板材用量 约束 1 在相同栈 stack xff09 里的产品项 item xff09 的宽度 xff08
  • 找到并标记Mesh顶点

    1 在Unity 3D中新建一个物体 本文以Cube为例 2 创建一个C 脚本 命名为MeshTest 3 在脚本中写入程序 在打开的脚本 MeshTest 上编写代码 xff0c 首先获取 MeshFilter 组件 xff0c 然后获取
  • TCP服务器端、客户端通讯(赋源码)

    实现通讯 xff0c 我们首先要知道是怎么样的一个流程 xff0c 下图是我画的一个通讯流程图 xff1a 一 Linux服务器端 我是在Ubuntu20 04下进行的 xff0c 使用的是C 43 43 xff0c 引入头文件socket
  • win11 命令 wmic:无效的指令 解决办法

    我想你肯定看到过让你修改环境变量的方法 但是 xff0c 如果你的电脑就根本没有装wmic xff0c 再怎么修改环境变量也是徒劳 我们打开设置 xff1a Win 43 I 点击应用 选择 可选功能 添加可选功能 搜索wmic xff0c
  • Python面向对象编程:关于类的方法中属性是否加前缀self的问题

    问题的缘起 今天完成了LeetCode首秀 xff08 而且是用刚学不久的python做的 xff09 xff0c 心情挺激动的 xff0c 毕竟之前只涉猎了竞赛OJ xff0c 没有在应用型平台上刷过题 xff0c 不妨定一个小目标 xf
  • 概念物理Ⅱ 第一讲:绪论

    目录 物理学研究的对象和动机为什么要研究物理学 xff1f 1 满足人类对大自然基本规律的好奇心2 改进技术 发展生产 两个动机之间的关系 物理学的发展历史起源于古希腊古典物理学时间 xff1a 牛顿时代 1900年经典力学 xff08 牛
  • Machine Learning:k近邻算法(KNN)

    目录 写在前面的话k 近邻算法概述优点缺点适用数据范围 原理Python代码实现Sklearn直接调用weights选项algorithm选项 算法测试与结果评价原理及方法函数主要参数说明Python代码实现 示例反思与总结 写在前面的话