在十大经典数据挖掘算法中,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个邻居来代 ...
随机推荐
-
HDU 2274 Magic WisKey
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2274 Magic WisKey Time Limit: 2000/1000 MS (Java/Othe ...
-
reStructuredText(.rst)语法规则快速入门
原文:http://blog.useasp.net/archive/2014/09/05/rst-file-restructuredtext-markup-syntax-quikstart.aspx? ...
-
startsWith和endWith方法
startsWith(): 例如:if(a.startsWith(b)) //判断字符串a 是不是以字符串b开头. 语法1 public boolean startsWith(String prefi ...
-
Jquery+Ajax限制查询间隔
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Jquery20150305.a ...
-
pycharm提示This inspection detects instance attribute definition outside __init__ method
示例代码: class MiNiCarStore(CarStore): def createCar(self, typeName): self.carFactory = CarFactory() # ...
-
原生js上传图片时的预览
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
-
eclipse Git配置
Git 1:选择git 2:下载对应版本 安装 Git常用命令: 显示信息类命令 git ls-files -u 显示冲突的文件,-s是显示标记为冲突已解决的文件 git diff 对比工作区和st ...
-
【转】每天一个linux命令(2):cd命令
原文网址:http://www.cnblogs.com/peida/archive/2012/10/24/2736501.html Linux cd 命令可以说是Linux中最基本的命令语句,其他的命 ...
-
关于React面试题汇总
1.redux中间件 中间件提供第三方插件的模式,自定义拦截 action -> reducer 的过程.变为 action -> middlewares -> reducer .这 ...
-
IE测试CSS兼容性测试
我们知道IE6~8是现在浏览器的主流.但是由IE6开始,我们已经知道IE并不是完全执行W3C标准.我们在编程的时候往往遇到只兼容某一种浏览器. 我们以前经常使用IE Test进行IE的兼容性测试.但是 ...