KNN分类算法原理与Python+sklearn实现根据身高和体重对体型分类

KNN算法是k-Nearest Neighbor Classification的简称,也就是k近邻分类算法。基本思路是在特征空间中查找k个最相似或者距离最近的样本,然后根据k个最相似的样本对未知样本进行分类。基本步骤为:

(1)计算已知样本空间中所有点与未知样本的距离;

(2)对所有距离按升序排列;

(3)确定并选取与未知样本距离最小的k个样本或点;

(4)统计选取的k个点所属类别的出现频率;

(5)把出现频率最高的类别作为预测结果,即未知样本所属类别。

下面的代码模拟了上面的算法思路和步骤,以身高+体重对肥胖程度进行分类为例,采用欧几里得距离。

from collections import Counter import numpy as np

# 已知样本数据 # 每行数据分别为性别,身高,体重 knownData = ((1, 180, 85), (1, 180, 86), (1, 180, 90), (1, 180, 100), (1, 185, 120), (1, 175, 80), (1, 175, 60), (1, 170, 60),

(1, 175, 90), (1, 175, 100), (1, 185, 90), (1, 185, 80))

knownTarget = ('稍胖', '稍胖', '稍胖', '过胖', '太胖', '正常', '偏瘦', '正常', '过胖', '太胖', '正常', '偏瘦')

def KNNPredict(current, knownData=knownData, knownTarget=knownTarget, k=3): # current为未知样本,格式为(性别,身高,体重) data = dict(zip(knownData, knownTarget)) # 如果未知样本与某个已知样本精确匹配,直接返回结果 if current in data.keys(): return data[current] # 按性别过滤,只考虑current性别一样的样本数据 g = lambda item:item[0][0]==current[0] samples = list(filter(g, data.items())) g = lambda item:((item[0][1]-current[1])**2+\ (item[0][2]-current[2])**2)**0.5 distances = sorted(samples, key=g) # 选取距离最小的前k个 distances = (item[1] for item in distances[:k]) # 计算选取的k个样本所属类别的出现频率 # 选择频率最高的类别作为结果 return Counter(distances).most_common(1)[0][0]

unKnownData = [(1, 180, 70), (1, 160, 90), (1, 170, 85)] for current in unKnownData: print(current, ':', KNNPredict(current))

运行结果为:

(1, 180, 70) : 偏瘦 (1, 160, 90) : 过胖 (1, 170, 85) : 正常

下面的代码使用扩展库sklearn中的k近邻分类算法处理了同样的问题:

# 使用sklearn库的k近邻分类模型 from sklearn.neighbors import KNeighborsClassifier

# 创建并训练模型 clf = KNeighborsClassifier(n_neighbors=3, weights='distance') clf.fit(knownData, knownTarget)

# 分类 for current in unKnownData: print(current, end=' : ') current = np.array(current).reshape(1,-1) print(clf.predict(current)[0])

运行结果为:

(1, 180, 70) : 偏瘦 (1, 160, 90) : 过胖 (1, 170, 85) : 正常

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2017-10-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏生信小驿站

使用R语言进行机器学习特征选择①

特征选择是实用机器学习的重要一步,一般数据集都带有太多的特征用于模型构建,如何找出有用特征是值得关注的内容。

43740
来自专栏程序生活

机器学习(四)通过递归的矩阵向量空间预测组合语义摘要简介方法结果结论

Semantic Compositionality Through Recursive Matrix-Vector Spaces 摘要 单字矢量空间模型已经在学...

35870
来自专栏数据科学学习手札

(数据科学学习手札29)KNN分类的原理详解&Python与R实现

  KNN(k-nearst neighbors,KNN)作为机器学习算法中的一种非常基本的算法,也正是因为其原理简单,被广泛应用于电影/音乐推荐等方面,即有些...

534130
来自专栏生信小驿站

机器学习预测乳腺癌良恶性(1)(逻辑回归)

逻辑回归算法思想:逻辑回归(LogisticRegression)是当前机器学习算法比较常用的方法,可以用来回归分析,也可以用来分类,主要是二分类问题。逻辑回归...

22730
来自专栏应兆康的专栏

Python 机器学习库 --- sklearn --- 线性模型

额,这里不支持latex语法。就截图了。。。

42640
来自专栏JasonhavenDai

统计学习方法之K近邻法1.k近邻法(k-nearest neighbor,k-NN)2.k近邻模型3.k近邻算法的实现

1.k近邻法(k-nearest neighbor,k-NN) k近邻算法是一个基本分类和回归方法,k-NN的输入时实例的特征向量,对应于特征空间的点,输出是...

33950
来自专栏贾志刚-OpenCV学堂

图像二值化-局部阈值方法汇总

概述: 在图像处理中二值图像处理与分析是图像处理的重要分支,图像二值分割尤为重要,有时候基于全局阈值自动分割的方法并不能准确的将背景和对象二值化,这个时候就需要...

1.1K100
来自专栏深度学习与计算机视觉

理解图像卷积操作的意义

在图像处理领域,我们经常能听到滤波,卷积之类的词,其实他们都可以看做一种图像的卷积操作,相对应的卷积核,卷积模板,滤波器,滤波模板,扫描窗其实也都是同一个东西。...

73460
来自专栏SnailTyan

ResNet论文翻译——中英文对照

Deep Residual Learning for Image Recognition Abstract Deeper neural networks are...

28780
来自专栏机器学习算法工程师

数据挖掘中的数据清洗方法大全

作者:章华燕 编辑:黄俊嘉 在数据挖掘领域,经常会遇到的情况是挖掘出来的特征数据存在各种异常情况,如数据缺失 、数据值异常 等。对于这些情况,如果不加以处理,那...

39150

扫码关注云+社区

领取腾讯云代金券