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算法基本实例的更多相关文章

  1. 《机学五》KNN算法及实例

    一.概述 [定义]如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. 二.距离计算公式 两个样本的距离可以通过如下公式计算,又叫[欧式距 ...

  2. KNN算法 - 数据挖掘算法(3)

    (2017-04-10 银河统计) KNN算法即K Nearest Neighbor算法.这个算法是机器学习里面一个比较经典的.相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法 ...

  3. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

  4. 【十大算法实现之KNN】KNN算法实例(含测试数据和源码)

    KNN算法基本的思路是比较好理解的,今天根据它的特点写了一个实例,我会把所有的数据和代码都写在下面供大家参考,不足之处,请指正.谢谢! update:工程代码全部在本页面中,测试数据已丢失,建议去UC ...

  5. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  6. KNN算法

    1.算法讲解 KNN算法是一个最基本.最简单的有监督算法,基本思路就是给定一个样本,先通过距离计算,得到这个样本最近的topK个样本,然后根据这topK个样本的标签,投票决定给定样本的标签: 训练过程 ...

  7. kNN算法python实现和简单数字识别

    kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...

  8. 机器学习笔记--KNN算法1

    前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...

  9. KNN算法与Kd树

    最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...

随机推荐

  1. linux(centos) tomcat设置开机启动

    亲测有效 环境: centos7 apache-tomcat-8.5.37 设置步骤: 1.修改/etc/rc.d/rc.local vi /etc/rc.d/rc.local 2.添加下面两行脚本, ...

  2. Java发送手机短信(附代码和解析,亲测有效,简便易操作)

    这个方法用的是中国网建SMS短信通相关依赖进行操作的~~ 很简单,仅需要三步,第二部代码直接复制,不需要修改,第三部中的用户名和密钥修改成自己的即可 <1> 首先需要导入三个jar包 &l ...

  3. UE4的委托

    UE中委托的使用很广泛,许多Event的触发都有对应的虚函数和委托,虚函数不用讲,只能在派生类中使用,而委托可以在别的类或者蓝图中使用,就应用范围而言,委托的使用更灵活.以AActor的 /** * ...

  4. Echarts 在动态HTML报告中的应用

    # 参考官网 http://echarts.baidu.com/examples/ <scripts> <!--- echarts examples ---> </scr ...

  5. numpy.convolve函数用法

    函数numpy.convolve(a, v, mode=‘full’),这是numpy函数中的卷积函数库 参数: a:(N,)输入的一维数组 b:(M,)输入的第二个一维数组 mode:{‘full’ ...

  6. 字典 Dictionary

    字典 Dictionary {Key-Value} 1.字典是无序的,没有下标(因为有key,取值直接用key值) Key尽量不要用中文编写,以防止编码不同导致取不出来 2.字典常用方法: 查找: ① ...

  7. 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

  8. SAP开发系统中开发和配置客户端请求号变更

    假如102为开发客户端,800为配置客户端 正常操作,创建开发请求,应该在102客户端里去创建,但由于操作疏忽开发请求建在了800客户端,如何调整请求到102? 调整步骤:登陆102,SE09找到80 ...

  9. ADO.NET学习笔记(1)

    ADO.Net是.Net框架中为数据库的访问而封装的一个库.通过这个库我们可以简单便捷的访问数据库,并对数据库进行一些增删改查的操作,目前ADO.Net支持四种主流的数据库,分别是SQL.OLE DB ...

  10. 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 ...