随机条件场—概率计算问题、IIS/GD学习算法、维特比预测算法

这一章的算法不是很好写,整整研究了好几天,代码还是有点小问题,仅供参考。
用的是书上定义的特征函数。

import numpy as np
class CRF:def __init__(self,y=None,x=None,y_num=None,x_num=None,N=None):self.y = yself.x = xself.y_num = y_numself.x_num = x_numself.N = Nself.get_feature()self.build_Marix(self.x[0])def get_feature(self):self.ti = [lambda y_1, y, x, i: 1 if i == 2 and y_1 == 1 and y == 2 else 0,lambda y_1, y, x, i: 1 if i == 3 and y_1 == 1 and y == 2 else 0,lambda y_1, y, x, i: 1 if i == 2 and y_1 == 1 and y == 1 else 0,lambda y_1, y, x, i: 1 if i == 3 and y_1 == 2 and y == 1 else 0,lambda y_1, y, x, i: 1 if i == 2 and y_1 == 2 and y == 1 else 0,lambda y_1, y, x, i: 1 if i == 3 and y_1 == 2 and y == 2 else 0,]self.w_ti = [1,1,0.6,1,1,0.2]self.si = [lambda y_1, y, x, i: 1 if i == 1 and y == 1 else 0,lambda y_1, y, x, i: 1 if i == 1 and y == 2 else 0,lambda y_1, y, x, i: 1 if i == 2 and y == 2 else 0,lambda y_1, y, x, i: 1 if i == 2 and y == 1 else 0,lambda y_1, y, x, i: 1 if i == 3 and y == 1 else 0,lambda y_1, y, x, i: 1 if i == 3 and y == 2 else 0,]self.w_si = [1,0.5,0.5,0.8,0.8,0.5]self.fk = self.ti+self.siself.wk = self.w_ti+self.w_sidef build_Marix(self,x):self.Marix = np.zeros((self.N+1,self.y_num,self.y_num))for i in range(self.N+1):for n in range(self.y_num):if i == self.N:self.Marix[i][:,0] = 1breakfor m in range(self.y_num):for k in range(len(self.fk)):if i == 0:if n==0:self.Marix[i][0][m] += self.wk[k] * (self.fk[k](0,m+1,x[i],i+1))else:self.Marix[i][n][m] += self.wk[k] * (self.fk[k](n+1,m+1,x[i],i+1))self.Marix = np.exp(self.Marix)def get_aiT(self):self.aiT = np.zeros((self.N+1,self.y_num))self.aiT[0,:] = 1for i in range(1,self.N+1):self.aiT[i] = self.aiT[i-1].dot(self.Marix[i])def get_biT(self):self.biT = np.zeros((self.N + 1, self.y_num))self.biT[self.N,:] = 1for i in range(self.N-1,-1,-1):self.biT[i] = self.Marix[i+1].dot(self.biT[i+1])#--------概率计算问题---------------def predict_Py_i(self,i,yi):self.get_aiT()self.get_biT()return self.aiT[i][yi-1]*self.biT[i][yi-1]/np.sum(self.aiT[self.N])def compute_p(self,y):result = 1for i in range(self.N):if i == 0:Z = self.Marix[i]result *= self.Marix[i][0][y[i]-1]else:Z =  Z.dot(self.Marix[i])result *= self.Marix[i][y[i-1]-1][y[i]-1]return result/np.sum(Z)#----------维特比预测算法-------------------------def Viterbi(self,x):p_marix = np.zeros((len(x),self.y_num))rout = [[0] for i in range(self.y_num)]for j in range(self.y_num):p_marix[0][j] = np.sum(np.array([f(0,j+1,x[0],1) for f in self.fk])*self.wk)for i in range(1,len(x)):for l in range(self.y_num):max = 0rout_tem = 0for j in range(self.y_num):wf = p_marix[i - 1][j] + np.sum(np.array([f(j+1, l+1, x[i], i + 1) for f in self.fk]) * self.wk)if wf > max:max = wfrout_tem = jp_marix[i][l] = maxrout[l].append(rout_tem)max_result = np.max(p_marix[len(x)-1])max_index = list(p_marix[len(x)-1]).index(np.max(p_marix[len(x)-1]))rout[max_index].append(max_index)return max_result,[i+1 for i in rout[max_index][1:]]# -----------学习算法--------------------------------def compute_pxy_f(self):#pfklist_pxyti = np.zeros(len(self.ti))list_pxysi = np.zeros(len(self.si))#p_fklist_countti = np.zeros(len(self.ti))list_countsi = np.zeros(len(self.si))for x,y in zip(self.x,self.y):self.build_Marix(x)self.get_aiT()self.get_biT()for i in range(len(x)):list_temp = np.zeros(len(self.ti))for k in range(len(self.ti)):if i == 0:right = 1*self.Marix[0][0][y[i]-1]*self.biT[0][y[i]-1]left = self.ti[k](i,y[i],x[i],i+1)list_temp[k] += left*right/np.sum(self.aiT[self.N])else:right = self.aiT[i][y[i-1]-1] * self.Marix[i][y[i-1]-1][y[i]-1]*self.biT[i][y[i]-1]left = self.ti[k](y[i-1],y[i],x[i],i+1)list_temp[k] += left*right/np.sum(self.aiT[self.N])if left == 1:list_countti[k] += 1list_pxyti += list_tempfor i in range(len(x)):list_temp = np.zeros(len(self.si))for k in range(len(self.si)):right = self.aiT[i][y[i]-1]*self.biT[i][y[i]-1]left = self.si[k](y[i-1], y[i], x[i], i+1)list_temp[k] += left * right / np.sum(self.aiT[self.N])if left == 1:list_countsi[k] += 1list_pxysi += list_tempreturn list_countti/len(self.x),list_countsi/len(self.x),list_pxyti/len(self.x),list_pxysi/len(self.x)def compute_fw(self):left = 0right = 0for x in self.x:self.build_Marix(x)self.get_aiT()left += np.log(np.sum(self.aiT[self.N]))for x, y in zip(self.x, self.y):for i in range(len(x)):for k in range(len(self.fk)):if i == 0:right += self.wk[k] * self.fk[k](0,y[i],x[i],i+1)else:right += self.wk[k] * self.fk[k](y[i-1], y[i], x[i], i+1)return (left - right)/len(self.x)def fit(self,max_iter=3,how='IIS',lr=0.001):self.w_ti = [0]*len(self.ti)self.w_si = [0]*len(self.si)self.wk = self.w_ti + self.w_siself.x = np.array(self.x)self.y = np.array(self.y)if how == 'IIS':S = 20for i in range(max_iter):ep_tk,ep_sk,eptk,epsk = self.compute_pxy_f()if np.linalg.norm(1/S*np.log(ep_tk/eptk), ord=2)+np.linalg.norm(1/S*np.log(ep_sk/epsk),ord=2) < 0.1:print('when iter is '+str(i)+' shoulian')breakself.w_ti += 1/S*np.log(ep_tk/eptk)self.w_si += 1/S*np.log(ep_sk/epsk)self.wk = list(self.w_ti) + list(self.w_si)#按着最大熵模型的公式写的,用EP - E_P为倒数,不知道对不对elif how == 'GD':for i in range(max_iter):ep_tk,ep_sk,eptk,epsk = self.compute_pxy_f()gt = eptk - ep_tkgs = epsk - ep_skfanshut = np.linalg.norm(gt,ord=2)fanshus = np.linalg.norm(gs,ord=2)if fanshut + fanshus < 0.75:print('when iter is '+str(i)+' shoulian')breaktemp_w_ti = self.w_titemp_w_si = self.w_sifw_list = []#线性搜索这里有问题,fw会一直缩小,因该是fw的计算出现了错误for k in range(20):self.w_ti = temp_w_ti - lr * gt * kself.w_si = temp_w_si - lr * gs * kself.wk = list(self.w_ti) + list(self.w_si)fw = self.compute_fw()fw_list.append(fw)min_index = fw_list.index(min(fw_list))deta_wti = gt * lr * min_indexdeta_wsi = gs * lr * min_indexself.w_ti = temp_w_ti - deta_wtiself.w_si = temp_w_si - deta_wsiself.wk = list(self.w_ti) + list(self.w_si)def main():y = [[1,2,2],[2,1,1],[1,1,1],[1,2,2],[2,2,2],[2,1,2],[1,1,2],[1,2,1],[1,2,2],[1,2,2],[1,2,2],[1,2,2]]x = [[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]]CRF_test = CRF(y=y,y_num=2,N=3,x=x)print(CRF_test.Marix)print(CRF_test.compute_p(y[0]))print(CRF_test.predict_Py_i(2,1))print(CRF_test.Viterbi(x[0]))CRF_test.fit(50, how='IIS')print(CRF_test.wk)CRF_test.fit(500,how='GD',lr=0.001)print(CRF_test.wk)if __name__ == '__main__':main()#---------result--------------------
usr/bin/python3 /Users/zhengyanzhao/PycharmProjects/tongjixuexi/shixian2/CRF.py
[[[2.71828183 1.64872127][1.         1.        ]][[4.05519997 4.48168907][6.04964746 1.64872127]][[2.22554093 4.48168907][6.04964746 2.01375271]][[2.71828183 1.        ][2.71828183 1.        ]]]
0.06486783542907915
0.5082915274316868
(4.3, [1, 2, 1])
when iter is 11 shoulian
[0.18764402126707205, 0.23235841506946808, 0.21344554371583913, 0.20112964244479178, 0.24547679607078648, 0.20600431503056774, 0.3669918383125717, 0.39593684451308797, 0.385216372799946, 0.377295537944856, 0.3971223364931556, 0.3658935638684794]
when iter is 64 shoulian
[0.23036225378918423, 0.0846981674992883, 0.0935981916969745, 0.03945814811020889, 0.0812481327750673, 0.16101306581281896, 0.43884913282239046, 0.15771695572586986, 0.37418378149743614, 0.2182414425846152, 0.16699382351353245, 0.4110185294594026]Process finished with exit code 0

统计学习方法第十一章作业:随机条件场—概率计算问题、IIS/GD学习算法、维特比预测算法 代码实现相关推荐

  1. 统计学习方法第二十一章作业:PageRank迭代算法、幂法、代数算法 代码实现

    PageRank迭代算法.幂法.代数算法 import numpy as npclass PageRank:def __init__(self,M,D=0.85):self.M = np.array( ...

  2. 统计学习方法第三章作业:一般k邻近、平衡kd树构造、kd树邻近搜索算法代码实现

    一般k邻近 import numpy as np import matplotlib.pyplot as pltclass K_near:def __init__(self,X,Y,K=5,p=2): ...

  3. 统计学习方法第十七章作业:LSA潜在语义分析算法 代码实现

    LSA潜在语义分析算法 import numpy as np import jieba import collectionsclass LSA:def __init__(self,text_list) ...

  4. 统计学习方法第七章作业:SVM非线性支持向量机之SMO序列最小优化算法代码实现

    SMO序列最小优化算法 import numpy as np import math from sklearn.metrics import accuracy_score from sklearn.m ...

  5. 统计学习方法第六章作业:逻辑斯谛梯度下降法、最大熵模型 IIS / DFP 算法代码实现

    逻辑斯谛梯度下降法 import numpy as np import matplotlib.pyplot as pltclass logist:def __init__(self,a=1,c=Non ...

  6. 统计学习方法第五章作业:ID3/C4.5算法分类决策树、平方误差二叉回归树代码实现

    ID3/C4.5算法分类决策树 import numpy as np import math class Node:def __init__(self,feature_index=None,value ...

  7. 统计学习方法第十章作业:HMM模型—概率计算问题、Baum-Welch学习算法、维特比预测算法 代码实现

    HMM模型 import numpy as npclass HMM:def __init__(self,A=None,B=None,Pi=None,O = None):if A:self.A = np ...

  8. 统计学习方法笔记第二章-感知机

    统计学习方法笔记第二章-感知机 2.1 感知机模型 2.2感知机学习策略 2.2.1数据集的线性可分型 2.2.2感知机学习策略 2.3感知机学习算法 2.3.1感知机算法的原始形式 2.3.2算法的 ...

  9. 统计学习方法——第1章(个人笔记)

    统计学习方法--第1章 统计学习及监督学习概论 <统计学习方法>(第二版)李航,学习笔记 1.1 统计学习 1.特点 (1)以计算机及网络为平台,是建立在计算机及网络上的: (2)以数据为 ...

最新文章

  1. 每日一套szuManthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)
  2. android fastjson漏洞_亲手带你 Debug Fastjson 的安全漏洞
  3. 如何使用计算机中的导出,如何将iPhone手机中的音乐导出至电脑
  4. android textview表情,Android开发(16)-TextView显示表情图像和文字
  5. 汇编语言中常用指令对标志位寄存器的影响
  6. “宅家十大热销商品”榜单:确认过眼神,都是自己剪头发的人
  7. Python 资源库大全
  8. mysql gis index 索引原理_从原理到优化,深入浅出数据库索引
  9. 洛谷 1541 乌龟棋——dp
  10. 第四课--AMP架构双核应用程序开发和软中断处理(二)
  11. python串口模块找不到_有没有python的串口库
  12. ubuntu安装vasp_Ubuntu常用软件的安装
  13. Unity 动态切换天空盒\反射天空盒材质
  14. MD5摘要算法的几种解密方法,分享md5免费解密网站
  15. 如何低格台式计算机的硬盘,低级格式化,教您硬盘如何进行低级格式化
  16. 强力推荐一款游戏十分好玩
  17. 什么是嵌入式系统?嵌入式系统应该如何学习?
  18. 网络嗅探与欺骗----函数sniff()、ARP的原理、ARP欺骗、AARP欺骗的中间人攻击
  19. 2019年第十届蓝桥杯JAVAB组-----试题 J: 分考场
  20. CAD Voronoi 生成插件 V2

热门文章

  1. 开发高性能JAVA应用程序基础(内存篇)
  2. 【python】xsspider零碎知识点
  3. 【BZOJ1031】[JSOI2007]字符加密Cipher 后缀数组
  4. CentOS 6.5 升级 PHP 到5.6
  5. 如何循序渐进向DotNet架构师发展
  6. linux 命令提示符 时间,在LINUX的命令提示符及CMD命令提示符中显示时间
  7. my.ini修改后服务无法启动_VisualSVN Server 自助修改密码页面
  8. 中药免疫肿瘤学数据库,TCMIO使用指南
  9. C语言 | C语言实现高精度加法——数组加法(附源代码)
  10. php input file ajax,jquery ajax put file, php save file