在十大经典数据挖掘算法中,KNN算法算得上是最为简单的一种。该算法是一种惰性学习法(lazy learner),与决策树、朴素贝叶斯这些急切学习法(eager learner)有所区别。惰性学习法仅仅只是简单地存储训练元组,做一些少量工作,在真正进行分类或预测的时候才开始做更多的工作。有点像是平时不努力学习功课,到了考前才开始临时抱佛脚的感觉。

KNN(k-nearest-neighbor)算法的思想是找到在输入新数据时,找到与该数据最接近的k个邻居,在这k个邻居中,找到出现次数最多的类别,对其进行归类。

距离的计算有很多种方式,最简单的就是直接计算欧式距离,但是根据不同的问题,也可以考虑选用不同的距离计算方式,如余弦距离等等。

详细内容参考:https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm

C#的代码实现如下,代码仅供演示,运行效率不高,在大数据集上需要进行更多的优化:

 using System;
using System.Collections.Generic;
using System.Linq;
using MachineLearning.UtilityFunctions;
namespace MachineLearning.Classification
{
public class KNN
{
public List<int> Labels;
public List<double[]> Features;
public int K;
public KNN(int k, List<int> labels, List<double[]> features)
{
K = k;
Labels = labels;
Features = features;
}
public void Classify(IEnumerable<double[]> data)
{
int n = Labels.Count;
foreach (var line in data)
{
var dist = new Tuple<int, double>[n];
for (int i = ; i < n; i++)
dist[i] = Tuple.Create(Labels[i], Distance.Euclidean(line, Features[i]));
var maxLabel = dist
.OrderBy(i => i.Item2)
.Take(K).GroupBy(i => i.Item1)
.OrderByDescending(i => i.Count())
.First().Key;
Labels.Add(maxLabel);
Features.Add(line);
n++;
}
}
public void Display()
{
for (int i = ; i < Labels.Count; i++)
Console.WriteLine("{0}: {1}", Labels[i], string.Join(",", Features[i]));
}
}
}

以电影数据为例:

电影 打斗镜头 接吻镜头 电影类型
1 3 104 爱情片
2 2 100 爱情片
3 1 81 爱情片
4 101 10 动作片
5 99 5 动作片
6 98 2 动作片
7 18 90 未知

该数据有两个维度,一个是打斗镜头的次数,另一个是接吻镜头的次数,我们需要根据前6条数据来给第7部电影进行分类,判断它是爱情片还是动作片。利用KNN算法进行分类的代码如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MachineLearning.Classification;
namespace MachineLearning
{
class Program
{
static void Main(string[] args)
{
var data = new List<double[]>() {
new double[] {,},
new double[] {,},
new double[] {,},
new double[] {,},
new double[] {,},
new double[] {,},
};
var labels = new List<int>()
{
,,,,,
};
var knn = new KNN(k: , labels: labels, features: data);
knn.Display();
Console.WriteLine("----------------------------------------");
knn.Classify(new double[][] { new double[] { , } });
knn.Display();
Console.ReadKey();
}
}
}

其中类别0代表爱情片,类别1代表动作片。

运行结果如图所示:

可以看到,KNN分类器将第7部电影正确地归为了爱情片。

注:作者本人也在学习中,能力有限,如有错漏还请不吝指正。转载请注明作者。

数据挖掘之KNN算法(C#实现)的更多相关文章

  1. 数据挖掘(二)——Knn算法的java实现

    1.K-近邻算法(Knn) 其原理为在一个样本空间中,有一些已知分类的样本,当出现一个未知分类的样本,则根据距离这个未知样本最近的k个样本来决定. 举例:爱情电影和动作电影,它们中都存在吻戏和动作,出 ...

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

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

  3. 数据挖掘之分类算法---knn算法(有matlab例子)

    knn算法(k-Nearest Neighbor algorithm).是一种经典的分类算法.注意,不是聚类算法.所以这种分类算法 必然包括了训练过程. 然而和一般性的分类算法不同,knn算法是一种懒 ...

  4. 数据挖掘之分类算法---knn算法(有matlab样例)

    knn算法(k-Nearest Neighbor algorithm).是一种经典的分类算法. 注意,不是聚类算法.所以这样的分类算法必定包含了训练过程. 然而和一般性的分类算法不同,knn算法是一种 ...

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

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

  6. Kmeans算法与KNN算法的区别

    最近研究数据挖掘的相关知识,总是搞混一些算法之间的关联,俗话说好记性不如烂笔头,还是记下了以备不时之需. 首先明确一点KNN与Kmeans的算法的区别: 1.KNN算法是分类算法,分类算法肯定是需要有 ...

  7. KNN算法介绍

    KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思. 算法描述 KNN是一种分类算法,其基本思想是采用测量不同特征值之间的距离方法进行分类. 算法过程如下: 1.准备样本数据集( ...

  8. KNN算法--python实现

    邻近算法 或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...

  9. knn算法详解

    邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...

随机推荐

  1. easyUI中datetimebox和combobox的取值方法

    easyUi页面布局中,查询条件放在JS中,如下 <script type="text/javascript"> var columnList = [ [   {    ...

  2. C#使用QQ邮箱发送邮件

    首先要开通QQ邮箱的STMP服务.QQ邮箱——设置——账户——开启SMTP服务. 需要引用: using System.Net; using System.Net.Mail; using System ...

  3. Android 中onSaveInstanceState和onRestoreInstanceState学习

    1. 基本作用: Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate().onPaus ...

  4. 创建html模板

    打开写好的html 复制  在页面上右击------属性  --会出现下面情况

  5. Lua table库整理(v5.1)

    这个库提供了表处理的通用函数. 所有函数都放在表 table. 无论何时,若一个操作需要取表的长度, 这张表必须是一个真序列. table.concat(list, [, sep, [, i , [, ...

  6. SQL_Server_2008修改sa密码的方法

    转载自:http://blog.csdn.net/templar1000/article/details/20211191 1. 先用Window身份验证方式登陆进去,选择数据库实例,右键选择属性—— ...

  7. 关于超出部分隐藏加省略号的css方法

    单行效果:display:block;     white-space:nowrap;  overflow:hidden;    text-overflow:ellipsis; 多行效果:width: ...

  8. [c++] vector的使用

     }     {      vec.push_back(value);  }     {      vector<     vector<,);       vector<, sec ...

  9. android共享内存

    在android下不能通过shm_open使用共享内存. 网上有好多关于android下使用Ashmem实现共享内存的,但经过尝试该方法可以mmap出内存,但是和另一个进程没有实现共享. 具体的使用方 ...

  10. visual studio 2013 已停止运行 解决办法

    情况是这样,WINDOWS 8.1,双显卡笔记本,打开VS.NET 没几秒就提示 已停止运行,然后就关闭程序了,找了无数资料都没有解决 -------------------------------- ...