KNN算法基本实例
KNN算法是机器学习领域中一个最基本的经典算法。它属于无监督学习领域的算法并且在模式识别,数据挖掘和特征提取领域有着广泛的应用。
给定一些预处理数据,通过一个属性把这些分类坐标分成不同的组。这就是KNN的思路。
下面,举个例子来说明一下。图中的数据点包含两个特征:
现在,给出数据点的另外一个节点,通过分析训练节点来把这些节点分类。没有分来的及诶但我们标记为白色,如下所示:
直观来讲,如果我们把那些节点花道一个图片上,我们可能就能确定一些特征,或组。现在,给一个没有分类的点,我们可以通过观察它距离那个组位置最近来确定它属于哪个组。意思就是,假如一个点距离红色的组最近,我们就可以把这个点归为红色的组。简而言之,我们可以把第一个点(2.5,7)归类为绿色,把第二个点(5.5,4.5)归类为红色。
算法流程:
假设m是训练样本的数量,p是一个未知的节点。
1 把所有训练的样本放到也数组arr[]中。这个意思就是这个数组中每个元素就可以使用元组(x,y)表示。
2 伪码
for i= to m:
Calculate Euclidean distance d(arr[i], p).
3 标记设置S为K的最小距离。这里每个距离都和一个已经分类的数据点相关。
4 返回在S之间的大多数标签。
实际程序C代码:
// C++ program to find groups of unknown
// Points using K nearest neighbour algorithm.
#include <bits/stdc++.h>
using namespace std; struct Point
{
int val; // Group of point
double x, y; // Co-ordinate of point
double distance; // Distance from test point
}; // Used to sort an array of points by increasing
// order of distance
bool comparison(Point a, Point b)
{
return (a.distance < b.distance);
} // This function finds classification of point p using
// k nearest neighbour algorithm. It assumes only two
// groups and returns 0 if p belongs to group 0, else
// 1 (belongs to group 1).
int classifyAPoint(Point arr[], int n, int k, Point p)
{
// Fill distances of all points from p
for (int i = ; i < n; i++)
arr[i].distance =
sqrt((arr[i].x - p.x) * (arr[i].x - p.x) +
(arr[i].y - p.y) * (arr[i].y - p.y)); // Sort the Points by distance from p
sort(arr, arr+n, comparison); // Now consider the first k elements and only
// two groups
int freq1 = ; // Frequency of group 0
int freq2 = ; // Frequency of group 1
for (int i = ; i < k; i++)
{
if (arr[i].val == )
freq1++;
else if (arr[i].val == )
freq2++;
} return (freq1 > freq2 ? : );
} // Driver code
int main()
{
int n = ; // Number of data points
Point arr[n]; arr[].x = ;
arr[].y = ;
arr[].val = ; arr[].x = ;
arr[].y = ;
arr[].val = ; arr[].x = ;
arr[].y = ;
arr[].val = ; arr[].x = ;
arr[].y = ;
arr[].val = ; arr[].x = ;
arr[].y = ;
arr[].val = ; arr[].x = 1.5;
arr[].y = ;
arr[].val = ; arr[].x = ;
arr[].y = ;
arr[].val = ; arr[].x = ;
arr[].y = ;
arr[].val = ; arr[].x = 3.8;
arr[].y = ;
arr[].val = ; arr[].x = ;
arr[].y = ;
arr[].val = ; arr[].x = 5.6;
arr[].y = ;
arr[].val = ; arr[].x = ;
arr[].y = ;
arr[].val = ; arr[].x = 3.5;
arr[].y = ;
arr[].val = ; arr[].x = ;
arr[].y = ;
arr[].val = ; arr[].x = ;
arr[].y = ;
arr[].val = ; arr[].x = ;
arr[].y = ;
arr[].val = ; arr[].x = ;
arr[].y = ;
arr[].val = ; /*Testing Point*/
Point p;
p.x = 2.5;
p.y = ; // Parameter to decide groupr of the testing point
int k = ;
printf ("The value classified to unknown point"
" is %d.\n", classifyAPoint(arr, n, k, p));
return ;
}
实际程序python代码:
# Python3 program to find groups of unknown
# Points using K nearest neighbour algorithm. import math def classifyAPoint(points,p,k=):
'''
This function finds classification of p using
k nearest neighbour algorithm. It assumes only two
groups and returns if p belongs to group , else
(belongs to group ). Parameters -
points : Dictionary of training points having two keys - and
Each key have a list of training data points belong to that p : A touple ,test data point of form (x,y) k : number of nearest neighbour to consider, default is
''' distance=[]
for group in points:
for feature in points[group]: #calculate the euclidean distance of p from training points
euclidean_distance = math.sqrt((feature[]-p[])** +(feature[]-p[])**) # Add a touple of form (distance,group) in the distance list
distance.append((euclidean_distance,group)) # sort the distance list in ascending order
# and select first k distances
distance = sorted(distance)[:k] freq1 = #frequency of group
freq2 = #frequency og group for d in distance:
if d[] == :
freq1 +=
elif d[] == :
freq2 += return if freq1>freq2 else # driver function
def main(): # Dictionary of training points having two keys - and
# key have points belong to class
# key have points belong to class points = {:[(,),(,),(,),(,),(3.5,),(,),(,),(,)],
:[(,),(,),(1.5,),(,),(,),(3.8,),(5.6,),(,),(,)]} # testing point p(x,y)
p = (2.5,) # Number of neighbours
k = print("The value classified to unknown point is: {}".\
format(classifyAPoint(points,p,k))) if __name__ == '__main__':
main() # This code is contributed by Atul Kumar (www.fb.com/atul.kr.)
KNN算法基本实例的更多相关文章
- 《机学五》KNN算法及实例
一.概述 [定义]如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. 二.距离计算公式 两个样本的距离可以通过如下公式计算,又叫[欧式距 ...
- KNN算法 - 数据挖掘算法(3)
(2017-04-10 银河统计) KNN算法即K Nearest Neighbor算法.这个算法是机器学习里面一个比较经典的.相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法 ...
- 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法
(一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...
- 【十大算法实现之KNN】KNN算法实例(含测试数据和源码)
KNN算法基本的思路是比较好理解的,今天根据它的特点写了一个实例,我会把所有的数据和代码都写在下面供大家参考,不足之处,请指正.谢谢! update:工程代码全部在本页面中,测试数据已丢失,建议去UC ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- KNN算法
1.算法讲解 KNN算法是一个最基本.最简单的有监督算法,基本思路就是给定一个样本,先通过距离计算,得到这个样本最近的topK个样本,然后根据这topK个样本的标签,投票决定给定样本的标签: 训练过程 ...
- kNN算法python实现和简单数字识别
kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...
- 机器学习笔记--KNN算法1
前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...
- KNN算法与Kd树
最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...
随机推荐
- windows任务栏IDEA图标变白色快速解决方法
方案1:同时按Windows键+R键打开运行对话框,输入ie4uinit.exe -show然后回车即可修复. 方案2:打开计算机(Win7),此电脑(Win10)或任意文件夹,然后在地址栏输入cmd ...
- js中创建对象
https://www.cnblogs.com/starof/p/4162354.html
- TwinStickShooter的一些问题
TwinStickShooter模板应该是比较好的了解UE基本Pawn和Projectile的一个C++例子.以下是一些问题. 一.这个模板以纯C++编写,没有蓝图,所以第一步,我想测试下如何引用蓝图 ...
- Python3 在操作excel时报PermissionError: [Errno 13] Permission denied: 'D:/workstation/yhdx_auto/config/case.xls'错误
此问题为文件被拒绝访问,主要是该文件已经被打开了.关闭此excel文件后在执行excel的相关操作就ok了.
- #2019-2020-4 《Java 程序设计》第九周总结
2019-2020-4 <Java 程序设计>第九周知识总结 第十一章:JDBC与MySQL数据库 11.1 MySQL数据库管理系统 下载安装: 11.2 启动MySQL数据库服务器 具 ...
- mysql查询前一天的数据
curdate()表示当天日期 统计前一天的日志sql语句: day); 要求: 统计从昨天开始统计前7天的日志包括昨天 day) --------------------- date_sub( ...
- lwip协议栈移植(1)
lwip移植分为两类: 1,只移植内核核心,用户应用程序编写只能基于raw/callback api进行 2,移植内核核心和上层API函数模块,用户可以使用所有三种API编程,即 raw/callba ...
- HTML之二 -特殊标签 与数据交互标签
1.<img> 标签 © <h1> <img src="1.jpg" width="200" height="200& ...
- 简单的JavaScript图像延迟加载库Echo.js
插件描述:和 Lazy Load 一样,Echo.js 也是一个用于图像延迟加载 JavaScript.不同的是 Lazy Load 是基于 jQuery 的插件,而 Echo.js 不依赖于 jQu ...
- wx 参数传值
1: data-id 我们可以给HTML元素添加自定义的data-*属性 example: 假设页面里有下面的元素存在: <div id="myDiv" data-nam ...