Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
作者:Eric Chan 发布时间:2023-07-12 10:50:17
本文实例讲述了Python机器学习k-近邻算法。分享给大家供大家参考,具体如下:
工作原理
存在一份训练样本集,并且每个样本都有属于自己的标签,即我们知道每个样本集中所属于的类别。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后提取样本集中与之最相近的k个样本。观察并统计这k个样本的标签,选择数量最大的标签作为这个新数据的标签。
用以下这幅图可以很好的解释kNN算法:
不同形状的点,为不同标签的点。其中绿色点为未知标签的数据点。现在要对绿色点进行预测。由图不难得出:
如果k=3,那么离绿色点最近的有2个红色三角形和1个蓝色的正方形,这3个点投票,于是绿色的这个待分类点属于红色的三角形。
如果k=5,那么离绿色点最近的有2个红色三角形和3个蓝色的正方形,这5个点投票,于是绿色的这个待分类点属于蓝色的正方形。
kNN算法实施
伪代码
对未知属性的数据集中的每个点执行以下操作
1. 计算已知类型类别数据集中的点与当前点之间的距离
2. 按照距离递增次序排序
3. 选取与当前点距离最小的k个点
4. 确定前k个点所在类别的出现频率
5. 返回前k个点出现频率最高的类别作为当前点的预测分类
欧式距离(计算两点之间的距离公式)
计算点x与点y之间欧式距离
python代码实现
# -*- coding:utf-8 -*-
#! python2
import numpy as np
import operator
# 训练集
data_set = np.array([[1., 1.1],
[1.0, 1.0],
[0., 0.],
[0, 0.1]])
labels = ['A', 'A', 'B', 'B']
def classify_knn(in_vector, training_data, training_label, k):
"""
:param in_vector: 待分类向量
:param training_data: 训练集向量
:param training_label: 训练集标签
:param k: 选择最近邻居的数目
:return: 分类器对 in_vector 分类的类别
"""
data_size = training_data.shape[0] # .shape[0] 返回二维数组的行数
diff_mat = np.tile(in_vector, (data_size, 1)) - data_set # np.tile(array, (3, 2)) 对 array 进行 3×2 扩展为二维数组
sq_diff_mat = diff_mat ** 2
sq_distances = sq_diff_mat.sum(axis=1) # .sum(axis=1) 矩阵以列求和
# distances = sq_distances ** 0.5 # 主要是通过比较求最近点,所以没有必要求平方根
distances_sorted_index = sq_distances.argsort() # .argsort() 对array进行排序 返回排序后对应的索引
class_count_dict = {} # 用于统计类别的个数
for i in range(k):
label = training_label[distances_sorted_index[i]]
try:
class_count_dict[label] += 1
except KeyError:
class_count_dict[label] = 1
class_count_dict = sorted(class_count_dict.iteritems(), key=operator.itemgetter(1), reverse=True) # 根据字典的value值对字典进行逆序排序
return class_count_dict[0][0]
if __name__ == '__main__':
vector = [0, 0] # 待分类数据集
print classify_knn(in_vector=vector, training_data=data_set, training_label=labels, k=3)
运行结果:B
算法评价
优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
使用数据范围:数据型和标称型
适用:kNN方法通常用于一个更复杂分类算法的一部分。例如,我们可以用它的估计值做为一个对象的特征。有时候,一个简单的kNN算法在良好选择的特征上会有很出色的表现。
希望本文所述对大家Python程序设计有所帮助。
来源:http://hareric.com/2016/04/29/k-%E8%BF%91%E9%82%BB%E7%AE%97%E6%B3%95(K%20Nearest%20Neighbor)/


猜你喜欢
- 代码很简单,这里就不多废话了,直接奉上:$(function(){ var w=
- 本文实例讲述了Python3模拟登录操作。分享给大家供大家参考,具体如下:模拟登录_要求:1. 用户输入账号密码进行登录2. 用户信息保存在
- 前言上回在 用 Go 写一个轻量级的 ssh 批量操作工具 里提及过,我们做 Golang 并发的时候要对并发进行限制,对 goroutin
- 选择排序算法步骤:找到数组中最小的那个元素中,将它和数组的第一个元素交换位置,在剩下的元素中找到最小的元素,将它和数组的第二个元素交换位置,
- 最近对微格式进行了一些学习,在学习过程中收获不少。在此分享下,欢迎交流!微型格式的优点:1,语义化的HTML和CSS类名称来标记共同内容。2
- 【pytorch官方文档】:https://pytorch.org/docs/stable/generated/torch.nn.AvgPo
- 我的主机内存只有100G,现在要全表扫描一个200G大表,会不会把DB主机的内存用光?逻辑备份时,可不就是做整库扫描吗?若这样就会把内存吃光
- 印象中,以前电脑不发达,自身编程经历不多的时候,由于Microsoft SQL Server版本众多,在不同版本的windows下必须要求装
- SQL Server执行动态SQL的话,应该如何实现呢?下面就为您介绍SQL Server执行动态SQL两种正确方式,希望可以让您对SQL
- 今天写的代码片段:X = Y = []..X.append(x)Y.append(y)其中x和y是读取的每一个数据的xy值,打算将其归入列表
- 本文实例讲述了Python使用type动态创建类操作。分享给大家供大家参考,具体如下:使用type动态创建类动态语言和静态语言最大的不同,就
- 最近开发了一个网站,大量采用了html5和css3,希望用户都以webkit内核打开页面,但是测试却发现360的以ie内核打开为推荐模式,不
- 最近做了一个前端项目,其中有需求:通过button直接把input或者textarea里的值复制到粘贴板里。下面小编把我实现思路及代码分享给
- 本文实例讲述了Go语言函数基本用法。分享给大家供大家参考,具体如下:这里要说一下是Go函数和一些其他语言不一样的地方1 函数格式不同func
- pickle 是一个 python 中, 压缩/保存/提取 文件的模块,字典和列表都是能被保存的.但必须注意的是python2以ASCII形
- 今天不小心又点了收藏夹里Google的新首页风格的地址,赫然发现又变了!从这个页面上线以来,偶尔会去看看,短短一年的时间,已经变换了至少三次
- 对于程序员来说,编程是一个相当耗费时间和经历的过程,而在这个过程中,一个称手而高效的工具就显得非常重要。加上近期有不少小伙伴在问一些方方面面
- select nid,ntitle,nreadtimes,Row_number() over(order by nreadtimes des
- 最近的对图像数据进行处理的时候需要将图像中的某个颜色替换为另一个颜色,但是网络上找到的方法都是通过对图像的遍历进行替换,实在是太费时了!刚开
- 两个例子package main import ( "fmt" "time")func Proces