机器学习实战-k近邻算法
写在开头,打算耐心啃完机器学习实战这本书,所用版本为2013年6月第1版
在P19页的实施kNN算法时,有很多地方不懂,遂仔细研究,记录如下:
字典按值进行排序
- 首先仔细读完kNN算法之后,了解其是用距离来进行判别
- 程序清单2-1看不太明白,于是把具体的inX,dataSet,labels,k带进去大致明白了意思,这里不做演示
- 书上用字典进行存储,然后对字典的值进行排序,这里不太清楚故去学习了一下
这些理清楚之后,首先来看如何对字典的值进行排序:
dict1 = {'a': 1, 'b': 4, 'c': 2, 'f' : 12}
# 第一种方法,key使用lambda匿名函数取value进行排序
a = sorted(dict1.items(),key = lambda x: x[1])
b = sorted(dict1.items(),key = lambda x:x[1],reverse = True)
print(a)
print(b)
[('a', 1), ('c', 2), ('b', 4), ('f', 12)]
[('f', 12), ('b', 4), ('c', 2), ('a', 1)]
这里sorted的第一个参数为容器,传入的是items,然后第二个参数选择items的第二个值也就是这里的values
dict1 = {'a': 1, 'b': 4, 'c': 2, 'f' : 12}
# 第一种方法,key使用lambda匿名函数取value进行排序
a = sorted(dict1.keys(),key = lambda x: x[0])
b = sorted(dict1.keys(),key = lambda x:x[0],reverse = True)
print(a)
print(b)
['a', 'b', 'c', 'f']
['f', 'c', 'b', 'a']
这里请注意第一个参数容器,需和第二个参数key中排序内容对应,不能第一个选values,第二个填x[1]
?sorted
Signature: sorted(iterable, /, *, key=None, reverse=False)
Docstring:
Return a new list containing all items from the iterable in ascending order.
A custom key function can be supplied to customize the sort order, and the
reverse flag can be set to request the result in descending order.
Type: builtin_function_or_method
如果不想使用匿名函数,也可使用itemgetter()函数按第几维进行排序
# 第二种方法使用operator的itemgetter进行排序
import operator
dict1 = {'a': 1, 'b': 4, 'c': 2, 'f' : 12}
c = sorted(dict1.items(), key=operator.itemgetter(1))
print(c)
kNN算法
在写出完整代码之前,我们还要处理一个问题:
计算出某一具体向量到各数据之间的距离之和,如何按照距离进行排序,再存储进字典中
import numpy as np
def createDataSet():
dataSet = np.array([[1,1],[1,1.2],[0,0],[0,0.2]])
labels = np.array(['A','A','B','B'])
return dataSet,labels
dataSet,labels = createDataSet()
a = np.array([0.1,0.2])-dataSet
a = a**2
a = a.sum(axis=1)
a
array([1.45, 1.81, 0.05, 0.01])
即在字典存储时,如何将上述的array按序存入?
numpy.argsort(a, axis=-1, kind=’quicksort’, order=None)
使用argsort函数即可
import numpy as np
# 数据集
def createDataSet():
dataSet = np.array([[1, 1], [1, 1.2], [0, 0], [0, 0.2]])
labels = np.array(['A', 'A', 'B', 'B'])
return dataSet, labels
dataSet, labels = createDataSet()
# print(dataSet)
# print(labels)
# 生成器
def classifier(arr, dataSet, labels, k):
new_arr = arr - dataSet
# return(new_arr)
new_arr_sqaure = new_arr ** 2
new_arr_sum = new_arr_sqaure.sum(axis=1)
# 欧氏距离,先用目标与数据集的每条相减,再平方再求和再开根号
distances = new_arr_sum ** 0.5
# return distances
# 距离进行排序,这样就能知道传入的向量与数据集中的哪个向量最近
distances_rank = distances.argsort()
# return distances_rank
generate_dict = {}
for i in range(k):
label = labels[distances_rank[i]]
# get函数如果有则正常取,没有则使用后面的参数0
generate_dict[label] = generate_dict.get(label, 0) + 1
# 对字典的值进行排序
sorted_dict = sorted(generate_dict.items(), key=lambda x: x[1], reverse=True)
print(sorted_dict)
return sorted_dict[0][0]
predict_x = np.array([0, 0.1])
result = classifier(predict_x, dataSet, labels, 3)
print(result)
最后结果
[('B', 2), ('A', 1)]
B
机器学习实战-k近邻算法的更多相关文章
- 机器学习之K近邻算法(KNN)
机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...
- 【机器学习】k近邻算法(kNN)
一.写在前面 本系列是对之前机器学习笔记的一个总结,这里只针对最基础的经典机器学习算法,对其本身的要点进行笔记总结,具体到算法的详细过程可以参见其他参考资料和书籍,这里顺便推荐一下Machine Le ...
- 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)
No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...
- 机器学习之K近邻算法
K 近邻 (K-nearest neighbor, KNN) 算法直接作用于带标记的样本,属于有监督的算法.它的核心思想基本上就是 近朱者赤,近墨者黑. 它与其他分类算法最大的不同是,它是一种&quo ...
- [机器学习实战] k邻近算法
1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...
- 【机器学习】K近邻算法——多分类问题
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该类输入实例分为这个类. KNN是通过测量不同特征值之间的距离进行分类.它的的思路是:如 ...
- 机器学习2—K近邻算法学习笔记
Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外p ...
- 机器学习03:K近邻算法
本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...
- 机器学习实战 - python3 学习笔记(一) - k近邻算法
一. 使用k近邻算法改进约会网站的配对效果 k-近邻算法的一般流程: 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据.一般来讲,数据放在txt文本文件中,按照一定的格式进 ...
随机推荐
- 什么是持续集成CI?
持续集成(CI)是每次团队成员提交版本控制更改时自动构建和测试代码的过程. 这鼓励开发人员通过在每个小任务完成后将更改合并到共享版本控制存储库来共 享代码和单元测试.
- vue中的全局组件和局部组件的应用
1全局组件 vue框架: https://www.vue-js.com/?tab=all 组件树 solt 内置分发组件 应用见局部组件 2局部组件 2.1局部组件的使用:生子 - 挂子 - 用子 & ...
- html5知识点补充—footer元素的使用
使用footer元素创建脚注 顾名思义,footer元素通常位于页面的底部.尽管footer通常位于某个区域或者页面的底部,但并非总是如此.footer元素旨在包含作者.网站所有者.版权数据.网站规章 ...
- notification(浏览器通知)
一.notification简介 Web Notifications是HTML5 的一个特性,目前我知道的有谷歌浏览器和windows edge对它进行了支持,用于向用户配置和显示桌面通知. 二.no ...
- Python 图_系列之基于邻接炬阵实现广度、深度优先路径搜索算法
图是一种抽象数据结构,本质和树结构是一样的. 图与树相比较,图具有封闭性,可以把树结构看成是图结构的前生.在树结构中,如果把兄弟节点之间或子节点之间横向连接,便构建成一个图. 树适合描述从上向下的一对 ...
- properties和XML配置文件内容的获取
@ 目录 总结内容 1. Java中为什么要使用配置文件 2. Java中常用的配置文件类型有哪些以及它们的特点 Properties配置文件 XML配置文件 总结 总结内容 1. Java中为什么要 ...
- 用 rollup + gulp 造个轮子,别说还挺香
前戏 我是16年入了前端的坑,17年知道了gulp和rollup这两个玩意儿.由于那时webpack势头很猛,便一直没有正眼瞧过它一眼. 直到20年进了一家小公司,做了很多类似的小项目,相同的代码拷来 ...
- 分库分表实现方式Client和Proxy,性能和维护性该怎么选?
大家好,我是[架构摆渡人],一只十年的程序猿.这是分库分表系列的第一篇文章,这个系列会给大家分享很多在实际工作中有用的经验,如果有收获,还请分享给更多的朋友. 其实这个系列有录过视频给大家学习,但很多 ...
- 使用Socket实现HttpServer(三)
使用Socket实现HttpServer(三) 这一章继续对我们的服务器进行优化,引入 NIO package com.fengsir.network.step4; import java.io.IO ...
- maven导入依赖了提示can't resolved
maven导入依赖显红报错 网上有很多解决方案,我试过几个但是都不是很好用,推荐一个我自己一直在用的解决方案 在终端执行命令 mvn idea:idea 无法解析的原因基本上是因为包没下载完整,执行这 ...