用JAVA语言实现离散数学算法

用JAVA语言实现离散数学算法 * 显示离散数学算法的真值表 * 提供将一个中缀合适公式的真值表输出到某一PrintStream流中的功能 * 以单个大写字母表示变量(支持26个变量) * 以字符0或者1表示值 * 以 ~ ^ θ)来更新Y的期望E(Y),然后用E(Y)代替Y求出新的模型参数θ(1)。如此迭代直到θ趋于稳定。 在HMM问题中,隐含变量自然就是状态变量,要求状态变量的期望值,其实就是求时刻ti观察到xi时处于状态si的概率,为了求此概率,需要用到向前变量和向后变量。 向前变量 向前变量 是假定的参数 它表示t时刻满足状态,且t时刻之前(包括t时刻)满足给定的观测序列的概率。 1. 令初始值 2. 归纳法计算 3. 最后计算 复杂度 向后变量 向后变量 它表示在时刻t出现状态,且t时刻以后的观察序列满足的概率。 1. 初始值 2. 归纳计算 E-Step 定义变量为t时刻处于状态i,t+1时刻处于状态j的概率。 定义变量表示t时刻呈现状态i的概率。 实际上 是从其他所有状态转移到状态i的次数的期望值。 是从状态i转移出去的次数的期望值。 是从状态i转移到状态j的次数的期望值。 M-Step 是在初始时刻出现状态i的频率的期望值, 是从状态i转移到状态j的次数的期望值 除以 从状态i转移出去的次数的期望值, 是在状态j下观察到活动为k的次数的期望值 除以 从其他所有状态转移到状态j的次数的期望值, 然后用新的参数再来计算向前变量、向后变量、和。如此循环迭代,直到前后两次参数的变化量小于某个值为止。 下面给出我的java代码: package nlp; /** * @author Orisun * date 2011-10-22 */ import java.util.ArrayList; public class BaumWelch { int M; // 隐藏状态的种数 int N; // 输出活动的种数 double[] PI; // 初始状态概率矩阵 double[][] A; // 状态转移矩阵 double[][] B; // 混淆矩阵 ArrayList observation = new ArrayList(); // 观察到的集合 ArrayList state = new ArrayList(); // 中间状态集合 int[] out_seq = { 2, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 2, 1 }; // 测试用的观察序列 int[] hidden_seq = { 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }; // 测试用的隐藏状态序列 int T = 32; // 序列长度为32 double[][] alpha = new double[T][]; // 向前变量 double PO; double[][] beta = new double[T][]; // 向后变量 double[][] gamma = new double[T][]; double[][][] xi = new double[T - 1][][]; // 初始化参数。Baum-Welch得到的是局部最优解,所以初始参数直接影响解的好坏 public void initParameters() { M = 2; N = 2; PI = new double[M]; PI[0] = 0.5; PI[1] = 0.5; A = new double[M][]; B = new double[M][]; for (int i = 0; i < M; i++) { A[i] = new double[M]; B[i] = new double[N]; } A[0][0] = 0.8125; A[0][1] = 0.1875; A[1][0] = 0.2; A[1][1] = 0.8; B[0][0] = 0.875; B[0][1] = 0.125; B[1][0] = 0.25; B[1][1] = 0.75; observation.add(1); observation.add(2); state.add(1); state.add(2); for (int t = 0; t < T; t++) { alpha[t] = new double[M]; beta[t] = new double[M]; gamma[t] = new double[M]; } for (int t = 0; t < T - 1; t++) { xi[t] = new double[M][]; for (int i = 0; i < M; i++) xi[t][i] = new double[M]; } } // 更新向前变量 public void updateAlpha() { for (int i = 0; i < M; i++) { alpha[0][i] = PI[i] * B[i][observation.indexOf(out_seq[0])]; } for (int t = 1; t < T; t++) { for (int i = 0; i < M; i++) { alpha[t][i] = 0; for (int j = 0; j < M; j++) { alpha[t][i] += alpha[t - 1][j] * A[j][i]; } alpha[t][i] *= B[i][observation.indexOf(out_seq[t])]; } } } // 更新观察序列出现的概率,它在一些公式中当分母 public void updatePO() { for (int i = 0; i < M; i++) PO += alpha[T - 1][i]; } // 更新向后变量 public void updateBeta() { for (int i = 0; i = 0; t--) { for (int i = 0; i < M; i++) { for (int j = 0; j < M; j++) { beta[t][i] += A[i][j] * B[j][observation.indexOf(out_seq[t + 1])] * beta[t + 1][j]; } } } } // 更新xi public void updateXi() { for (int t = 0; t < T - 1; t++) { double frac = 0.0; for (int i = 0; i < M; i++) { for (int j = 0; j < M; j++) { frac += alpha[t][i] * A[i][j] * B[j][observation.indexOf(out_seq[t + 1])] * beta[t + 1][j]; } } for (int i = 0; i < M; i++) { for (int j = 0; j < M; j++) { xi[t][i][j] = alpha[t][i] * A[i][j] * B[j][observation.indexOf(out_seq[t + 1])] * beta[t + 1][j] / frac; } } } } // 更新gamma public void updateGamma() { for (int t = 0; t < T - 1; t++) { double frac = 0.0; for (int i = 0; i < M; i++) { frac += alpha[t][i] * beta[t][i]; } // double frac = PO; for (int i = 0; i < M; i++) { gamma[t][i] = alpha[t][i] * beta[t][i] / frac; } // for(int i=0;i

java 离散算法_用JAVA语言实现离散数学算法相关推荐

  1. Python_机器学习_算法_第1章_K-近邻算法

    Python_机器学习_算法_第1章_K-近邻算法 文章目录 Python_机器学习_算法_第1章_K-近邻算法 K-近邻算法 学习目标 1.1 K-近邻算法简介 学习目标 1 什么是K-近邻算法 1 ...

  2. c语言和java哪个好学_学java前要学C语言吗?java和C语言哪个好学?

    在编程世界,只要一提到java,总会有人联想到C语言,仿佛这两者之间有着一种密不可分的联系,那么也会有外行人在选择学习编程时,会有类似于学java前是否需要学习C语言呢?或者说java和C语言哪个会比 ...

  3. java实现apriori算法_七大经典、常用排序算法的原理、Java 实现以及算法分析

    0. 前言 大家好,我是多选参数的程序员,一个正再 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己再这块确实很弱,需要大补(残废了一般) ...

  4. 6种java垃圾回收算法_学习java垃圾回收

    垃圾回收(GC)一直是Java受欢迎背后的重要特性之一.垃圾回收是Java中用于释放未使用的内存的机制.本质上,它追踪所有仍在使用的对象,并将剩下的标记为垃圾.Java的垃圾回收被认为是一种自动内存管 ...

  5. weka java 分类算法_使用Weka快速实践机器学习算法

    [译者注]在当下人工智能火爆发展的局面,每时每刻都有新的技术在诞生,但如果你是一个新手,Weka或许能帮助你直观.快速的感受机器学习带来的解决问题的新思路. Weka使机器学习的应用变得简单.高效并且 ...

  6. java连连看算法_用 JAVA 开发游戏连连看(之三)将算法与界面结合起来

    (之三)将算法与界面结合起来 用布局和按钮来实现算法的界面 上面已经说完了算法,相信大家也迫不及待的想进入界面的设计了吧,好了,多的不说,我们开始吧. 既然我们的算法是基于二维数组的,那么我们也应该在 ...

  7. java高级教程_高级Java教程

    java高级教程 课程大纲 学习Java基础很容易. 但是,真正钻研该语言并研究其更高级的概念和细微差别将使您成为一名出色的Java开发人员. 网络上充斥着"软","便宜 ...

  8. java多线程编程_《java多线程编程实战指南》读书笔记 -- 基本概念

    展开 并发:多个线程操作相同资源,保证线程安全,合理使用资源 高并发:服务能同时处理多个请求,提高程序性能 测试上下文切换工具 Lmbench3 测量上下文切换时长 vmstat 测量上下文切换次数 ...

  9. java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用

    1 简介 本文将讲解Java 8 Stream中的两个方法:skip()和limit().这两个方法是Stream很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList和 ...

最新文章

  1. eclipse 如何使用svn
  2. 【自动驾驶】23.相机成像究竟是成在像平面还是成在焦平面
  3. 趣说API HTTP 状态码的使用
  4. 计算机转型展望未来大发展,市计算机:披荆斩棘砥砺前行,勠力同心展望未来...
  5. mysql导入导出数据库文件(转载)
  6. rowid 对应mysql_请教一下相当于MySQL中Oracle的RowID
  7. 【原】UCS-2和UTF-8的互相转换
  8. java mvc增删改查_springmvc-CRUC增删改查
  9. 自定义EventSource(二)PollingCounter
  10. 使用php自动将文章标题或内容进行分词,添加和删除标签功能实例!
  11. 人工智障学习笔记——机器学习(1)特征工程
  12. java中decrement,Java Math decrementExact()用法及代码示例
  13. 如何读入一个多行的txt文件,给每行的数据加双引号并保存为一行输出
  14. oracle树子类遍历父类_不懂数据库索引的底层原理?那是因为你心里没点b树
  15. openpyxl 列 插入_openpyxl 基本使用
  16. ieee754标准_比特与信息在计算机中的表示及补码和浮点数的IEEE 754标准
  17. emoji粉色爱心符号_新的emoji又来袭!你们知道这些表情符号的真正含义吗?
  18. 饿汉式单例模式,懒汉式单例模式
  19. 增强学习之一——Q-Learning公式
  20. 一加8T安装的EdXposed插件导致手机无限重启的解决办法

热门文章

  1. Maven学习总结(11)——Maven Tomcat7自动部署
  2. oracle 11g rman catalog,Oracle 11g RMAN复制数据库的测试
  3. 那些云中的负载均衡器——Azure、AWS和NetScaler
  4. Tomcat+Spring+Quartz Restart or shutdown error
  5. 新手学跨域之iframe
  6. 使用UrlRewriter进行Url重写的完整解决方案[转]
  7. Oracle 实用技巧
  8. linux防火墙--iptables(三)
  9. Cocoa编程开发者手册
  10. asp.net 将此项目作为引用添加将导致循环依赖项