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-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...
随机推荐
- shell 到达一定数量文件自动删除最久时间文件
#!/bin/bash#rm_file>14day ReservedNum=4 #保留文件数量rm_file_dir='/home/sean/sean/ ...
- 2019西湖论剑web wp
发在正文前 这应该是自己在安全圈摸爬滚打两年多以来第一次正规的ctf比赛.没解出flag,没截图,只提供了一些思路. 遥想往昔,初入大学,带着对PT的向往,一个人穿行在幽暗的图书馆,翻阅啃读一本本安全 ...
- oracle 查询clob 列时 很慢 , 未解决
今天查询一张表 ,这张表有一个clob 列 select * from tableName : 很卡.. 难道是查询的太多? select * from tableName where rowN ...
- eval函数的特点和作用
eval(): 作用:它的作用是把对应的字符串解析成js代码并运行(将json的字符串解析成为JSON对象): 特点:它是一个全局函数: 缺点:1>在该函数内部申明的变量都是全局变量,且申明的变 ...
- Python 3.6安装yaml时报"AttributeError: module 'pip' has no attribute 'main'"和“Non-zero exit code”错误
1.Python 3.6安装yaml时一开始报AttributeError: module 'pip' has no attribute错误,根据网上提供的解决方法修改Pycharm安装目录D:\Pr ...
- mongooDb链接javaapi
mongodb链接有多种:所以不同链接下的api也不太一样. 1.api比较全面 public void query2(){ String mondburl = Config.getInstance( ...
- 20155312 张竞予 Exp7 网络欺诈防范
Exp7 网络欺诈防范 目录 基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 (2)在日常生活工作中如何防范以上两攻击方法 实验总结与体会 实践过程记录 (1)简单应用SET工具建 ...
- Django项目及应用的创建
一.url解释 1url是全球资源定位符,网上的每个文件都有唯一的url地址,组成:协议.服务器名称(或IP地址).路径和文件名. 2有时候,URL以斜杠“/”结尾,而没有给出文件名,在这种情况下,U ...
- mysql 数据库链接 过期产品
注意下面的"@" 必须要加的!否则会报错! $link = @mysql_connect('localhost','root','root') or die("link ...
- 1002 A+B for Polynomials 可弃
使用类似桶排序的计数方式来存储