在十大经典数据挖掘算法中,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. Record:Handle onClick for our custom LinearLayout for Gallery-like HorizontalScrollView

    Handle onClick for our custom LinearLayout for Gallery-like HorizontalScrollView   The post "Im ...

  2. [转]Linux 的多线程编程的高效开发经验

    Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们 ...

  3. 详解 IOS 7.1 程序启动原理

    程序都是从Main方法入口的 IOS 也不例外 int main(int argc,char * argv[]) { @autoreleasepool { return UIApplicationMa ...

  4. .gitignore失效问题解决

    .gitignore失效背景: 本地Mac上使用Unity新建了一个项目,使用git init将项目初始化为仓库,此时commit.随后,加入.gitignore文件,再次commit.然后提交整个仓 ...

  5. 在Visual Lisp中处理自动化错误

    Handling Automation errors in Visual LISP 翻译自原文Kean's blog:http://through-the-interface.typepad.com/ ...

  6. Lua Coroutine详解

    协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西.线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程 ...

  7. iconv 失败

    网上的都是这样用的 代码如下:              $content = iconv("utf-8","gb2312",$content); 这样做其实也 ...

  8. jquery基础知识学习笔记

    jquery是一个js库/常用版本是jjquery-1.7.2.js/这个版本主要是用来做开放用途 做产品的时候是用它的min版本.玩jquery的时候,不管干啥都要花钱(美元)   注意点: 1.s ...

  9. jsp中target="_blank"的用法

    对于点击查询按钮或a标签等,打开一个新页面并显示结果的做法如下: 1.form表单: 在form标签上加target="_blank"后,点击搜索按钮,显示查询结果时会打开一个新页 ...

  10. Linux Pthread 深入解析(转-度娘818)

    Linux Pthread 深入解析   Outline - 1.线程特点 - 2.pthread创建 - 3.pthread终止         - 4.mutex互斥量使用框架         - ...