问题标签 [viterbi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
95 浏览

viterbi - 在unetstack中使用维特比算法进行卷积解码

我曾尝试在 unetstack 中使用 Viterbi 算法实现卷积解码。但是,我面临一些问题。

  1. 数据未发送到节点 2。(arr - MulAgent.groovy 的第 43 行)
  2. 在某些情况下会出错 -

    groovy.lang.MissingMethodException:No signature of method:Script2.send() is applicable for argument types:(java.lang.Integer, java.lang.Integer)
    values: [2,1010]
    // 2, 1010我们给出的输入值在哪里

mul-sim.groovy(打开并要求输入数据的第一个文件)

//包含解码码的程序的代理 import org.arl.fjage.Message import org.arl.unet.* import org.arl.mac.*

类 MulAgent 扩展 UnetAgent {

final static int PROTOCOL = Protocol.DATA int received_data int new_data def arr = new int[4][2] def temp = new int[2] def code=new int[4][2] int i int k int j = 0诠释错误位;int column_error = 0 int row_error = 0 int m = 4 int n = 4 int count

void startup() { def phy = agentForService Services.PHYSICAL 订阅主题(phy) }

void processMessage(Message msg) { if (msg instanceof DatagramNtf && msg.protocol == PROTOCOL) { for(i=0;i<2;i++) { temp[i] = msg.data[i] println "接收数据打印在代理中是 ${temp[i]}" }
for(i=0;i<2;i++) arr[j][i] = temp[i]; println "代理中的数组是 ${arr}}" println "代理中打印的接收数据是 ${temp}"

// 开始 /********************************************** ************************/ /* // 使用维特比进行卷积解码 // ------------------ ------------------------ // Step 1:将输入作为编码数据字 // Step 2 子模块计算汉明距离 //
Step 2 : 使用维特比算法解码的代码 */
/************************************************* ******************/代码=arr;int state[]=[0,,0,0,0,0,0,0] //state int mem[]=[0,0,0,0,0,0,0,0,0,0] //内存int path=0; //路径矩阵 //int data[]=[1,1,0,1] int n,l; for (int j=0;j<4;j++) { for(int i=8;i>=0;i--) { mem[i+i]=mem[i]; //移位一位 } for (int i=0;i<8;i++) { state[i]=mem[i]; } //disp(mem); 状态[i]=0;//引入0 mem[i]=0; // 计算汉明距离 int out1=((mem[1]^mem[2]^mem[4]^mem[5]^mem[6]^mem[7]^mem[8])^ (( mem[1]^mem[2]^mem[3]^mem[5]^mem[6]^mem[7]^mem[8])); //disp(out1); //输出状态为0 [i]=1; //引入 1 mem[i]=1; int out2=((mem[1]^mem[2]^mem[4]^mem[5]^mem[6]^mem[7 ]^mem[8])^ ((mem[1]^mem[2]^mem[3]^mem[5]^mem[6]^mem[7]^mem[8]));

int l=(code[j][0]^out1)+(code[j][1]^out)); //与 out1 的汉明距离 int m=(code[j][0]^out2)+(code[j][1]^out2)); //与out2的汉明距离

println"路径值 =$path" int 代码=数据;}

def codew=new int[4][2] codew=code;//检测0位错误 int correct=0; 诠释检测=0;诠释n; for(i=0;i<2;i++) if(codew[i][j]) codew[i][j]=0;

for(int i=0;i<4;i++)

} if(detect==0) println"检测完成" println"$code" else if(detect!=0) println"检测完成" println"$code"

import org.arl.unet.* import org.arl.unet.phy.* import org.arl.unet.* import org.arl.unet.phy.* import org.arl.unet.mac.* //import org .arl.unet.nodeinfo.NodeInfo //导入 org.arl.unet.PDU import org.arl.fjage.* //导入静态 org.arl.unet.Services.* //导入静态 org.arl.unet.phy 。身体的。*

订阅物理

send = { addr, value -> println "发送 $value 到节点 $addr" def y= new int[4]; def a=new int[4]; a=[1, 1, 1, 1] y=[0, 0, 0, 0] int i=3 println "$value" int x=value;

而(x!=0) { y[i]=x%10; println "$y" x=x/10; 一世 - ; } def 代码=新的 int[4][2];

/*使用生成器函数编码的码字 g1=1101 g2=1110 */

for(i=0;i<4;i++) {
int bit = y[3-i]; a[3-i] = 位;
代码[i][0] = a[0]^a[1]^a[3]; 代码[i][1] = a[0]^a[1]^a[2]; }

println"4位编码码字:"

//打印码字

println"$代码"

//println "sending ${value[1]} to node $addr " phy << new DatagramReq(to: addr, protocol: Protocol.DATA, data: code[1]) def txNtf2 = receive(TxFrameNtf, 1000) def rxNtf2 = receive({ it instanceof RxFrameNtf && it.from == addr}, 5000) if (txNtf2 && rxNtf2 && rxNtf2.from == addr) println "从 ${rxNtf2.to} 收到的数据来自 ${rxNtf2.from}是:${rxNtf2.data}"

// println "sending ${value[2]} to node $addr " phy << new DatagramReq(to: addr, protocol: Protocol.DATA, data: code[2]) def txNtf3 = receive(TxFrameNtf, 1000) def rxNtf3 = receive({ it instanceof RxFrameNtf && it.from == addr}, 5000) if (txNtf3 && rxNtf3 && rxNtf3.from == addr) println "从 ${rxNtf3.to} 收到的数据来自 ${rxNtf3.from}是:${rxNtf3.data}"

//println "sending ${value[3]} to node $addr " phy << new DatagramReq(to: addr, protocol: Protocol.DATA, data: code[3]) def txNtf4 = receive(TxFrameNtf, 1000) def rxNtf4 = receive({ it instanceof RxFrameNtf && it.from == addr}, 5000) if (txNtf4 && rxNtf4 && rxNtf4.from == addr) println "从 ${rxNtf4.to} 收到的数据来自 ${rxNtf4.from}是:${rxNtf4.data}"

}

0 投票
0 回答
390 浏览

python - 如何在 Python 中为家庭作业创建特定的维特比算法?

所以基本上对于这个作业,我们正在尝试使用维特比算法来解决一个隐藏的马尔可夫模型,我试图以我在网上找到的其他人为基础,但在得到老师的提示后,我想多了。我真的很擅长数学部分,并且理解如何在纸上解决这个问题我只是把它翻译成 python 很糟糕。

以下是我到目前为止的代码,他帮助了我他的提示,我不确定下一步是什么。

0 投票
2 回答
230 浏览

python - 使用多处理模块运行并行进程,其中一个由另一个馈送(依赖)用于维特比算法

我最近玩弄了 Python 的多处理模块来加速隐马尔可夫模型的前向后向算法,因为前向过滤和后向过滤可以独立运行。看到运行时减半是令人敬畏的事情。

我现在尝试在我的迭代维特比算法中包含一些多处理。在这个算法中,我试图运行的两个进程不是独立的。val_max 部分可以独立运行,但 arg_max[t] 取决于 val_max[t-1]。因此,我提出了一个想法,即可以将 val_max 作为一个单独的进程运行,然后将 arg_max 也作为一个可以由 val_max 提供的单独进程运行。

我承认在这里有点超出我的深度,除了观看一些基本视频以及浏览博客之外,我对多处理了解不多。我在下面提供了我的尝试,但它不起作用。

注意:get_path_parallel 还没有回溯。

看起来 val_process 和 arg_process 从未真正运行过。真的不知道为什么会这样。您可以运行维特比算法的维基百科示例中的代码。

我也尝试过使用 Ray。然而,我不知道我在那里到底在做什么。你能帮我推荐一下如何让并行版本运行吗?我一定做错了什么,但我不知道是什么。

您的帮助将不胜感激。

0 投票
1 回答
928 浏览

python - 如何为隐马尔可夫模型找到最可能的隐藏状态序列

Viterbi 算法在隐马尔可夫模型中找到最可能的隐藏状态序列。我目前正在使用hhquark 提供的以下很棒的代码。

然而,我真正需要的不仅仅是最可能的序列,而是前 k 个最可能的隐藏状态序列。

如何修改此代码以提供前 k 个最可能的序列?

0 投票
1 回答
63 浏览

speech-recognition - 如何确定语音识别中 HMM 的观察序列长度

我正在重新学习如何使用隐马尔可夫模型进行语音识别,我有一个问题。似乎大多数/所有关于使用 HMM 的讨论都考虑了已知观察序列的情况:[O1, O2, O3,...,OT] 其中 T 是已知数。但是,如果我们要尝试在语音上实时使用经过训练的 HMM,或者在有人在一个接一个地说话的 WAV 文件中使用,那么究竟如何选择 T 的值呢?换句话说,如何知道说话者何时结束了一个句子并开始了另一个句子?用于语音识别的实用 HMM 是否仅使用 T 的固定值,并使用长度为 T 的固定大小窗口定期重新计算到当前观察的最佳状态序列到过去?或者有没有更好的方法在任何时候动态选择 T ?

0 投票
0 回答
545 浏览

matlab - Matlab的viterbi算法在vitdec()函数中的实现

我正在研究卷积编码和解码。在 MATLAB 中,我使用 vitdec() 函数进行解码。结果很好,误码率符合预期,但我想更深入地研究这个函数,我做得很好,直到我点击了 vitdec() 调用的 vit() 函数(vitdec(函数 Matlab)中的代码行 402) )。到目前为止,我无法在 MathWorks 或其他任何地方找到有关此功能的任何帮助。

我正在粘贴下面使用 vit() 函数的 vitdec() MATLAB 函数的那部分。

我知道维特比算法是如何工作的。我已经用 C 语言实现了它,它的结果与 MATLAB 的结果匹配。我只想看看 videc() 是如何逐步计算分支和路径指标的。任何链接/书籍参考表示赞赏。

0 投票
0 回答
331 浏览

model - 维特比算法中的对数概率(处理零概率)

我正在使用 Viterbi 算法在 Python 中编写概率词性标注器。在这种情况下,时间 t 处的维特比概率是上一个时间步 t-1 的维特比路径概率、从前一个词性标签到当前词性标签的转移概率和观察到的单词的发射概率的乘积POS 标签。我通过查看句子中的每个单词来计算这一点以上。可以在这里找到一个简单的伪代码实现。

重复乘以概率的一个实际问题是它可能导致下溢。文献中经常提出的一种解决方案是使用对数概率。据我了解,您应该这样做:

代替

假设这三个概率存储在相应的变量中。

然而,我发现难以掌握的一个问题是,当发射概率或转移概率为 0 时该怎么办。Michael Collins 写道:“新算法的一个问题是 log 0 = -∞。需要注意处理等于 0 的概率值。一个简单的解决方案是设置 log 0 = -B,其中 B 是一个大数。

我应该使用多大的数字?-math.inf?

0 投票
0 回答
31 浏览

python - 计算维特比的转移概率矩阵

我正在尝试手动计算维特比的概率分布,然后在交叉验证中使用它们。

我有一个带有句子的语料库(corps),每个单词都与其标签结合起来,大致如下:

然后我将我的数据分成训练和测试集并创建两个列表

获取标签:

但是当我想计算我的标签的转换矩阵时,代码需要永远。这是代码:

难道我做错了什么?

0 投票
0 回答
18 浏览

markov - 决定序列预测方法

我有一个用二进制位串表示的 128 个状态的空间。我知道这些状态之间的转换概率如下:

不同位位置处的值可以是相互依赖的,即表示状态的位串的位置x处的值可以影响该状态的位串中另一个位置y处的值。但是,我不知道不同位位置的值如何相互依赖。

我想将最多 t 步的状态序列作为输入,例如 ,[0111111, 1111110, 1111110, 1111011, 1101110, 1111111, 1111101]并想预测第 (t+1) 步的状态。

到目前为止,我已经分别考虑了每个位位置的 Viterbi 算法和状态位串的整数值的 Seq2Seq 模型。但是,我认为它们没有解决不同位位置相互依赖的可能性,也没有利用我计算的转换矩阵。

这个问题似乎很常见,但由于在社会研究领域,我可能不太熟悉任何解决此类问题的现有算法。您能否建议我在给定场景中应用一个好的算法或模型?此外,如果您能指导我使用任何可以帮助我使用的可用 Python 库,我们将不胜感激。

0 投票
0 回答
49 浏览

hidden-markov-models - Viterbi 在小型隐马尔可夫模型上的学习效果不佳

我正在尝试使用 Viterbi 训练来模拟小型 HMM 的参数。我在这里使用维基百科页面中给出的示例. 据我了解,该算法应该提出可以最大限度地从训练数据中获取观察序列的可能性的参数。我的代码实际上确实这样做了,但是以一种非常愚蠢的方式。它将初始概率设置为 [1,0],这意味着链只会进入第一个状态。然后它使该状态吸收,因此不会访问其他状态。然后它设置发射概率以匹配训练数据中观察到的状态的频率。实际上,它抵消了发射概率的所有随机性。在 Wikipedia 示例的上下文中,我学习到的参数本质上是在说总是在下雨,并且 Bob Walks、Shops 和 Cleans 的概率由观察到的频率估计。

这似乎是一个合理的结果,但显然没有得到正确的参数。我读过的许多论文都说,维特比训练虽然不如鲍姆-韦尔奇,但产生了足够好的结果。但是他们都没有谈论我遇到的这个问题。这是应该发生的事情吗?