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. POJ 2828 Buy Tickets(线段树 树状数组/单点更新)

    题目链接: 传送门 Buy Tickets Time Limit: 4000MS     Memory Limit: 65536K Description Railway tickets were d ...

  2. POJ 2386 Lake Counting(深搜)

    Lake Counting Time Limit: 1000MS     Memory Limit: 65536K Total Submissions: 17917     Accepted: 906 ...

  3. 第三次作业——K米评测

    第一部分 调研,评测 1.第一次上手体验 其实让我下载一个APP并且长期使用它是一件特别难的事情,不仅是因为占空间,需要注册个人信息,绑定账号,更是因为每款软件的功能虽然都很齐全,但是你并在没有真正用 ...

  4. 常见linux命令释义(第三天)

    今天晚上看鸟哥的私房菜,边学边写笔记. 在linux中压缩大多是.tar, .tar.gz , .tgz, /gz, .bz2等. .gz 是通过gzip压缩的文件. .bz2 是通过bzip2压缩的 ...

  5. 【项目】Http请求在NSMutableURLRequest添加HttpBody的字典params属性

    在请求头中加入字典集合的Body,首先把字典转换成json,然后json转换成NSData,然后加入到HTTPBody中,我有已下写法 // 参数paramsNSDictionary * params ...

  6. UVA1210Sum of Consecutive Prime Numbers(素数打表 + 连续和)

    题目链接 题意:输入一个数n (2 <= n <= 10000) 有多少种方案可以把n写成若干个连续素数之和 打出10000之内的素数表,然后再打出每个可能得到的和的方案数的表 #incl ...

  7. gcc编译与gdb调试简要步骤

    http://blog.chinaunix.net/uid-24103300-id-108248.html 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定 ...

  8. 词性标注 parts of speech tagging

    In corpus linguistics, part-of-speech tagging (POS tagging or POST), also called grammatical tagging ...

  9. Light Pre-Pass相关链接

    Key Words: Light Pre-Pass, Deferred Lighting http://mquandt.com/blog/2010/03/light-pre-pass-round-2/ ...

  10. 安卓、swiper标准的文字滚动

    溢出滚动基本原理还是relative,absolute.  核心高度  swiper-wrapper 和gun-swiper-slide 的自适应高度成为关键 <style> .gun-s ...