K-Nearest Neighbors

K-Nearest Neighbors是机器学习中最基本但最基本的分类算法之一。它属于监督学习领域,在模式识别,数据挖掘和入侵检测方面有着广泛的应用。

它在现实场景中广泛使用,因为它是非参数的,这意味着它不会对数据分布做出任何潜在的假设(与GMM等其他算法相反,GMM假定给定数据的高斯分布) 。

我们给出了一些先前的数据(也称为训练数据),它将坐标分类为由属性标识的组。

例如,请考虑以下包含两个功能的数据点表:

现在,给定另一组数据点(也称为测试数据),通过分析训练集将这些点分配为一组。请注意,未分类的点标记为“白色”。

 

直觉
如果我们在图表上绘制这些点,我们可能能够找到一些簇或组。现在,给定一个未分类的点,我们可以通过观察它的最近邻居所属的组来将其分配给一个组。这意味着接近被归类为“红色”的点群集的点具有被归类为“红色”的更高概率。

直觉上,我们可以看到第一点(2.5,7)应该被归类为“绿色”而第二点(5.5,4.5)应该被归类为“红色”。

算法
设m是训练数据样本的数量。设p是一个未知点。

  1. 将训练样本存储在数据点arr []中。这意味着该数组的每个元素代表一个元组(x,y)。
  2. 对于i = 0到m:
      计算欧几里德距离d(arr [i],p)。
  3. 使得到的S的最小距离为S. 这些距离中的每一个对应于已经分类的数据点。
  4. 返回S中的大多数标签

建议:在继续使用解决方案之前,请先在{IDE}上尝试您的方法。

K可以保持为奇数,以便在只有两组可能的情况下(例如红/蓝)我们可以计算出明显的多数。随着K的增加,我们在不同的分类中获得更平滑,更明确的界限。此外,随着我​​们增加训练集中的数据点的数量,上述分类器的准确度也增加。

示例程序
假设0和1为两个分类器(组)。

  • C / C ++
  • 蟒蛇

filter_none

编辑

play_arrow

brightness_5

// 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 = 0; 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 = 0;     // Frequency of group 0

    int freq2 = 0;     // Frequency of group 1

    for (int i = 0; i < k; i++)

    {

        if (arr[i].val == 0)

            freq1++;

        else if (arr[i].val == 1)

            freq2++;

    }

  

    return (freq1 > freq2 ? 0 : 1);

}

  

// Driver code

int main()

{

    int n = 17; // Number of data points

    Point arr[n];

  

    arr[0].x = 1;

    arr[0].y = 12;

    arr[0].val = 0;

  

    arr[1].x = 2;

    arr[1].y = 5;

    arr[1].val = 0;

  

    arr[2].x = 5;

    arr[2].y = 3;

    arr[2].val = 1;

  

    arr[3].x = 3;

    arr[3].y = 2;

    arr[3].val = 1;

  

    arr[4].x = 3;

    arr[4].y = 6;

    arr[4].val = 0;

  

    arr[5].x = 1.5;

    arr[5].y = 9;

    arr[5].val = 1;

  

    arr[6].x = 7;

    arr[6].y = 2;

    arr[6].val = 1;

  

    arr[7].x = 6;

    arr[7].y = 1;

    arr[7].val = 1;

  

    arr[8].x = 3.8;

    arr[8].y = 3;

    arr[8].val = 1;

  

    arr[9].x = 3;

    arr[9].y = 10;

    arr[9].val = 0;

  

    arr[10].x = 5.6;

    arr[10].y = 4;

    arr[10].val = 1;

  

    arr[11].x = 4;

    arr[11].y = 2;

    arr[11].val = 1;

  

    arr[12].x = 3.5;

    arr[12].y = 8;

    arr[12].val = 0;

  

    arr[13].x = 2;

    arr[13].y = 11;

    arr[13].val = 0;

  

    arr[14].x = 2;

    arr[14].y = 5;

    arr[14].val = 1;

  

    arr[15].x = 2;

    arr[15].y = 9;

    arr[15].val = 0;

  

    arr[16].x = 1;

    arr[16].y = 7;

    arr[16].val = 0;

  

    /*Testing Point*/

    Point p;

    p.x = 2.5;

    p.y = 7;

  

    // Parameter to decide group of the testing point

    int k = 3;

    printf ("The value classified to unknown point"

            " is %d.\n", classifyAPoint(arr, n, k, p));

    return 0;

}


输出:

分类到未知点的值为0。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值