1.最近工作中要实现用户车辆的行驶路线的聚类,由于所给的数据只有用户一天中交通卡口所监视的卡口名称 :即青岛路-威海路-济阳路 。

要通过聚类实现车辆路线的规律分析,首先要解决的是相似度问题,我们知道计算相似度可以用 :空间向量距离(欧式距离,余弦相似度)等算法。可是这些在此要求中都不适应,故需要用编辑距离来解决此问题

2. 编辑距离的思想:

a.是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如:将kitten 转成 sitting:

1.sitten (k->s)

2.sittin (e –> i)

3.sitting (-> g)

俄罗斯科学家 Vladimir Levenshtein在1965年提出的这个概念

3. 问题:找出字符串的编辑距离,即把一个字符串S1最少经过多少步操作变成字符串S2,操作有三种:添加字符,删除字符,修改一个字符。

解析:首先定义一个这样的函数—edit(i,j),它表示第一个字符串的长度为i 的子串到第二个字符串的长度为j 的子串的编辑距离。

显然有如下的动态规划公式:

1.if i == 0 且 j == 0,edit(i,j)==0

2. if  i == 0 且j >0, edit(i,j )==j

3.if i >0且 j ==0 ,edit(i,j)==i

4.if i >= 1且j>=1,edit(i,j) == min{ edit (i-1,j)+1, edit(i,j-1)+1, edit(i –1,j-1)+f(i,j)} , 当第一个字符串的第i 个字符不等于第二个字符串的第j个字符时,f(i,j) =1; 否则,f(i,j) =0.

4. 上代码:

package com.dk.route;

/**
* 编辑距离,计算文本的相似度
* @author zzy
*
*/
public class LevenshteinDistance {
public static void main (String[] args){ String str1 = "东海路与燕儿岛路路口 山东路海泊桥 山东路与抚顺路路口 辽阳西路与劲松四路路口 重庆中路与振华路路口";
String str2 = "青岛东收费站 夏庄主站收费站 S217朱诸路-张应大朱戈 胶宁高架路三百惠桥上"; // String str2 = "S217朱诸路-张应大朱戈";//S217朱诸路-张应大朱戈
// String str1 = "青兰高速(双埠-管家楼)K23+800桩号增大方向";
// String str2 = "青岛路";
// String str1 = "山东";
System.out.println("ld= "+ levenshteinDistance(str1, str2));
// System.out.println("sim="+sim(str1,str2) );
}
private static int min(int one,int two,int three){
int min = one;
if (two < min){
min = two;
}
if (three <min){
min = three;
}
return min;
}
public static int levenshteinDistance(String str1,String str2){ int d[][]; // 矩阵
int n = str1.length();
int m = str2.length();
int i ; // for str1
int j; // for str2
char ch1;
char ch2;
int temp; // 记录相同字符,在某个矩阵位置值得增量,不是0就是1;
if(n == 0){
return m;
}
if (m == 0){
return n;
}
d = new int [n+1][m+1];
for ( i = 0; i < n ; i++) { // 初始化第一列
d[i][0] = i;
}
for(j = 0; j<= m;j++){ // 初始化第一行
d[0][j] = j;
}
for (i =1; i<= n;i++){
ch1 = str1.charAt(i-1);
for(j=1;j <= m;j++){
ch2 = str2.charAt(j-1);
if(ch1 == ch2){
temp = 0;
}else{
temp =1;
}
d[i][j] = min(d[i-1][j]+1,d[i][j-1]+1,d[i-1][j-1]+temp);
}
}
return d[n][m]; }
public static double sim (Route initR,Route r){ if (initR.routename == null || r.routename == null){
return 0;
}
String str1 = initR.routename;
String str2 = r.routename;
double ld = levenshteinDistance(str1, str2);
double strMax = Math.max(str1.length(), str2.length());
double sim =1- ld/strMax;
// if(ld < strMax){
// sim = 1-ld/Math.min(str1.length(), str2.length());
// } // System.out.println(initR.routename +"-------与-------" +r.routename +"的相似度=" + sim);
return sim;
} }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

源码:https://github.com/chaoren399/dkdemo/blob/master/agenes/src/agenesdemo/LevenshteinDistance.java

1.交通聚类:编辑距离 (Levenshtein距离)Java实现的更多相关文章

  1. 2.交通聚类 -层次聚类(agnes)Java实现

    1.项目背景 在做交通路线分析的时候,客户需要找出车辆的行车规律,我们将车辆每天的行车路线当做一个数据样本,总共有365天或是更多,从这些数据中通过聚类来获得行车路线规律统计分析. 我首先想到是K-m ...

  2. Spark Java API 计算 Levenshtein 距离

    Spark Java API 计算 Levenshtein 距离 在上一篇文章中,完成了Spark开发环境的搭建,最终的目标是对用户昵称信息做聚类分析,找出违规的昵称.聚类分析需要一个距离,用来衡量两 ...

  3. 51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edi ...

  4. 字符串编辑距离(Levenshtein距离)算法

    基本介绍 Levenshtein距离是一种计算两个字符串间的差异程度的字符串度量(string metric).我们可以认为Levenshtein距离就是从一个字符串修改到另一个字符串时,其中编辑单个 ...

  5. 动态规划 001 - 编辑距离(Levenshtein Distance)问题

    问题 字符串的编辑距离也被称为距Levenshtein距离(Levenshtein Distance),属于经典算法,常用方法使用递归,更好的方法是使用动态规划算法,以避免出现重叠子问题的反复计算,减 ...

  6. CodeForces 800B Volatile Kite(点与直线的距离)(Java 实现)

    CodeForces 800B Volatile Kite(点与直线的距离)(Java 实现) 传送门 如果想要一个凸多边形不退化为凹多边形,那么任意的相邻的三个点必然最多形成一条直线.因此我们可以求 ...

  7. 【Algorithm】字符串编辑距离(Levenshtein距离)C++算法实现

    算法实现比较简单,但算法原理不明白,有空了再研究一下. unsigned LevenshteinDistance(const string& s1, const string& s2) ...

  8. 蓝桥杯- 移动距离-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  9. 字符串相似度算法(编辑距离Levenshtein Distance)的应用场景

    应用场景 DNA分析: 将DNA的一级序列如β-球蛋白基因的第一个外显子(Exon)转化为分子“结构图”,然后由所得“结构图”提取图的不变量,如分子连接性指数.以图的不变量作为自变量,再由相似度计算公 ...

随机推荐

  1. AngularJs ngClass、ngClassEven、ngClassOdd、ngStyle

    这几个都关于样式及类名修改的,所以先把样式代码贴上吧. .red{color:red} .blue{color:blue} 写案例用到的样式就这么简单的两个,下面进入正题. ngClass ngCla ...

  2. JavaScript---认识JavaScipt

    认识JavaScript 1.什么是JavaScript? JavaScript是属于网络的脚本语言,她被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies以及更多的应用,她更是因特 ...

  3. JAVA内存机制

    Java程序运行时,数据会分区存放,JavaStack(Java栈). heap(堆).method(方法区). 一.JVM内存模型 1.Java栈Java栈的区域很小,只有1M,特点是存取速度很快, ...

  4. mybatis的批量删除

    公司工程用的是Mybatis的example的类,自动生成了对数据库的操作,批量操作的今天用到了,两种方式,一种需要拓展它生成的类,另一种自带的. 批量删除的id是以集合List传递 id以List& ...

  5. UrlEncode编码/UrlDecode解码 - 站长工具

    http://tool.chinaz.com/tools/urlencode.aspx

  6. mongdb查询与排序

    db.QResult.find({'CreateDate':{'$gte' : ISODate('2016-07-01'), '$lte' : ISODate('2016-08-01')}}).sor ...

  7. CookContainer 序列化保存

    using System;using System.Collections;using System.Globalization;using System.IO;using System.Net;us ...

  8. 自然语言7_NLTK中文语料库sinica_treebank

    http://www.hankcs.com/program/python/nltk-chinese-corpus-sinica_treebank.html NLTK包含Sinica (中央研究院)提供 ...

  9. 10月16日下午MySQL数据库CRUD操作(增加、删除、修改、查询)

    1.MySQL注释语法--,# 2.2.后缀是.sql的文件是数据库查询文件. 3.保存查询. 关闭查询时会弹出提示是否保存,保存的是这段文字,不是表格(只要是执行成功了表格已经建立了).保存以后下次 ...

  10. Android之帮助文档

    F:\Electronic_Design\software\Android\Android_SDK_windows\adt-bundle-windows-x86-20131030\sdk\docs\r ...