NN算法的核心是,欧式距离(Euclid),在分类的数据中,找到与目标数据欧式距离最近的点,把目标点分类到其类,算法很简单,下面是C#代码的实现:

namespace LocationService.Math
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class NN
{
public List<Tuple<string, double[]>> FingerPrintsTable;
public NN()
{
FingerPrintsTable = new List<Tuple<string, double[]>>();
} public void AddFingerPrint(string key,double[] attributes)
{
var finger = Tuple.Create(key,attributes);
AddFingerPrint(finger);
}
public void AddFingerPrint(Tuple<string,double[]> fingerprint)
{
FingerPrintsTable.Add(fingerprint);
} public void AddFingerPrint(IEnumerable<Tuple<string, double[]>> fingers)
{
FingerPrintsTable.AddRange(fingers);
}
public void RemoveFingerPrint(string key)
{
FingerPrintsTable.RemoveAll(fi => fi.Item1 == key);
} public void RemoveFingerPrint(Tuple<string, double[]> fingerprint)
{
FingerPrintsTable.Remove(fingerprint);
} public double EuclideanDistance(double[] x1, double[] x2,int scale=1)
{
double sum=0;
for (int i = 0; i < x1.Length; i++)
{
sum += Math.Pow(x1[i] - x2[i], 2);
}
sum = Math.Sqrt(sum) / x1.Length*scale;
return sum;
} public List<Tuple<string, double>> FingerEuclideanList(Tuple<string, double[]> target)
{
List<Tuple<string, double>> list = new List<Tuple<string, double>>(); foreach (var finger in FingerPrintsTable)
{
list.Add(Tuple.Create(finger.Item1, EuclideanDistance(finger.Item2, target.Item2)));
}
return list;
} /// <summary>
/// Apply the Euclidean distance
/// </summary>
/// <param name="target"></param>
/// <returns></returns>
public Tuple<string,double> ApplyEuclideanFilter(Tuple<string, double[]> target)
{
var list = FingerEuclideanList(target);
list.Sort((x, y) => (int)((x.Item2 - y.Item2) * 100));
foreach (var item in list)
{
this.log("[Label:{0} Distance:{1}]", item.Item1, item.Item2);
}
return list[0];
} }
}

用其他的案例,分类影片类型:

分类使用

NN nN = new NN();
nN.AddFingerPrint("爱情",new double[] {3,104});
nN.AddFingerPrint("爱情", new double[] {2,100 });
nN.AddFingerPrint("爱情", new double[] {1,81});
nN.AddFingerPrint("动作", new double[] {101,10 });
nN.AddFingerPrint("动作", new double[] {99,5});
nN.AddFingerPrint("动作", new double[] {98,2}); Tuple<string, double[]> target = Tuple.Create("未知",new double[] {81,80});
Tuple<string, double> result=null;
this.MeasureTime(()=> {
result = nN.ApplyEuclideanFilter(target); },time=> {
this.log("===================================");
this.log("分类类型:{0} 欧式距离为:{1}", result.Item1, result.Item2);
this.log("total time:{0}ms", time);
this.log("===================================");
});

分类结果如下:

最新文章

  1. JS入门学习,写一个简单的选项卡
  2. intelliJ idea代码折叠
  3. ASP.net知识点
  4. Socket 使用笔记与注意事项(一)
  5. 对话Facebook人工智能实验室主任、深度学习专家Yann LeCun
  6. Sort Colors —— LeetCode
  7. Aircrack-ng 工具箱
  8. Oracle导出空表处理方法
  9. [LeetCode]题解(python):016-3Sum Closest
  10. Java开发中常见的危险信号(上)
  11. jQuery.form Ajax无刷新上传错误 (jQuery.handleError is not a function) 解决方案
  12. VR全景智慧城市——商家的需求才是全景市场的核心竞争力
  13. javascript内存管理(堆和栈)和javascript运行机制
  14. redis基础篇
  15. Go语言基础之变量和常量
  16. CGI 和 FastCGI 协议的运行原理
  17. Redis报错总结
  18. Terraform 自定义provider 开发
  19. STC-51开发板-单片机控制数码管&amp;按键&amp;点阵综合操作
  20. python3模块: sys

热门文章

  1. OL3-Cesium 二三维鼠标事件统一处理
  2. windows下搭建stm8s开发环境
  3. KETTLE 首次连DB2报错,无驱动。
  4. Java基础学习:9、访问修饰符
  5. Delphi中Stringlist的自定义排序(将函数地址做为参数)
  6. js获取父节点的方式
  7. 查找大文件-清理linux磁盘
  8. Vue中使用model属性
  9. Win10系统所有文件夹被设为只读,取消之后再次打开属性依然只读,怎么解决?
  10. vue使用websoket