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-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...
随机推荐
- linux(centos) tomcat设置开机启动
亲测有效 环境: centos7 apache-tomcat-8.5.37 设置步骤: 1.修改/etc/rc.d/rc.local vi /etc/rc.d/rc.local 2.添加下面两行脚本, ...
- Java发送手机短信(附代码和解析,亲测有效,简便易操作)
这个方法用的是中国网建SMS短信通相关依赖进行操作的~~ 很简单,仅需要三步,第二部代码直接复制,不需要修改,第三部中的用户名和密钥修改成自己的即可 <1> 首先需要导入三个jar包 &l ...
- UE4的委托
UE中委托的使用很广泛,许多Event的触发都有对应的虚函数和委托,虚函数不用讲,只能在派生类中使用,而委托可以在别的类或者蓝图中使用,就应用范围而言,委托的使用更灵活.以AActor的 /** * ...
- Echarts 在动态HTML报告中的应用
# 参考官网 http://echarts.baidu.com/examples/ <scripts> <!--- echarts examples ---> </scr ...
- numpy.convolve函数用法
函数numpy.convolve(a, v, mode=‘full’),这是numpy函数中的卷积函数库 参数: a:(N,)输入的一维数组 b:(M,)输入的第二个一维数组 mode:{‘full’ ...
- 字典 Dictionary
字典 Dictionary {Key-Value} 1.字典是无序的,没有下标(因为有key,取值直接用key值) Key尽量不要用中文编写,以防止编码不同导致取不出来 2.字典常用方法: 查找: ① ...
- apt-get update 出现错误“ AppStream cache update completed, but some metadata was ignored due to errors. ”
只需要 执行 sudo rm /var/lib/dpkg/lock; 之后再次执行:sudo apt-get update
- SAP开发系统中开发和配置客户端请求号变更
假如102为开发客户端,800为配置客户端 正常操作,创建开发请求,应该在102客户端里去创建,但由于操作疏忽开发请求建在了800客户端,如何调整请求到102? 调整步骤:登陆102,SE09找到80 ...
- ADO.NET学习笔记(1)
ADO.Net是.Net框架中为数据库的访问而封装的一个库.通过这个库我们可以简单便捷的访问数据库,并对数据库进行一些增删改查的操作,目前ADO.Net支持四种主流的数据库,分别是SQL.OLE DB ...
- How to setup Visual Studio without pain
Visual Studio (VS) can be very hard to install. If you are lucky, one whole day may be enough to ins ...