一、概述

k-近邻算法(k-Nearest Neighbour algorithm),又称为KNN算法,是数据挖掘技术中原理最简单的算法。
KNN的工作原理:给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻近的k个实例,如果这k个实例的多数属于某个类别,那么新数据就属于这个类别。可以简单理解为:由那些离X最近的k个点来投票决定X归为哪一类。

二、利用k-近邻算法分类电影


二维图形:

扩展多个特征到N维空间(欧几里得距离公式):

K近邻算法的步骤:

(1) 计算已知类别数据集中的点与当前点之间的距离;
(2) 按照距离递增次序排序;
(3) 选取与当前点距离最小的k个点;
(4) 确定前k个点所在类别的出现频率;
(5) 返回前k个点出现频率最高的类别作为当前点的预测类别。

K近邻算法的python实现:

"""函数功能:KNN分类器参数说明:new_data : 需要分类的数据集dataSet: 训练集K: K-近邻算法的参数返回:res 分类结果
"""
import pandas as pddef classify0(new_data, dataSet, K):# 1、构建数据集movie_data = pd.DataFrame(dataSet)# 2、计算距离dist = list(((movie_data.iloc[:6, 1:3] - new_data) ** 2).sum(axis=1) ** 0.5)# 3、对距离升序排序,然后选取出距离最小的k个点dist_l = pd.DataFrame({'dist': dist,'labels': movie_data.iloc[:6, 3]})sorted_dist = dist_l.sort_values(by='dist')[:K]# 4、确定前k个点所在类别的出现频率re = sorted_dist.loc[:, 'labels'].value_counts()# 5、选择频率最高的类别作为当前点的预测类型res = []res.append(re.index[0])return  res

测试:

if __name__ == '__main__':rowdata = {'电影名称': ['无问西东', '后来的我们', '前任3', '红海行动', '唐人街探案', '战狼2'],'打斗镜头': [1, 5, 12, 108, 112, 115],'接吻镜头': [101, 89, 97, 5, 9, 8],'电影类型': ['爱情片', '爱情片', '爱情片', '动作片', '动作片', '动作片']}new_data = [24, 27]res = classify0(new_data,rowdata,4)print(res)结果:
['爱情片']

三、改进约会网站的配对效果


(1)准备数据

# 1、准备数据  默认为制表符“[Tab]”
datingTest = pd.read_table('datingTestSet.txt', header=None)print(datingTest.shape) # (1000, 4) 1000行  4列
datingTest.head(5)


(2)分析数据

# 2、分析数据
# 把不同的标签用颜色进行区分
Colors = []
for i in range(datingTest.shape[0]):m = datingTest.iloc[i, -1]if m == 'didntLike':Colors.append('black')if m == 'smallDoses':Colors.append('orange')if m == 'largeDoses':Colors.append('red')
# 绘制两两特征之间的散点图
mpp.rcParams['font.sans-serif'] = ['Simhei'] # 设置为黑体
mpp.figure('Scatter',facecolor='lightgray',figsize=(12, 8))mpp.subplot(221)
mpp.scatter(datingTest.iloc[:,1], datingTest.iloc[:,2], marker='.', c = Colors )
mpp.xlabel('玩游戏所耗时间百分比',fontsize = 12)
mpp.ylabel('每周消费的冰淇淋公升数',fontsize = 12)
mpp.grid(linestyle=':')mpp.subplot(222)
mpp.scatter(datingTest.iloc[:,0], datingTest.iloc[:,1], marker='.', c = Colors )
mpp.xlabel('每年获得的飞行常客里程数',fontsize = 12)
mpp.ylabel('玩游戏所耗时间百分比',fontsize = 12)
mpp.grid(linestyle=':')mpp.subplot(223)
mpp.scatter(datingTest.iloc[:,0], datingTest.iloc[:,2], marker='.', c = Colors )
mpp.xlabel('每年获得的飞行常客里程数',fontsize = 12)
mpp.ylabel('每周消费的冰淇淋公升数',fontsize = 12)
mpp.grid(linestyle=':')


(3)数据归一化

# 3、数据归一化
""""函数的功能:归一化参数说明:dataSet : 原始的数据集返回:0-1标准化之后的数据集
"""
def minmax(dataSet):minDf = dataSet.min()maxDf = dataSet.max()normSet = (dataSet - minDf) / (maxDf - minDf)return normSetdatingTest = pd.concat( [minmax(datingTest.iloc[:, :3]), datingTest.iloc[:, 3]], axis=1 )
print(datingTest.head(),'归一化')


(4)切分训练数据集 和 测试数据集

# 4、切分训练数据集 和  测试数据集
"""函数的功能:切分训练数据集 和  测试数据集参数说明:dataSet : 原始的数据集返回:训练数据集 和  测试数据集
"""
def randSplit(dataSet, rate = 0.9):n = dataSet.shape[0]m = int (n * rate)train = dataSet.iloc[:m, :]test = dataSet.iloc[m : , :]#重置测试数据集的索引test.index = range(test.shape[0])return train, testtrain,test = randSplit(datingTest)

(5)KNN分类器

def classify1(train, test, K):n = train.shape[1] - 1 # 训练集 除掉 标签页m = test.shape[0] # 测试集的行数res = []for i in range(m):# 2、计算距离dist = (((train.iloc[:, : n ] - test.iloc[i, : n]) ** 2).sum(1)) ** 0.5# 3、对距离升序排序,然后选取出距离最小的k个点dist_l = pd.DataFrame({'dist':dist,'labels': train.iloc[:, n]})dr = dist_l.sort_values(by= 'dist')[:K]# 4、确定前k个点所在类别的出现频率re = dr.loc[:, 'labels'].value_counts()# 5、选择频率最高的类别作为当前点的预测类型res.append(re.index[0])result = pd.Series(res)test['predict'] = resultacc = (test.iloc[:, -1] == test.iloc[:, -2] ).mean()print(f'模型的预测准确率为:{acc}')return testtest = classify1(train, test, 5)
print(test.head(),'test')mpp.show()

机器学习实战(一)KNN算法相关推荐

  1. 算法代码[置顶] 机器学习实战之KNN算法详解

    改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了     前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用 ...

  2. 【机器学习实战】KNN算法

    机器学习作为人工智能的重要分支,同时也是数据挖掘中不可或缺的算法支撑.本人接触时间不短,但研究尚浅.我计划用python来实现机器学习中较为常见的算法. 看透了自己,便无须小看别人. (老舍) 机器学 ...

  3. 【机器学习实战】KNN算法的两个经典例子(电影类型判断,约会网站的改进)

    KNN算法的两个常用实际例子 一.使用K-邻近算法来对电影的类型进行判断 1.实验思路: 2.代码实现: 3.运行截图: 4.完整代码展示: 二.在约会网站上使用KNN算法 (一)准备数据:从文本文件 ...

  4. 《机器学习实战》KNN算法实现

    本系列都是参考<机器学习实战>这本书,只对学习过程一个记录,不做详细的描述! 注释:看了一段时间Ng的机器学习视频,感觉不能光看不练,现在一边练习再一边去学习理论! KNN很早就之前就看过 ...

  5. 《机器学习实战》kNN算法及约会网站代码详解

    使用kNN算法进行分类的原理是:从训练集中选出离待分类点最近的kkk个点,在这kkk个点中所占比重最大的分类即为该点所在的分类.通常kkk不超过202020 kNN算法步骤: 计算数据集中的点与待分类 ...

  6. 《机器学习实战》kNN学习笔记

    <机器学习实战>kNN学习笔记 文章目录 <机器学习实战>kNN学习笔记 概述 优缺点 k-近邻算法的一般流程 简单案例kNN.py 在约会网站上使用k-近邻算法 归一化特征值 ...

  7. 机器学习实战——密度聚类算法

    机器学习实战--密度聚类算法 1 密度聚类 2 sklearn中的实现 1 密度聚类 密度聚类假设聚类结构能够通过样本分布的密集程度确定,通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连接 ...

  8. 机器学习实战——层次聚类算法

    机器学习实战--层次聚类算法 1 层次聚类概述 2 sklearn中的实现 1 层次聚类概述 层次聚类试图在不同层次对数据集进行划分,从而形成树形的聚类结构. 数据集的划分可采用"自底向上& ...

  9. 《机器学习实战》——kNN(k近邻算法)

    原作者写的太好了,包括排版都特别整齐(其中有一个错误之处就是在约会网站配对效果判定的时候,列表顺序不对,导致结果有误,这里我已做出修改) 原作者和出处:http://blog.csdn.net/c40 ...

  10. 模式识别和机器学习实战-K近邻算法(KNN)- Python实现 - 约会网站配对效果判断和手写数字识别

    文章目录 前言 一. k-近邻算法(KNN) 1.算法介绍 2.举个例子--电影分类 3.步骤描述 4.来了--代码实现 二.实战之约会网站配对效果判断 1.导入数据 2.分析数据 3.数据归一化 4 ...

最新文章

  1. 第1课第4.4节_Android硬件访问服务编写HAL代码
  2. POJ 3278 Catch That Cow
  3. asp.net FileUpload随想随记
  4. 关于权限系统的一些思考
  5. 同一事务多次加for_Synchronized锁在Spring事务管理下,为啥还线程不安全?
  6. Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局...
  7. 全国计算机等级考试题库二级C操作题100套(第54套)
  8. Mysql学习总结(53)——使用MySql开发的Java开发者规范
  9. html的搜索框代码怎么写_网站新闻怎么写才能被搜索引擎收录?
  10. 【转】for循环中进行Promise异步操作的问题总结
  11. 备份及恢复计算机名及tcp-ip配置,tcp,ip协议,修复.docx
  12. 《富爸爸穷爸爸》读书笔记 - 为什么要教授财务知识
  13. 【教程】Teambition中行云及飞流实现自定义构建部署
  14. Centos 7 安装 OpenResty api 网关 Orange
  15. 一文读懂如何使用FPGA驱动PHY芯片
  16. 拓润服装ERP管理系统
  17. 特别的生日礼物推荐-男女朋友最想要的礼物-节日礼物送长辈
  18. 58同城上市半年股价沉浮录
  19. C# System.Diagnostics.Stopwatch 记录程序执行时间
  20. 联结主义时间分类(Connectionist temporal classification)的论文笔记

热门文章

  1. 面试官问我:多个 List 如何取交集、并集、去重并集、差集?
  2. ChucK初步(13)
  3. 计网 Packet Tracer仿真 | 简单易懂集线器和交换机对比(理论+仿真)
  4. linux: It seems that scikit-learn has not been built correctly.
  5. 还原html默认打开方式,Win7旗舰版64位系统下如何还原文件默认打开方式
  6. 数据规范化、实体-联系图、状态转换图、层次方框图、Warnier图、IPO图及验证软件需求
  7. vant 中 van-address-edit地址编辑 地址回显获取 areaCode
  8. convert_variables_to_constants()
  9. ubuntu 17.04安装为知笔记
  10. python自测单词软件_还在用背单词App?使用Python开发英语单词自测工具,助你逆袭单词王!...