初识KNN


KNN算法是《机器学习实践》这本书介绍的第一个分类算法,可见其地位非凡。虽然随着入行资历增长,可能会越来越看轻它,但这就是历练的必经之路,要想过此路,先得跨过它。

KNN(K-NearestNeighbor),邻近算法。说白了就是近朱者赤近墨者黑的分类思想,白的附近算白帮,黑的附近算黑派。你跟谁走的比较近,你们多半是一类人。这就是算法核心思想的通俗理解。

鱼找鱼虾找虾乌龟找王八,好的吧,算你赢。

就是用鱼找鱼,虾找虾的样本构建一个分类模型,模型建立好了后,输入乌龟,帮你找到自己的圈儿——王八。

KNN的工作原理专业解说:存在一个样本数据集合,也叫训练样本集,并且样本集合中每个数据都有自己的标签,即我们知道样本集中每一条记录与所属分类关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。

KNN实操


教科书的样板代码如下,帮你敲好了~

import operator

import numpy as np

import matplotlib.pyplot as pp

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

group,labels = createDataSet()

# k-近邻算法

def classify0(inX, dataSet, labels, k):

dataSetSize = dataSet.shape[0]

diffMat = tile(inX, (dataSetSize,1)) - dataSet

sqDiffMat = diffMat ** 2

sqDistances = sqDiffMat.sum(axis=1)

distances = sqDistances ** 0.5

sortedDistIndicies = distances.argsort()

classCount = {}

for i in range(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]

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

我也根据自己输入样本的数据结构,改写一下算法~

import operator

import pandas as pd

import numpy as np

LearnSample = pd.read_excel('LearnSample.xlsx')

def KNNClassify(LearnSample, InX, k):

DistResult = pd.DataFrame({}, index=[0])

count = 0

for index, value in LearnSample['category'].items():

diff = (np.array(LearnSample.loc[index,['x1','x2']]) - np.array(InX)) ** 2

dist = diff.sum(axis = 0) ** 0.5

new = pd.DataFrame({'distance': dist, 'category':value}, index=[count])

count += 1

DistResult = DistResult.append(new, ignore_index=True)

DistResult = DistResult.sort_values('distance', ascending=True).head(k)

category = DistResult['category'].value_counts().index[0]

return category

KNNClassify(LearnSample=LearnSample,InX=[0,0], k=3)

顺利帮着乌龟找到王八


输入样本的一部分是这样:

待分类的数据长这样:

对每一个待分类的记录,调用KNN算法函数,结果写入到Dataframe中,完成。

for index, value in result['x1'].items():

result['拟分类'][index] = KNNClassify(LearnSample, [value,result['x2'][index]], 3)

result.head()

结果如下所示:

优缺点分析


优点

1.易于理解、实现,无需估计参数,无需训练;

2.适合多分类问题,KNN比SVM表现要好。

缺点

1.计算量大,每一个待分类的记录都要计算其与每个已知的样本的距离

2.受到学习样本中每个分类的样本容量影响较大。

欢迎长按下方图片,识别途中二维码,关注“数据分析师手记”~~

鱼找鱼阿虾找虾,KNN算法帮着乌龟找王八相关推荐

  1. KNN算法——kd-tree、KNN莺尾花分类sklearn实现实例

    KNN算法--kd-tree.KNN莺尾花分类sklearn实现实例 KNN算法--kd-tree.KNN莺尾花分类sklearn实现实例 1.kd-tree 2.kd-tree的构建 3.kd-tr ...

  2. JavaScript实现找出买卖股票的最大利润算法(附完整源码)

    JavaScript实现找出买卖股票的最大利润算法(附完整源码) dpBestTimeToBuySellStocks.js完整源代码 dpBestTimeToBuySellStocks.test.js ...

  3. JavaScript实现找出一个数的质因数primeFactors算法(附完整源码)

    JavaScript实现找出一个数的质因数primeFactors算法(附完整源码) primeFactors.js完整源代码 primeFactors.js完整源代码 export function ...

  4. 找不到redis得pid文件_电脑提示Windows找不到文件?试试这两个技巧,轻松解决!...

    如果在电脑开机时,弹出了有关"windows找不到文件"的提示窗口,但运行基本正常,这有可能是某程序卸载以后,注册表中残留有信息. 或者是电脑杀毒过程当中,杀毒软件将此文件作为病毒 ...

  5. ubuntu中make头文件找不到_和平精英:游戏中找不到人怎么办?这些技巧帮你练出“火眼金睛”...

    大家好,欢迎来到<刺激实战教室>,我是你们的老朋友刺激哥.俗话说,电子竞技不需要视力,而这句话也是<和平精英>的一个"痛点".在<和平精英>这款 ...

  6. 找出第i个小元素(算法导论第三版9.2-4题)

    找出第i个小元素(算法导论第三版9.2-4题) 期望时间复杂度:Θ(n) 最坏情况的时间复杂度Θ(n^2) int randomized_select_based_loop(int *array,in ...

  7. SRA 练习:解释 CRUD 矩阵方法,并从上面 “用于化学品跟踪管理系统的 CRUDL 矩阵示例”图中找出被遗漏的需求,并解释是如何找的?

    文章目录 一.练习题目 二.CRUD 矩阵介绍 三.矩阵分析 四.寻找遗漏需求 一.练习题目 解释 CRUD 矩阵方法,并从上面 "用于化学品跟踪管理系统的 CRUDL 矩阵示例" ...

  8. linux 开机 找不到 文件系统 下载文件系统就好了,开机启动找不到文件系统的修复步骤...

    问题描述,电脑开机后出现错误,找不到文件系统,如上图:一般是grub找不到引导文件,只需要让他找到引导文件就好了.步骤如下 1.输入  命令"set",  查看grub指向哪个盘, ...

  9. System.Security.Cryptography.RSA.FromXmlString 系统找不到指定的文件和X509读取证书文件系统找不到指定的文件异常

    System.Security.Cryptography.RSA.FromXmlString 系统找不到指定的文件和X509读取证书文件系统找不到指定的文件异常 参考文章: (1)System.Sec ...

最新文章

  1. iOS:切换视图的第三种方式:UITabBarController标签栏控制器
  2. LeetCode Reverse Linked List II 反置链表2
  3. 用Docker构建LNMP环境(上)
  4. OpenCV学习笔记(一):Win10(x64)+Qt5.8(MSVC2013)+OpenCV3.1.0配置过程
  5. java web远程调试工具_java远程调试 - Dendy的个人页面 - OSCHINA - 中文开源技术交流社区...
  6. dynamic的一些使用心得
  7. python爬取小说网站资源_利用python的requests和BeautifulSoup库爬取小说网站内容
  8. 维护项目的管理策略案例
  9. 机器学习:更多的数据总是优于更好的算法吗?
  10. WINCE 中常见的问题收集
  11. 可以发送html文本的python脚本
  12. mysql架构 三级主从同步_MySQL 主从同步架构中你不知道的“坑”(完结篇)
  13. Ubuntu Emacs Fcitx 中文输入法设置
  14. 【收藏向】模拟电子技术超强知识点总结 20小时不挂科
  15. 职场中警惕七种危险的同事
  16. 常用坐标系汇总(更新)
  17. pytho运算符练习
  18. python plc fx5u_三菱PLC FX3U和FX5U有什么区别
  19. PTA 6-2 根据派生类写出基类(Java)
  20. 保险咨询小程序开发,给你我多一分安心

热门文章

  1. ISP-BLC(Black Level Correction)
  2. 2022电大国家开放大学网上形考任务-数学思想与方法非免费(非答案)
  3. redis应用场景及实例
  4. pyqt中label标签填充背景色
  5. 财报解读 | 借HMO走向规模化落地,平安健康用什么撬动行业价值
  6. 将一台及多台服务器操作日志发送至中央日志服务器
  7. 蒲公英串口服务器接显示器,蒲公英虚拟串口功能使用帮助
  8. 计算机网络课程设计聊天,计算机网络课程设计-简单聊天程序.doc
  9. 晚上看了轮子哥的知乎想法,我失眠了
  10. pandasnumpy 数据处理~~两万字超全