在使用广义时间差分(例如SARSA,Q学习)的任何标准强化学习算法中,出现的问题是用于特定任务的λ和伽马超参数的值.
我知道lambda与资格痕迹的长度有关,而gamma可以解释为折扣未来的奖励多少,但是我怎么知道我的lambda值对于给定的任务来说太低了,或者我的gamma太高了?
我意识到这些问题没有明确定义的答案,但是知道某些"危险信号"会产生不适当的价值会非常有用.
以标准推车杆或倒立摆任务为例.我应该将gamma设置为高,因为它需要很多步骤来使任务失败,或者因为状态信息完全是Markovian而需要低吗?而且我甚至无法理解lambda值......
artificial-intelligence machine-learning markov reinforcement-learning
如果我有一个单词的向量,例如["john""说"......"john""走了"......]我想制作每个单词的哈希映射和下一个单词的出现次数,例如{"john"{"说"1"走了"1"踢了"3}}
我想出的最好的解决方案是通过索引递归遍历列表并使用assoc来继续更新哈希映射,但这似乎非常混乱.有没有更惯用的方法呢?
我有一个由 8 亿条记录聚合而成的频率表,我想知道是否可以使用包从频率表中计算一阶转移矩阵,这是不对称的,因为某些状态再也没有发生过。频率表的一个示例是:
library(data.table)
model.data <- data.table(state1 = c(3, 1, 2, 3), state2 = c(1, 2, 1, 2), Freq = c(1,2,3,4))
Run Code Online (Sandbox Code Playgroud)
model.data 看起来像这样:
状态 1 | 状态2 | n |
---|---|---|
3 | 1 | 1 |
1 | 2 | 2 |
2 | 1 | 3 |
3 | 2 | 4 |
使用包 pollster,我可以计算比例表:
library(pollster)
crosstab(model.data, state1, state2, Freq)
Run Code Online (Sandbox Code Playgroud)
状态 1 | 1 | 2 | n |
---|---|---|---|
1 | 0 | 100 | 2 |
2 | 100 | 0 | 3 |
3 | 20 | 80 | 5 |
但是,我正在寻找的对称转移矩阵是:
状态 1 | 1 | 2 | 3 | n |
---|---|---|---|---|
1 | 0 | 100 | 0 | 2 |
2 | 100 | 0 | 0 | 3 … |
我正在尝试计算序列的一步、两步转移概率矩阵,如下所示:
sample = [1,1,2,2,1,3,2,1,2,3,1,2,3,1,2,3,1,2,1,2]
import numpy as np
def onestep_transition_matrix(transitions):
n = 3 #number of states
M = [[0]*n for _ in range(n)]
for (i,j) in zip(transitions,transitions[1:]):
M[i-1][j-1] += 1
#now convert to probabilities:
for row in M:
s = sum(row)
if s > 0:
row[:] = [f/s for f in row]
return M
one_step_array = np.array(onestep_transition_matrix(sample))
Run Code Online (Sandbox Code Playgroud)
我的问题,我们如何计算两步转移矩阵。因为当我手动计算矩阵时,它如下所示:
two_step_array = array([[1/7,3/7,3/7],
[4/7,2/7,1/7],
[1/4,3/4,0]])
Run Code Online (Sandbox Code Playgroud)
然而。np.dot(one_step_array,one_step_arrary) 给了我一个不同的结果,如下所示:
array([[0.43080357, 0.23214286, 0.33705357],
[0.43622449, 0.44897959, 0.11479592],
[0.20089286, 0.59821429, 0.20089286]])
Run Code Online (Sandbox Code Playgroud)
请让我知道哪个是正确的。
我正在尝试构建一个马尔可夫生成器,它为字符串链接任意长度作为编程练习,但我发现了一个我似乎无法修复的错误.当我运行markov函数时,我得到列表索引超出范围.
我觉得我忽略了一些明显的东西,但我不确定是什么.追溯说错误是在第41行,有words[-1] = nextWords[random.randint(0, len(nextWords)-1)]
.
完整代码如下,对不起,如果缩进被搞砸了.
#! /usr/bin/python
# To change this template, choose Tools | Templates
# and open the template in the editor.
import random
class Markov(object):
def __init__(self, open_file):
self.cache = {}
self.open_file = open_file
open_file.seek(0)
self.wordlist = open_file.read().split()
def get_random_list(self, length):
i = random.randint(0, len(self.wordlist) - (length - 1))
result = self.wordlist[i:i + length]
return result
def find_next_word(self, words):
candidates = []
for i in range(len(self.wordlist) - len(words)):
if self.wordlist[i:i + len(words)] == words …
Run Code Online (Sandbox Code Playgroud) 假设有一系列观察,例如[1,2,3,5,5,5,2,3,2,3, ..., 3, 4]
.我试图在Scikit中使用HMM的当前实现 - 学习预测该观察序列的下一个值.我有2个问题.
给定一系列观察,我如何预测下一次观察(如上所述)?
鉴于n个观察的许多序列和那些序列的n + 1个观察,HMM可以用于预测n个观察的新序列的第(n + 1)个观察吗?如果是这样的话?
我从文档中无法理解这一点.
我发现可能有重复,但没有说明如何在Scikit中使用HMM - 学习预测序列中的下一个值.
machine-learning markov prediction hidden-markov-models scikit-learn
在我的学习路径上,我被一项任务困住了。
对于二项式分布 X?Bp,n,均值为 ?=np 且方差为 ?**2=np(1?p)
,我们希望为概率设置上限 P(X?c??) for c?1
。引入了三个边界:
任务是分别为每个不等式编写三个函数。它们必须 将上述马尔可夫、切比雪夫和切尔诺夫不等式n , p and c
的上界作为输入并返回 P(X?c?np)
作为输出。
还有一个IO的例子:
代码:
print Markov(100.,0.2,1.5)
print Chebyshev(100.,0.2,1.5)
print Chernoff(100.,0.2,1.5)
Output
0.6666666666666666
0.16
0.1353352832366127
Run Code Online (Sandbox Code Playgroud)
我完全被困住了。我只是不知道如何将所有这些数学插入到函数中(或者如何在这里进行算法思考)。如果有人可以帮助我,那将是非常有帮助的!
除 math.exp 外,任务条件不允许使用 ps 和所有库
我有C++类的第二个任务,其中包括马尔可夫链.赋值很简单但是我无法弄清楚从文件中读取字符时最佳实现是什么.
我有一个大约300k的文件.赋值的一个规则是使用Map和Vector类.在Map中(键只是字符串),值将是Vectors.当我从文件中读取时,我需要开始收集密钥对.
例:
File1.txt
1234567890
1234567890
Run Code Online (Sandbox Code Playgroud)
如果选择Markov k = 3,我应该在我的Map中:
key vector
123 -> 4
456 -> 7
789 -> 0
0/n1 -> 2
234 -> 5
567 -> 8
890 -> /n
/n -> NULL
Run Code Online (Sandbox Code Playgroud)
教授的建议是用char读取char,所以我的算法如下
while (readchar != EOF){
tempstring += readchar
increment index
if index == Markovlevel {
get nextchar if =!EOF
insert nextchar value in vector
insert tempstring to Map and assign vector
unget char
}
}
Run Code Online (Sandbox Code Playgroud)
我省略了一些其他细节.我的主要问题是,如果我有318,000个字符,我每次都会做有条件的,这会大大减慢我的电脑速度(全新的MAC专业版).教授的示例程序在大约5秒内执行该文件.
我无法弄清楚在C++中从文本文件中读取固定长度单词的最佳方法是什么.
谢谢!
markov ×8
python ×3
matrix ×2
c++ ×1
chain ×1
clojure ×1
data-science ×1
hashmap ×1
numpy ×1
prediction ×1
probability ×1
python-2.x ×1
r ×1
scikit-learn ×1
scipy ×1
statistics ×1
string ×1
transition ×1