k-近邻算法(KNN)
最近邻算法可以说是最简单的分类算法,其思想是将被预测的项归类为和它最相近的项相同的类。我们通过简单的计算比较即将被预测的项与已有训练集中各项的距离(差距),选择其中差距最小的一项,该项的类别即为我们即将预测的类别。
下表为我们即将使用的数据集,所有的点分为红色和蓝色两种,我们随机给出一个坐标位置,然后预测其应该属于的类别。

代码如下:
import math
"""
此python程序用来实现最近邻算法
""" def dot_distance(dot1, dot2):
# 计算两点之间的距离
return math.sqrt(pow(dot1.x - dot2.x, 2) + pow(dot1.y - dot2.y, 2)) def cal_nearest_neighbor(example, goal):
""" :param example: 已有的样例集合
:param goal: 待预测的目标
:return: 距目标最近样例
""" dis, aim = dot_distance(example[0], goal), example[0]
example_len = len(example)
for i in range(1, example_len):
dis1, aim1 = dot_distance(example[i],goal), example[i]
if dis > dis1:
dis, aim = dis1, aim1
return aim
最近邻算法只依据一个数据点来判断其类别,显然如果是一个噪音与即将预测的项目距离很近的话,这就有很大的可能会预测错误。然后就有了最近邻算法的改进--k-近邻算法。
k-近邻算法的思想与最近邻算法类似,不过,它是选择了k个与即将预测的项目最近的训练项目,然后让k个项目投票,以此判断其应该属于的类别。代码如下:
import math def dot_distance(dot1, dot2):
# 计算两点之间的距离
return math.sqrt(pow(dot1.x - dot2.x, 2) + pow(dot1.y - dot2.y, 2)) def predict(example, goal, k):
""" :param example: 训练集
:param goal: 待测点
:param k: 投票的个数,一般为奇数
:return: 最近的k个点
"""
example_len = len(example)
if example_len < k:
k = example_len
k_nearest_dots = []
for i in range(k):
k_nearest_dots.append((example[i], dot_distance(example[i], goal)))
k_nearest_dots.sort(key=lambda item: item[1])
for i in range(k, example_len):
dis = dot_distance(example[i], goal)
if dis < k_nearest_dots[k-1][1]:
k_nearest_dots.pop()
k_nearest_dots.append((example[i],dis))
k_nearest_dots.sort(key=lambda item: item[1]) return k_nearest_dots
k-近邻算法存在的问题是,当某一类的数据较大时,会对该类别的预测造成过大的影响。如一个小圆圈内都是一个类别,但是数据很少,然后一个同心圆中数据很多,这时我们预测一个在小圆圈内的数据,我们倾向于它应该是属于小圆圈同一个类别的,但是因为数据不足的原因,其可能会被预测为大圆圈类别。
k-近邻算法的改进是,为不同的距离确定不同的权重。即为更小的距离,确定一个较大的权重。
以上两部分测试代码如下:
import csv
from NN import nearest_neighbor
from NN import k_nearest_neighbor class Data:
def __init__(self):
self.x = 0
self.y = 0
self.type = None with open("test\\NN\\data.csv","r") as csv_file:
reader = csv.reader(csv_file)
rows = [row for row in reader]
example = []
for item in rows:
data = Data()
data.x = int(item[0])
data.y = int(item[1])
data.type = item[2]
example.append(data)
goal = Data()
goal.x = 0
goal.y = 3
result = nearest_neighbor.cal_nearest_neighbor(example,goal)
print(goal.x, " ", goal.y, " :", result.type) goal.x = 3
goal.y = 0
result = nearest_neighbor.cal_nearest_neighbor(example,goal)
print(goal.x, " ", goal.y, " :", result.type) k_num = 3
preset = k_nearest_neighbor.predict(example,goal,k_num)
red = 0
blue = 0
for item in preset:
if item[0].type == "red":
red += 1
elif item[0].type == "blue":
blue += 1
if red > blue:
print("predict ", goal.x, " ", goal.y, " is red")
else:
print("predict ", goal.x, " ", goal.y, " is blue")
训练集数据,保存为data.csv
0,1,red
0,2,red
1,2,red
1,3,red
1,4,red
2,3,red
2,4,red
1,0,blue
2,0,blue
2,1,blue
3,1,blue
3,2,blue
4,1,blue
4,2,blue
k-近邻算法(KNN)的更多相关文章
- k近邻算法(KNN)
k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. from sklearn.model_selection ...
- 机器学习(四) 分类算法--K近邻算法 KNN (上)
一.K近邻算法基础 KNN------- K近邻算法--------K-Nearest Neighbors 思想极度简单 应用数学知识少 (近乎为零) 效果好(缺点?) 可以解释机器学习算法使用过程中 ...
- 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!
1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...
- 机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)
六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocess ...
- k近邻算法(knn)的c语言实现
最近在看knn算法,顺便敲敲代码. knn属于数据挖掘的分类算法.基本思想是在距离空间里,如果一个样本的最接近的k个邻居里,绝大多数属于某个类别,则该样本也属于这个类别.俗话叫,"随大流&q ...
- 《机器学习实战》---第二章 k近邻算法 kNN
下面的代码是在python3中运行, # -*- coding: utf-8 -*- """ Created on Tue Jul 3 17:29:27 2018 @au ...
- 最基础的分类算法-k近邻算法 kNN简介及Jupyter基础实现及Python实现
k-Nearest Neighbors简介 对于该图来说,x轴对应的是肿瘤的大小,y轴对应的是时间,蓝色样本表示恶性肿瘤,红色样本表示良性肿瘤,我们先假设k=3,这个k先不考虑怎么得到,先假设这个k是 ...
- 07.k近邻算法kNN
1.将数据分为测试数据和预测数据 2.数据分为data和target,data是矩阵,target是向量 3.将每条data(向量)绘制在坐标系中,就得到了一系列的点 4.根据每条data的targe ...
- 机器学习随笔01 - k近邻算法
算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. ...
- 机器学习(1)——K近邻算法
KNN的函数写法 import numpy as np from math import sqrt from collections import Counter def KNN_classify(k ...
随机推荐
- Android-Java-面向对象的代码例子
需求一:用手机打电话,发短信,看视频,听音乐,用面向对象思想实现: package android.java.oop01; /** * 1.既然是面向/面对 --> 对象 就要把 (用手机打电话 ...
- Winform文件上传
近期在做了一个winform的项目的附件上传的需求 最初项目选型的时候有三种 1.使用webservice.webapi上传文件 2,直接保存在数据库中 3.使用共享目录+dos命令 第一种有文件大小 ...
- 定时任务 Wpf.Quartz.Demo.3
先把全部源码上传,只是一个Demo,希望大家指点一下不足之处,见本文底部. 1.设置界面 2.详情页面 好了,现在慢慢叙述里面的一些方法. 3.实现拷贝的方法: (1) public static v ...
- .net图表之ECharts随笔03-热力地图
基于01和02 要得到如图所示的热力地图(我从NuGet上下载的包没有heatmap.js文件,没法直接搞热力图,只好暂时先搞着地图.后面尽量搞一下),一般要设置四个参数——title.tooltip ...
- 【LA3485】 Bridge
前言 哈哈哈,垃圾微积分哈哈哈 前置知识:自适应Simpson法与微积分初步,学会编程 Solution 考虑一下我们有的是什么: 一段桥梁的横向距离,悬线的长度,以及高度. 我们发现如果我们重新设一 ...
- JQuery Mobile - html5+CSS 禁止IOS长按复制粘贴实现
因为在移动端APP需要实现长按执行别的事件,但是在IOS系统有默认的长按选择复制粘贴,禁止此功能在网上找了很多资料,最终整理出目前最好的解决方法.实际测试,也并不是很理想,但是可能没有更好办法了! / ...
- 【有新题】OCP 12c 062出现大量新考题-14
choose two You plan to upgrade your Oracle Database 9i to Oracle Database 12c. Which two methods can ...
- jQuery基础(1)
一.jQuery的介绍 1.为什么要使用jQuery? 在用js写代码时,会遇到一些问题,如下: 1)window.onload 事件有事件覆盖的问题,因此只能写一个事件: 2)代码容错性差: 3)浏 ...
- python项目实现配置统一管理的方法
一个比较大的项目总是会涉及到很多的参数,最好的方法就是在一个地方统一管理这些参数.最近看了不少的python项目,总结了两种很有意思的配置管理方法. 第一种 基于easydict实现的配置管理 首先需 ...
- 利用CVE-2018-0950漏洞自动窃取Windows密码
i春秋作家:浅安 0×00 前言 记得还在2016年的时候,我的一个同事那时还在使用CERT BFF(自动化模糊测试工具),他向我询问到如何将微软办公软件中看起来可利用的漏洞转化成可以运行的病毒程序并 ...