概述

在数学中,欧几里得距离欧几里得度量是欧几里得空间中两点间“普通”(即直线)距离。使用这个距离,欧氏空间成为度量空间。
详见 百度百科:https://baike.baidu.com/item/%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E5%BA%A6%E9%87%8F/1274107?fromtitle=%E6%AC%A7%E5%BC%8F%E8%B7%9D%E7%A6%BB&fromid=2809635&fr=aladdin

计算公式

使用

  • 欧式距离在数学上,一般用在求任意维度空间的2点之间的距离。
  • 开发中,多用在,判端某些数据的摇摆幅度,并剔除一些差异化较大的数据。例如:风控系统中,用户输入特性的判定上

本文将根据用户输入特征的数据模型,对欧式距离的应用进行简单的介绍。

总思路: 根据用户的历史登录的输入特征,建立 圆形 的数据模型,取落入此圆内的数据,作为正常值,落到圆外部的数据将被判定为风险数据。

  • 建模 :根据历史的输入特性,建立多维度的几何模型。(一般为2~3维)
  • 计算圆心:跟据历史数据的每个轴的对应数据长度,根据公式 一条直线上任意点的距离中点=点与初始点(即 坐标轴心)的长度之和/点个数,计算出圆心的位置。
  • 计算半径: 根据欧式距离公式,计算出各个点之间的距离,按照由小到大排序后,取其大于1/2处的数据作为半径。
  • 计算当前请求的特征点是否落在圆内: 根据欧式距离公式,计算出,圆心到请求点的距离,判断是否落在圆内(即距离是否小于半径)。

代码实现

 public boolean doEval(Double[] inputFeatures, List<Double[]> historyInputFeatures){//如果特征不足2次,不进行验证if(historyInputFeatures.size()<2){return false;}//已经足够2次/*** 第一步,计算圆心*///计算出圆心,所有点的同一轴下的坐标长度相加/点的数量Double[] centerOfCircle = historyInputFeatures.stream().reduce((x, y) -> {//创建一个double 数组,用于接收圆心数据,数组长度为历史数据的维度Double[] centerOfCircles = new Double[historyInputFeatures.get(0).length];//获取每个轴下对应数据的总和for (int i = 0; i < historyInputFeatures.get(0).length; i++) {if (centerOfCircles[i] == null) {centerOfCircles[i] = 0.0;}centerOfCircles[i] += x[i] + y[i];}return centerOfCircles;}).get();//计算最终的圆心结果for (int i = 0; i < centerOfCircle.length; i++) {centerOfCircle[i] = centerOfCircle[i]/historyInputFeatures.size();}System.out.println("计算的圆心位置是\t"+ Arrays.stream(centerOfCircle).map(x->x+"").reduce((v1,v2)->v1+","+v2).get());/*** 第二步,进行半径的计算,求出所有2点之间的半径,排序后取2/3的位置作为半径阈值*///创建一个接收所有距离的数组,长度是 (设历史点个数为n)(n*n-1)/2//确定数组长度int size = ((historyInputFeatures.size())*(historyInputFeatures.size()-1))/2;List<Double> allDistance = new ArrayList<Double>();for (int i = 0; i < historyInputFeatures.size(); i++) {//每次,拿1个历史数据点,和其他的数据进行距离计算for (int j = i+1; j < historyInputFeatures.size(); j++) {//计算每2个点的距离,并存入集合中allDistance.add(getDistance(historyInputFeatures.get(i),historyInputFeatures.get(j)));}}//排序,求出2/3位置的长度,作为半径allDistance.sort((a,b)->{if(a==b){return 0;}else{return a>b?1:-1;}});//得出半径Double radius = allDistance.get((allDistance.size() * 2) / 3);System.out.println("计算的半径是\t"+radius);/*** 第三步,判断当前特征的模型点到圆心的距离是否小于半径,是就无风险,否则有风险*///获取当前的点的距离圆心的长度Double result = getDistance(inputFeatures,centerOfCircle);System.out.println("当前的点距离圆心的长度为"+result);return result > radius;}//提供一个计算2点之间距离的方法 ∑(Xi-Yi)^2private Double getDistance(Double[] point1,Double[] point2){//创建一个变量,用于接收,每次求和之后的值Double sum = 0.0;for (int i = 0; i < point1.length; i++) {sum += Math.pow(point1[i]-point2[i],2);}//最后返回计算结果return Math.sqrt(sum);}

测试

    public static void main(String[] args) {InputFeatureEvaluate inputFeatureEvaluate = new InputFeatureEvaluate();ArrayList<Double[]> latestInputFeatures = new ArrayList<>();latestInputFeatures.add(new Double[]{1000.0,1100.0,1800.0});latestInputFeatures.add(new Double[]{1100.0,1120.0,1750.0});latestInputFeatures.add(new Double[]{950.0,1250.0,2000.0});latestInputFeatures.add(new Double[]{1200.0,1050.0,1900.0});latestInputFeatures.add(new Double[]{1400.0,800.0,2500.0});inputFeatureEvaluate.doEval(new Double[]{1100.0,1000.0,1750.0},latestInputFeatures);}

算法-入门篇(欧式距离)相关推荐

  1. 算法入门篇六 二叉树

    牛客网 算法入门篇 左程云老师 个人复习,如果侵全,设为私密 二叉树遍历(递归) 先序遍历(中,左,右) 中序遍历(左,中,右) 后序遍历(左,右,中) 如上图所示结构,二叉树的遍历本质上都是递归序, ...

  2. K邻近算法概述、欧式距离、Scikit-learn使用 、kNN邻近算法距离度量、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化欧氏距离、余弦距离、汉明距离、杰卡德距离、马氏距离

    一.K-邻近算法概述 K邻近算(K Nearest Neighbor算法,KNN算法):如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...

  3. 算法入门篇九 暴力递归

    牛客网 左程云老师的算法入门课 暴力递归 原则  汉诺塔问题 问题 打印n层汉诺塔从左边移动到最右边的过程 思想 一共六个过程,左到右.左到中,中到左,中到右,右到左,右到中,互相嵌套使用 左到右 将 ...

  4. 算法入门篇八 贪心算法

    牛客网 左程云老师的算法入门课 贪心算法 贪心算法的解题步骤  例子 题目要求  解题策略 按照结束时间早的会议先安排,比如先安排[2,4],当4结束了,所有开始时间小于4的全部淘汰,[1,7].[3 ...

  5. 算法入门篇七 前缀树

    牛客网 左程云老师的算法入门课 找二叉树的节点的后继节点 原则 如果节点有右子树,那么后继节点就是右子树的最左边的第一个节点 如果节点没有右子树,如果节点是父节点的右孩子,就继续往上找,直到找到一个父 ...

  6. 【贪心专题】—— 贪心算法入门篇

    贪心算法入门 一.什么是贪心算法 "贪心算法(greedy algorithm,又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,算法得到 ...

  7. 基于高度图的三维地形生成算法入门篇 —— 均匀网格地形生成算法

    赵 刚 引言     在三维游戏等建立的虚拟世界中要求虚拟场景具有很高的逼真度,其中的三维地形逼真度是关键之一.然而三维地形的生成和绘制需要巨大的计算量,实景地形的生成还需要地形数据库的支持,在运算能 ...

  8. 牛客网在线编程----算法入门篇

    标题本篇博文主要是记录下自己的在线编程情况,初次练习,有的算法还待改进,大家有需要可以去牛客网上面多练练! 有需戳–>牛客网在线编程 NC65.题目描述 大家都知道斐波那契数列,现在要求输入一个 ...

  9. 算法入门篇三 详解桶排序和整理排序知识 堆的相关操作 补充 不完整

    归并排序不使用递归 使用一个变量,使其按照1.2.4.8递增,控制左右两边1个元素.2个元素.4个元素等元素的合并 完全二叉树 完全二叉树 要不全是满的,要不叶子节点出现在最后一层,只要出现了叶子节点 ...

最新文章

  1. 计算机鹅点云,CVPR 2020 | 用于点云中3D对象检测的图神经网络
  2. 33 ES6中的类和对象
  3. 图灵奖得主Yann LeCun万字访谈:DNN“史前文明”、炼金术及新的寒冬
  4. Linux命令 iperf - 网络性能测试工具
  5. 如何让listView加入的HeaderView不可点击【转】
  6. leetcode 678. Valid Parenthesis String | 678. 有效的括号字符串(带缓存的暴力递归)
  7. python如何读取数据保存为新格式_python,初学者应用实例:读取文件中的数据,将将北京时间转换成世界时间,再保存成新的CSV格式文件...
  8. c语言加速度积分得到速度_自编微积分教材-第一章 微积分漫谈(1)
  9. 彻底解决Spring MVC 中文乱码 问题
  10. c语言输入日期返回星期几,C语言程序设计: 输入年月日 然后输出是星期几
  11. 拓端tecdat|R 语言绘制功能富集泡泡图
  12. 在python语言中、写文件的操作是_Python语言之详解文件操作
  13. MAC终端使用SSH连接远程服务器
  14. 小程序商城需要食品流通许可证吗?
  15. 【软件应用开发】小米便签APP维护开发
  16. envi与arcgis文件转换_[转载]ArcGIS、MapInfo、ENVI、MapGIS等矢量格式相互转换
  17. 快速了解B+树的插入、删除操作
  18. (window10)使用karas生成网络模型,安装组件及无法成功加载plot_model的解决
  19. 计算机显示丢失d3dcompiler,无法启动此程序提示缺少d3dcompiler文件怎么解决
  20. APP在后台被系统杀死的六种主要原因

热门文章

  1. 200万年薪的博士,华为到底看重什么?
  2. JVM 执行引擎的作用及工作过程
  3. 公积金总结(一)--公积金概念
  4. 山海演武传·黄道·第一卷 雏龙惊蛰 第二章 修闵本饰邪
  5. 阿里云创建AccessKey
  6. 读《Scratch 2.0 少儿游戏趣味编程》
  7. 2017-4-6 四月生花,冷暖自知
  8. webpack学习之路------配置多个 HTML 文件
  9. 【C语言】易错题 and 易混淆知识
  10. 梯度下降法and随机梯度下降法