机器学习笔记整理[第1天]

(1) 马尔科夫链定义:每个状态的转移概率依赖于之前的n个状态,这个过程被称为1个n阶的模型。n是影响状态转移的数目,每个状态的转移只依赖于之前的那一个状态,那就是马尔科夫过程的1阶过程。
如下:
机器学习笔记整理[第1天]
分为三个部分:1.状态;2.初始向量 3.状态转移矩阵

隐马尔科夫过程:可观测到的状态序列和隐藏的状态序列时概率相关的,这种过程建模为一个隐藏的马尔科夫过程和一个与这个隐藏的马尔科夫过程是概率相关但是可观测到的状态集合(可观测状态不是马尔科夫过程,隐状态是马尔科夫过程),这就是隐马模型。
示意图:
机器学习笔记整理[第1天]
隐马模型的三大问题:

1.给定输出序列O=O1,O2,O3,O4,....,OTO=O_1,O_2,O_3,O_4,....,O_T and 隐马参数λ=(A,B,π)\lambda =(A,B,\pi),计算p(O/λ)p(O/\lambda)(指定参数下输出指定序列概率)
2.给定输出序列O=O1,O2,O3,O4,....,OTO=O_1,O_2,O_3,O_4,....,O_T and参数 λ=(A,B,π)\lambda =(A,B,\pi),计算O=q1,q2,q3,...,qTO=q_1,q_2,q_3,...,q_T(计算隐马模型的最可能出现的隐状态序列)
3.给定输出序列O=O1,O2,O3,O4,....,OTO=O_1,O_2,O_3,O_4,....,O_T ,求解出隐马参数λ=(A,B,π)\lambda=(A,B,\pi)来最大化p(O/λ)p(O/\lambda),使得输出这个序列的可能性最大(隐状态未知);
三大问题求解参考李航《统计学习与方法》,里面讲解较为详细。
隐马模型应用:
词性标注:w1w2w3,...,wNw_1w_2w_3,...,w_N标注为t1t2t3,...,tNt_1t_2t_3,...,t_N
w表示单词,t表示词性;
在一篇文章中,我们计算单词序列w出现的概率大小,对于该单词序列的众多词性序列表示t,我们利用贝叶斯公式,求出众多词性序列中,最大可能性的词性标注序列即可。
利用贝叶斯公式:

findp(t1t2...tNw1w2...wN)=p(t1t2...tN)p(w1w2...wNt1t2...tN)p(w1w2...wN)p(t_1t_2...t_N|w_1w_2...w_N)=\frac{p(t_1t_2...t_N)*p(w_1w_2...w_N|t_1t_2...t_N)}{p(w_1w_2...w_N)}

其中:p(t1t2...tNw1w2...wN)p(t_1t_2...t_N|w_1w_2...w_N)表示每个词性序列在已知单词序列时出现的可能性;p(w1w2...wN)p(w_1w_2...w_N)可忽略,因为针对所有词性序列来讲,其具有相同的单词共现概率。

其中:p(t1t2...tN)=i=1Np(titi1...t1)i=1Np(titi1)p(t_1t_2...t_N)=\prod_{i=1}^{N}p(t_i|t_i-1...t_1)\approx \prod_{i=1}^{N}p(t_i|t_{i-1}),表示词性共现概率大小;

p(w1w2...wNt1t2t3...tN)=i=1Np(wiwi1...w1,t1t2...tN)i=1Np(witi)p(w_1w_2...w_N|t_1t_2t_3...t_N)=\prod_{i=1}^{N}p(w_i|w_i-1...w_1,t_1t_2...t_N)\approx \prod_{i=1}^{N}p(w_i|t_i),表示给定词性标注序列,其单词共现的概率大小。

词性标注可解决的问题是HMM问题中的第2个问题,也就是给定输出序列(单词序列),根据模型参数,输出最可能出现的隐状态序列Q(词性序列)。根据词性标注贝叶斯公式可知:p(tags/words)p(tags/words)正比于p(ti/ti1)p(wi/ti)p(t_i/t_{i-1})*p(w_i/t_i)

(2)离散特征处理如何在特征工程中处理?

离散特征进行one-hot 编码后,离散特征值不同值的个数就是热编码后该特征对应的维度数,相对应维度上的值为1,不对应这个维度的值为0,这样的话,转化后的每一维特征都可以看作连续特征,这样对连续值特征进行归一化就可以将其转化到[-1,1]或者标准化为均值为0,方差为1的数据。

(3)Python中的*args是什么意思?

理解为输入只有一列的表格,长度不确定;**kwargs表示为字典,长度也不固定。

(4)C++中的NULL表示为空值,需要进行特征工程中数据的填充才可以处理,空值表示不存在,不能用来计数和比较。

与C不同的是,在python中是没有NULL的,取而代之的是None,它的含义是为空,但要注意和空列表与空字符串是不一样的,None的类型是Nonetype。np.nan可以和其他整数进行比较,只是不算做和他们进行比较(就是直接忽略,但是不会出错),若是直接让NULL和整数进行比较的话,会直接出错。

策略:Python 中的null不能直接转化为np.nan,需要借助整数转化:NULL->-1->np.nan。
机器学习笔记整理[第1天]
(5)C++采用语句:ListNode *Dummy =new ListNode(0)来新建链表,其中Dummy表示链表头指针。

用ListNode curr = Dummy来指定Dummy链表的头指针,这个指针可移动,curr=curr->next

未完待续。。。