马尔科夫链算法的JAVA实现
来源:互联网 发布:chunglim淘宝 编辑:程序博客网 时间:2024/06/08 08:29
首先
马尔可夫链,是指数学中具有马尔可夫性质的离散事件随机过程。该过程中,在给定当前知识或信息的情况下,对于预测将来会发生什么,发生的概率是多少。
算法实现原理
本文章讲述的是如何使用JAVA来简单的实现马尔科夫链算法,相比于现有的C、C++算法,使用JAVA实现马尔科夫链算法比较的简单,其原因在于JAVA里可以使用List数组代替C、C++里的链表、指针,操作起来相对的简单。
马尔科夫链算法的实现原理,是通过统计原有的数据以及它们发生的概率,从而通过概率的大小来判断未来会发生什么,有多大的概率,其过程可以用下面的图片简单描述:
矩阵1矩阵2
上图中矩阵2由矩阵1变化而得,及其过程可以简答的理解为由1→1,2→3,3→2,1→1···依次类推,马尔科夫算法即通过统计这个过程,即1→1的次数和概率,预测矩阵3中(将由矩阵2推出矩阵3)1转换为哪个数字的概率最大,从而达到预测的功能。
程序实现
首先是新建两个数组,这里使用的Object类型的List数组,可根据自身需求选择需要的类型,第一个数组用于存放统计数据,第二个数组用于存放概率:
public static List<Object> markovChain(List<List<Integer>> rawData){//存放统计数据List<Object> theStatisticsArray = new ArrayList<Object>();//存放概率PList<Object> theProbabilityArray = new ArrayList<Object>();
接下来定义一些可能用到的常量:
int len=rawData.size()-1;int times = 1;double sum=0;double p=0;接下来先做一下异常处理,防止没有或仅有一组数据,本算法仅限于两组以上算法:
if(len==0||len==-1){theStatisticsArray.add("数据量不够,请导入足够数据!");return theStatisticsArray;}接下来是核心逻辑,主要实现数据的统计:
else{for(int i=0;i<len;i++){for(int j=0;j<rawData.get(i).size();j++){boolean status = true;if(theStatisticsArray.size()==0){theStatisticsArray.add(rawData.get(i).get(j));theStatisticsArray.add(rawData.get(i+1).get(j));theStatisticsArray.add(times);}else{for(int k=0;k<theStatisticsArray.size();k+=3){if(rawData.get(i).get(j).equals(theStatisticsArray.get(k))){if(rawData.get(i+1).get(j).equals(theStatisticsArray.get(k+1))){theStatisticsArray.set(k+2, (Integer)theStatisticsArray.get(k+2)+1);status = false;}}}if(status){theStatisticsArray.add(rawData.get(i).get(j));theStatisticsArray.add(rawData.get(i+1).get(j));theStatisticsArray.add(times);}}}}}
得到统计完的数据后就可以计算每种事假发生的概率了,这段代码比较的简单:
for(int i=0;i<theStatisticsArray.size();i+=3){sum = sum+(Integer)theStatisticsArray.get(i+2);}for(int i=0;i<theStatisticsArray.size();i+=3){p = (Integer)theStatisticsArray.get(i+2)/sum;for(int j=i;j<i+3;j++){if(j==i+2) continue;theProbabilityArray.add(theStatisticsArray.get(j));}theProbabilityArray.add(p);}return theProbabilityArray;}}
得到的最终结果是由3个为一组的数据组成的数组,例如:1,1,0.1,1,2,0.02表示是是1→1概率为0.1,1→2概率为0.02。
下图为简单的测试结果:
结果:
注意
本算法使用的是JAVA语言实现马尔科夫链算法,其复杂度为n^3,在数据量比较大的时候较为的不适用,可能等待时间会比较的长,尚存在优化的方向。
2 0
- 马尔科夫链算法的JAVA实现
- Java实现的算法
- MD5 算法的java实现
- java 的md5算法实现
- AES算法的JAVA实现
- java 的md5算法实现
- des算法的java实现!
- Java 的DES算法实现
- MD5算法JAVA的实现
- Java的DES算法实现
- java的排序算法实现
- MD5算法的Java实现
- java SHA1算法的实现
- java实现的KMP算法
- DBSCAN算法的Java实现
- RSA算法的Java实现
- java 实现的Dijstra算法
- java实现的floyd算法
- SpringBoot非官方教程 | 第十七篇:上传文件
- maven 项目的pom.xml第一行报错
- CF
- C++抽象编程——面向对象(5)——最终版的point文件
- SpringBoot非官方教程 | 第十八篇: 定时任务(Scheduling Tasks)
- 马尔科夫链算法的JAVA实现
- SpringBoot非官方教程 | 第十九篇: 验证表单信息
- codeforces round #408 C. Bank Hacking
- python opencv —— io(帧、图像、视频的读取与保存)
- Windows CMD命令大全
- linux环境搭建
- 循环语句 一维数组
- FLV文件格式解析
- Ubuntu下MySQL5.5编码设置