顺序数据:状态空间模型

http://blog.csdn.net/pipisorry/article/details/4397356

顺序数据

之前注意力集中在数据集里的数据点是独立同分布的情形。这个假设使得我们将似然函数表示为在每个数据点处计算的概率分布在所有数据点上的乘积。

然而,对于许多应用来说,独立同分布的假设不成立。考虑这样的数据集中的一个重要的类型,即描述了顺序数据的数据集。这些数据集通常产生于沿着时间序列进行的测量,例如某个特定位置的连续若干天的降水量测量,或者每天汇率的值,或者对于语音识别任务,在连续的时间框架下的声学特征。顺序数据也可以在时间序列以外的问题中出现,例如一段 DNA 上的碱基对序列,或者一个英语句子中的字符序列。这里研究的模型同样适用于所有形式的顺序数据,而不仅仅是时间序列数据。

顺序分布

静止顺序分布和非静止顺序分布。在静止分布中,数据会随着时间发生变化,但是生成数据的概率分布保持不变。对于更复杂的非静止分布的情形,生成概率本身会随着时间变化。这里,我们关注的是静止分布的情形。

独立同分布建模

处理顺序数据的最简单的方式是忽略顺序的性质,将观测看做独立同分布,对应于图13.2所示的图。然而,这种方法无法利用数据中的顺序模式,例如序列中距离较近的观测之间的相关性。

 

某小皮

 

 

 

马尔科夫模型( Markov model )

为了在概率模型中表示这种效果,我们需要放松独立同分布的假设。完成这件事的一种最简单的方式是考虑马尔科夫模型( Markov model )。

马尔科夫模型( Markov model )表示观测序列的联合概率分布

一阶马尔科夫链( first-order Markov chain )模型中, N 次观测的序列的联合概率分布为

根据 d -划分的性质,给定时刻 n 之前的所有观测,我们看到观测 x n 的条件概率分布为

 

[马尔科夫模型 Markov model ]

 

某小皮

 

 

但是如果我们希望构造任意阶数的不受马尔科夫假设限制的序列模型,同时能够使用较少数量的自由参数确定。我们可以引入额外的潜在变量来使得更丰富的一类模型能够从简单的成分中构建。

状态空间模型

对于每个观测 x n ,我们引入一个对应的潜在变量 z n (类型或维度可能与观测变量不同)。我们现在假设潜在变量构成了马尔科夫链,得到的图结构被称为状态空间模型( state space model ),如图13.5所示。

状态空间模型满足下面的关键的条件独立性质,即给定 z n 的条件下, z n−1 和 z n+1 是独立的,从而

状态空间模型的联合概率分布

状态空间模型的两个最重要的例子

对于顺序数据来说,图13.5描述了两个重要的模型。

隐马尔可夫模型( hidden Markov model ),其中潜在变量是离散的。注意, HMM 中的观测变量可以是离散的或者是连续的,并且可以使用许多不同的条件概率分布进行建模。[HMM:隐马尔可夫模型HMM ]

线性动态系统( linear dynamical system ),其中潜在变量和观测变量都是高斯变量(结点的条件概率分布对于父结点的依赖是线性高斯的形式)。[线性动态系统 linear dynamical system]

这两个模型都使用具有树结构(没有环)的有向图描述,这样就可以使用加和-乘积算法来高效地进行推断。

某小皮

 

 

条件随机场CRF

[条件随机场CRF - 表示 ]

 

某小皮

 

 

 

朴素贝叶斯、LR、CRF、HMM之间的联系

Sutton, Charles, and Andrew McCallum. "An introduction to conditional random fields." Machine Learning 4.4 (2011): 267-373.

Note: 图中LR可以换成ME(最大熵模型),毕竟是ME的特例。

lz的理解是:NB对P(y|x)的建模是通过计算P(x|y)和P(y)的概率实现的,是独立的;

LR直接对P(y|x)建模,对y的建模是在x的条件下的,所以NB条件化就是LR。且类似CRF,直接分解为p(y | x) = 1/Z(x) * exp( theta * x) (多类LR softmax),其中的无向图分解的势函数为exp( theta * x),对应图中的小方块。

HMM是先通过对p(y2 | y1)建模,再通过对p (x | y2)建模,从而对p(y | x)建模的,所以NB序列化就是HMM;

CRF是在给定x情况下,直接对P(y | x)建模 ,相对LR来说,多考虑了y之前的关系(t特征函数),所以是LR的序列化;且是HMM的条件化(给定x)。

统计模型之间的比较:[条件随机场CRF - 表示:CRF与其它模型的比较]

[统计模型之间的比较,HMM,最大熵模型,CRF条件随机场]

朴素贝叶斯和逻辑回归有以下几点不同

(1)     Naive Bayes是一个生成模型,在计算P(y|x)之前,先要从训练数据中计算P(x|y)和P(y)的概率,从而利用贝叶斯公式计算P(y|x)。

         Logistic Regression是一个判别模型,它通过在训练数据集上最大化判别函数P(y|x)学习得到,不需要知道P(x|y)和P(y)。即LR在给定x下条件直接对y建模,而NB是使用贝叶斯公式,对y建模,没有x的条件。

(2)    Naive Bayes是建立在条件独立假设基础之上的,设特征X含有n个特征属性(X1,X2,...Xn),那么在给定Y的情况下,X1,X2,...Xn是条件独立的。

      Logistic Regression的限制则要宽松很多,如果数据满徐条件独立假设,Logistic Regression能够取得非常好的效果;当数据不满度条件独立假设时,Logistic Regression仍然能够通过调整参数让模型最大化的符合数据的分布,从而训练得到在现有数据集下的一个最优模型。

 (3)    当数据集比较小的时候,应该选用Naive Bayes,为了能够取得很好的效果,数据的需求量为O(log n)

          当数据集比较大的时候,应该选用Logistic Regression,为了能够取得很好的效果,数据的需求量为O( n)

    Naive Bayes运用了比较严格的条件独立假设,为了计算P(y|x),我们可以利用统计的方法统计数据集中P(x|y)和P(y)出现的次数,从而求得P(x|y)和P(y)。因而其所需的数据量要小一些,为O(log n).

     Logistic Regression在计算时,是在整个参数空间进行线性搜索的,需要的数据集就更大,为O( n)。

[朴素贝叶斯 VS 逻辑回归 区别]

from:http://blog.csdn.net/pipisorry/article/details/43973567

ref:

 

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import tensorflow as tf import numpy as np import gym # 创建 CartPole 游戏环境 env = gym.make('CartPole-v1') # 定义神经网络模型 model = tf.keras.models.Sequential([ tf.keras.layers.Dense(24, activation='relu', input_shape=(4,)), tf.keras.layers.Dense(24, activation='relu'), tf.keras.layers.Dense(2, activation='linear') ]) # 定义优化器和损失函数 optimizer = tf.keras.optimizers.Adam() loss_fn = tf.keras.losses.MeanSquaredError() # 定义超参数 gamma = 0.99 # 折扣因子 epsilon = 1.0 # ε-贪心策略中的初始 ε 值 epsilon_min = 0.01 # ε-贪心策略中的最小 ε 值 epsilon_decay = 0.995 # ε-贪心策略中的衰减值 batch_size = 32 # 每个批次的样本数量 memory = [] # 记忆池 # 定义动作选择函数 def choose_action(state): if np.random.rand() < epsilon: return env.action_space.sample() else: Q_values = model.predict(state[np.newaxis]) return np.argmax(Q_values[0]) # 定义经验回放函数 def replay(batch_size): batch = np.random.choice(len(memory), batch_size, replace=False) for index in batch: state, action, reward, next_state, done = memory[index] target = model.predict(state[np.newaxis]) if done: target[0][action] = reward else: Q_future = np.max(model.predict(next_state[np.newaxis])[0]) target[0][action] = reward + Q_future * gamma model.fit(state[np.newaxis], target, epochs=1, verbose=0) # 训练模型 for episode in range(1000): state = env.reset() done = False total_reward = 0 while not done: action = choose_action(state) next_state, reward, done, _ = env.step(action) memory.append((state, action, reward, next_state, done)) state = next_state total_reward += reward if len(memory) > batch_size: replay(batch_size) epsilon = max(epsilon_min, epsilon * epsilon_decay) print("Episode {}: Score = {}, ε = {:.2f}".format(episode, total_reward, epsilon))next_state, reward, done, _ = env.step(action) ValueError: too many values to unpack (expected 4)优化代码
05-24
问题出现在最后一个环节中。根据 OpenAI Gym 的文档,CartPole-v1 环境的 step() 函数返回的是四个值,分别是下一个状态、本次动作的奖励、游戏是否结束和一些额外信息。而在原始代码中,使用了一个 _ 变量来占位,但实际上返回的值个数超过了 4,导致程序报错。解决这个问题的方法是将 _ 变量改成一个列表变量,如下所示: ```python next_state, reward, done, info = env.step(action) ``` 同时,建议将神经网络模型的优化器改成 RMSprop,这是一个更加适合强化学习问题的优化器。最后,为了更好地观察训练效果,可以将每个回合的得分输出到日志中,而不是只输出最后一个回合的得分。下面是修改后的代码: ```python import tensorflow as tf import numpy as np import gym # 创建 CartPole 游戏环境 env = gym.make('CartPole-v1') # 定义神经网络模型 model = tf.keras.models.Sequential([ tf.keras.layers.Dense(24, activation='relu', input_shape=(4,)), tf.keras.layers.Dense(24, activation='relu'), tf.keras.layers.Dense(2, activation='linear') ]) # 定义优化器和损失函数 optimizer = tf.keras.optimizers.RMSprop(learning_rate=0.001) loss_fn = tf.keras.losses.MeanSquaredError() # 定义超参数 gamma = 0.99 # 折扣因子 epsilon = 1.0 # ε-贪心策略中的初始 ε 值 epsilon_min = 0.01 # ε-贪心策略中的最小 ε 值 epsilon_decay = 0.995 # ε-贪心策略中的衰减值 batch_size = 32 # 每个批次的样本数量 memory = [] # 记忆池 # 定义动作选择函数 def choose_action(state): if np.random.rand() < epsilon: return env.action_space.sample() else: Q_values = model.predict(state[np.newaxis]) return np.argmax(Q_values[0]) # 定义经验回放函数 def replay(batch_size): batch = np.random.choice(len(memory), batch_size, replace=False) for index in batch: state, action, reward, next_state, done = memory[index] target = model.predict(state[np.newaxis]) if done: target[0][action] = reward else: Q_future = np.max(model.predict(next_state[np.newaxis])[0]) target[0][action] = reward + Q_future * gamma model.fit(state[np.newaxis], target, epochs=1, verbose=0, optimizer=optimizer, loss=loss_fn) # 训练模型 for episode in range(1000): state = env.reset() done = False total_reward = 0 while not done: action = choose_action(state) next_state, reward, done, info = env.step(action) memory.append((state, action, reward, next_state, done)) state = next_state total_reward += reward if len(memory) > batch_size: replay(batch_size) epsilon = max(epsilon_min, epsilon * epsilon_decay) print("Episode {}: Score = {:.2f}, ε = {:.2f}".format(episode, total_reward, epsilon)) ``` 注意,由于 RMSprop 的学习率比 Adam 更小,因此需要将其设为 0.001。如果学习率太高,会导致训练不稳定或不收敛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值