动态规划思想

1.动态规划思想:因为计算量太大而提出的解放方式。将一件大的事情分成若干个小的事情。
2.找一个最优的隐藏序列,结合动态规划思想,可以把这个隐藏序列分成多个时间步,如果每个时间步都是最优的,那么最终的这个序列就是最优的。
3.HMM学习方式:
        有标签:统计学习
        无标签:EM学习
import jieba
import jieba.posseg as psg
mstr= ' 我爱北京天安门 '
for i in jieba.cut(mstr):
print(i)
#词性标注怎么做的?
#可以使用dict中的标号的词性,包含所有的中文词?
#如果切出来的词以后不在dict中,使用HMM
for i in jieba.cut (mstr, cut_all = True ): # 精准分词
print (i)
HMM常用的三种模型
1.GaussianHMM 观测状态连续型且符合高斯分布
2.GMMHMM 观测状态连续型且符合混合高斯分布
3.MultinomialHMM 观测状态离散型
MultinoialHMM为例:
对于 MultinomialHMM的模型,使用比较简单,"startprob_"参数对应我们的隐藏状态初始分布 Π  , "transmat_"对应我们的状态转移矩阵A, "emissionprob_"对应我们的观测状态概率矩阵B。
HMM总结
1.概率图模型
2.齐次马尔可夫假设
3.生成式和判别式
4.序列标注问题
5.隐马五元组
6.隐马参数
7.隐马模型结构
8.隐马解决的问题
9.动态规划思想
10.viterbi
11.代码

动态规划为什么可以较少复杂度?

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

 

#思路:动态规划

#本质上就是求不相邻数字的最大和

class Solution:

    def rob(self, nums):

        """

        :type nums: List[int]

        :rtype: int

        """

        if len(nums)==0:

            return 0

        dp=[0]*len(nums)

        dp[0]=nums[0]

        if len(nums)==1:

            return dp[0]

        dp[1]=max(dp[0],nums[1])

        #状态转移方程 时复杂度O(n)

        for i in range(2,len(nums)):

            dp[i]=max(dp[i-1],dp[i-2]+nums[i])

        return dp[len(nums)-1]

你可能感兴趣的:(动态规划,算法)