数据挖掘之KNN算法(C#实现)

时间:2023-01-19 19:05:24

在十大经典数据挖掘算法中,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算法(C#实现)

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

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

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

  1. 数据挖掘&lpar;二&rpar;——Knn算法的java实现

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

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

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

  3. 数据挖掘之分类算法---knn算法&lpar;有matlab例子&rpar;

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

  4. 数据挖掘之分类算法---knn算法&lpar;有matlab样例&rpar;

    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. HDU 2274 Magic WisKey

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2274 Magic WisKey Time Limit: 2000/1000 MS (Java/Othe ...

  2. reStructuredText&lpar;&period;rst&rpar;语法规则快速入门

    原文:http://blog.useasp.net/archive/2014/09/05/rst-file-restructuredtext-markup-syntax-quikstart.aspx? ...

  3. startsWith和endWith方法

    startsWith(): 例如:if(a.startsWith(b)) //判断字符串a 是不是以字符串b开头. 语法1 public boolean startsWith(String prefi ...

  4. Jquery&plus;Ajax限制查询间隔

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Jquery20150305.a ...

  5. pycharm提示This inspection detects instance attribute definition outside &lowbar;&lowbar;init&lowbar;&lowbar; method

    示例代码: class MiNiCarStore(CarStore): def createCar(self, typeName): self.carFactory = CarFactory() # ...

  6. 原生js上传图片时的预览

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  7. eclipse Git配置

    Git 1:选择git 2:下载对应版本 安装 Git常用命令: 显示信息类命令  git ls-files -u 显示冲突的文件,-s是显示标记为冲突已解决的文件 git diff 对比工作区和st ...

  8. 【转】每天一个linux命令&lpar;2&rpar;:cd命令

    原文网址:http://www.cnblogs.com/peida/archive/2012/10/24/2736501.html Linux cd 命令可以说是Linux中最基本的命令语句,其他的命 ...

  9. 关于React面试题汇总

    1.redux中间件 中间件提供第三方插件的模式,自定义拦截 action -> reducer 的过程.变为 action -> middlewares -> reducer .这 ...

  10. IE测试CSS兼容性测试

    我们知道IE6~8是现在浏览器的主流.但是由IE6开始,我们已经知道IE并不是完全执行W3C标准.我们在编程的时候往往遇到只兼容某一种浏览器. 我们以前经常使用IE Test进行IE的兼容性测试.但是 ...