数据挖掘之KNN算法(C#实现)
在十大经典数据挖掘算法中,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#实现)的更多相关文章
- 数据挖掘(二)——Knn算法的java实现
1.K-近邻算法(Knn) 其原理为在一个样本空间中,有一些已知分类的样本,当出现一个未知分类的样本,则根据距离这个未知样本最近的k个样本来决定. 举例:爱情电影和动作电影,它们中都存在吻戏和动作,出 ...
- KNN算法 - 数据挖掘算法(3)
(2017-04-10 银河统计) KNN算法即K Nearest Neighbor算法.这个算法是机器学习里面一个比较经典的.相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法 ...
- 数据挖掘之分类算法---knn算法(有matlab例子)
knn算法(k-Nearest Neighbor algorithm).是一种经典的分类算法.注意,不是聚类算法.所以这种分类算法 必然包括了训练过程. 然而和一般性的分类算法不同,knn算法是一种懒 ...
- 数据挖掘之分类算法---knn算法(有matlab样例)
knn算法(k-Nearest Neighbor algorithm).是一种经典的分类算法. 注意,不是聚类算法.所以这样的分类算法必定包含了训练过程. 然而和一般性的分类算法不同,knn算法是一种 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- Kmeans算法与KNN算法的区别
最近研究数据挖掘的相关知识,总是搞混一些算法之间的关联,俗话说好记性不如烂笔头,还是记下了以备不时之需. 首先明确一点KNN与Kmeans的算法的区别: 1.KNN算法是分类算法,分类算法肯定是需要有 ...
- KNN算法介绍
KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思. 算法描述 KNN是一种分类算法,其基本思想是采用测量不同特征值之间的距离方法进行分类. 算法过程如下: 1.准备样本数据集( ...
- KNN算法--python实现
邻近算法 或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...
- knn算法详解
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...
随机推荐
- NPOI读取Excel 数据 转。。。
public DataTable am_Decode() { DataTable table = new DataTable(); string[] strAscDataList = Direct ...
- Cosh.1
不管 先查壳 是VC++的 拿到OD 看看 经过跟踪 发现一个挺神奇的地方 再随便单步单步看看,发现CreateFileA返回的值总是-1 0040137A 83F8 00 ...
- (转)appendChild()、insertBefore()是移动element节点!
原文地址 appendChild().insertBefore()是移动element节点,看书的时候注意过,也可以做一个简单的例子测试一下: <div id="div1"& ...
- vs2010设置断点进行调试时不起作用
1.打开vs2010 2.点击web下的“属性” 3.点击“生成” 4.点击最下方的“高级” 5.在“输出”-调试信息中选择“full”,点击确定按钮即可
- The import javax.servlet cannot be resolved
在STS中,突然把配置的Tomcat删除,换另外一个Tomcat使用时,出现:The import javax.servlet cannot be resolved.这个错误可能是服务器自带的serv ...
- jdbc mysql写入中文乱码解决
一. 问题 数据库编码:utf8 mysql> create database dbnameDEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; ...
- Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目
Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目 新建一个maven工程,这里不赘述如何新建maven工程. 添加Neo4j jar到你的工程 有两种方 ...
- css常用公共样式
/*style reset*/ body,ul,p,h1,h2,h3,h4,h5,h6,dl,dd,form,input,textarea,select{padding:0; margin:0;fon ...
- TOJ1334
1334: Oil Deposits 时间限制(普通/Java):1000 ...
- web安全之sql注入报错型注入
前提: echo mysql_error(),输出错误信息. 熟悉的函数: floor()向下取整 concat()返回的字符串参数连接的结果 count()函数返回匹配指定条件的行数 rand()函 ...