精华内容
下载资源
问答
  • 本来想接着写关于web的东西,不过老师突然留了个作业,就是将几百条word上面的数据转化成表格的形式. 但是很尴尬的是…我居然不会用word… 不过,咱们好歹也是学过python的人,写一个这样的脚本很简单. 一.处理的数据的...

    本来想接着写关于web的东西,不过老师突然留了个作业,就是将几百条word上面的数据转化成表格的形式.
    但是很尴尬的是…我居然不会用word…
    不过,咱们好歹也是学过python的人,写一个这样的脚本很简单.

    一.处理的数据的示例

    首先需要的数据是这样的:
    在这里插入图片描述
    要求是将后面的数据转化成第一行的表格.如图.
    在这里插入图片描述

    二.脚本的构思

    首先,我们要将数据全部复制到一个新建的txt文件中.虽然python可以直接读取word文档,但是终究没有直接读取txt文件来的舒服.如图,这是我复制到txt文档以后的东西.
    data.txt
    在这里插入图片描述
    数据大概要有400多个.接着我们要想,如何处理这个数据?
    我先拿一行数据举例.

    1.将两行数据规范成一行

    假如我们的数据十分整齐,并且每一行都按照某个字符进行分割,之后在使用python里面的pyopenxl模块就可以添加到表格里了.
    因此,我们首先要对数据进行一下规范.如图,我们的最终目的就是将每一条数据规范成这样的形式.
    在这里插入图片描述
    对比原来的数据:
    在这里插入图片描述

    将原来分两行的数据规范成一行.
    想一想,该怎么做呢?
    很简单,我们读取这个文件,然后在读取的时候将第一行结尾的换行(’\n’)替换成空字符(’’)不就行了么?
    于是我们便得到了第一张图片的效果:
    在这里插入图片描述

    2.去掉多余的换行

    观察我们的数据:
    在这里插入图片描述
    我们会发现第一条数据和第二条数据多了一个让人难受的换行符.我们得想办法去掉.
    当然,我们只拿一行数据举例.
    我们的最终目的是这样的:
    在这里插入图片描述
    是为了消除数据一和数据二之间的回车
    .原理也很简单,就是在读取到第一个数据的最后一行的时候,把回车(’\n’)换成(’’)空字符就行了.

    3.处理多条数据

    我们学会了将一行数据进行处理,但是我们有将近400条数据,改怎么处理呢?
    相信有人已经想到了,那就是写一个循环,然后进行计算,先这样,在那样不就行了么?
    (原谅我懒的写了哈哈哈哈.后面我直接写代码你们就明白了)

    三.代码的实现

    对于数据我相信大部分人已经分析清楚了,所以我就将代码对应上面的每一步来进行实现.

    1.对文件进行读写

    代码如下

    f=open("data.txt","r")
    list=f.readlines()
    

    原理就不用说了吧?首先用读的方式打开文件,然后用readlines函数将文件内容按照行写成一个列表.
    开始我其实想用c来做这个脚本,但是c实现的话太麻烦了,光文件读写就得写十几行,所以还不如python来的快.

    2.处理数据

    这个就是比较核心的地方了.先上代码,然后我会解释.

    new_list=[]
    #这个空列表是下面要用的,我们的数据处理完就放在这个列表里面.
    for number in range(0,len(list),3):
        list[number]=list[number].replace("\n","")
        list[number+1]=list[number+1].replace("\n","")
        if len(list)!=1487:
            str=list[number]+list[number+1]+list[number+2]
            new_list.append(str)
        else:
            str=list[number]+list[number+1]
            new_list.append(str)
    

    1.循环

    先解释一下为什么循环要写成这样.

    for number in range(0,len(list),3):
    

    因为观察数据:
    在这里插入图片描述
    发现我们一个数据占用的是三行,我们要对这三行数据进行处理,我们的len(list)代表我们刚刚读取的数据,因此我们要让循环一次增长三行,这样就代表我们读取完一条数据了.

    2.换行符的处理

        list[number]=list[number].replace("\n","")
        list[number+1]=list[number+1].replace("\n","")
    

    这段代码是使用了replace函数,第一个参数是取代前的字符,第二个参数是取代后的字符,也就是我们刚才提到的是空字符.
    number变量用来记录行数的.
    第一段代码,因为我们一次性读取的是三行,所以每次的三行的第一行都是我们图中的数据:
    在这里插入图片描述
    所以,我们用replace直接替换最后的回车就行了.
    第二段代码同理.也是直接处理就行了.

    3.条件判断

        if len(list)!=1487:
            str=list[number]+list[number+1]+list[number+2]
            new_list.append(str)
        else:
            str=list[number]+list[number+1]
            new_list.append(str)
    

    为啥会有1487这个数字呢?是因为总共数据就有1487行.
    在这里插入图片描述
    我们对列表的操作是一次性跳3行,所以如果不在最后面加一个判断的话,会因为数字递增超过列表最大长度而错误.
    而else的这样写是因为我们最后1486行仅仅处理两行数据就行了,所以我就写成了这样.
    当然,记得要提前要写一个空列表,否则append函数是无法用的.

    4.将数据写到一个新建的excel表格中

    这个就需要使用我们的openpyxl模块了.没有的同学去网上搜一下怎么安装.我就直接上代码了,详细的解释我加在了注释里头.

    import openpyxl
    #导入模块
    workbook=openpyxl.Workbook()
    #新建一个工作薄
    sheet=workbook.active
    sheet.title="数据表"
    sheet['A1']="序号"
    sheet['B1']="业务类型"
    sheet['C1']="通话起始时间"
    sheet['D1']="通话时长"
    sheet['E1']="呼叫类型"
    sheet['F1']="对方号码"
    sheet['G1']="本机通话地"
    sheet['H1']="对方归属地"
    sheet['I1']="通话类型"
    sheet['J1']="通话费"
    sheet['K1']="其他费"
    sheet['L1']="小计"
    #在对应的行添加对应要求的内容
    

    这段代码放在开头.中间放开始那些代码.
    然后在最后,添加下面的代码:

    for i in new_list:
        i=i.split(",")
        #按照逗号进行分割数据
        sheet.append([i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[7],i[8],i[9],i[10]])
        #将分割好的数据添加到excel表格中
    workbook.save("话单数据.xlsx")
    #保存数据
    

    关于openpyxl模块我就不详细讲解了,有兴趣的同学可以百度一下.

    5.完整代码

    import openpyxl
    workbook=openpyxl.Workbook()
    sheet=workbook.active
    sheet.title="数据表"
    sheet['A1']="序号"
    sheet['B1']="业务类型"
    sheet['C1']="通话起始时间"
    sheet['D1']="通话时长"
    sheet['E1']="呼叫类型"
    sheet['F1']="对方号码"
    sheet['G1']="本机通话地"
    sheet['H1']="对方归属地"
    sheet['I1']="通话类型"
    sheet['J1']="通话费"
    sheet['K1']="其他费"
    sheet['L1']="小计"
    f=open("data.txt","r")
    list=f.readlines()
    new_list=[]
    for number in range(0,len(list),3):
        list[number]=list[number].replace("\n","")
        list[number+1]=list[number+1].replace("\n","")
        if len(list)!=1487:
            str=list[number]+list[number+1]+list[number+2]
            new_list.append(str)
        else:
            str=list[number]+list[number+1]
            new_list.append(str)
    for i in new_list:
        i=i.split(",")
        sheet.append([i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[7],i[8],i[9],i[10]])
    workbook.save("话单数据.xlsx")
    

    记得在同一目录下添加一个data.txt存放需要被处理的数据.
    运行完以后,同一目录下产生一个"话单数据.xlsx"文件.如图
    在这里插入图片描述

    好了,这就是这次关于python脚本的内容,相信大家已经学会了.
    对python有兴趣的可以加我qq:1392969921

    展开全文
  • quartz 持久数据库表格字段解释

    千次阅读 2014-05-13 11:55:48
    quartz 持久数据库表格字段解释  建表,SQL语句在quartz-1.6.6\docs\dbTables文件夹中可以找到,介绍下主要的几张表:  表qrtz_job_details: 保存job详细信息,该表需要用户根据实际情况初始  job_name:...

    quartz 持久化数据库表格字段解释

       建表,SQL语句在quartz-1.6.6\docs\dbTables文件夹中可以找到,介绍下主要的几张表:
           表qrtz_job_details: 保存job详细信息,该表需要用户根据实际情况初始化
           job_name:集群中job的名字,该名字用户自己可以随意定制,无强行要求
           job_group:集群中job的所属组的名字,该名字用户自己随意定制,无强行要求
           job_class_name:集群中个note job实现类的完全包名,quartz就是根据这个路径到classpath找到该job类
           is_durable:是否持久化,把该属性设置为1,quartz会把job持久化到数据库中
           job_data:一个blob字段,存放持久化job对象

           表qrtz_triggers: 保存trigger信息
           trigger_name: trigger的名字,该名字用户自己可以随意定制,无强行要求
           trigger_group:trigger所属组的名字,该名字用户自己随意定制,无强行要求
           job_name: qrtz_job_details表job_name的外键
           job_group: qrtz_job_details表job_group的外键
           trigger_state:当前trigger状态,设置为ACQUIRED,如果设置为WAITING,则job不会触发
           trigger_cron:触发器类型,使用cron表达式

           表qrtz_cron_triggers:存储cron表达式表
           trigger_name: qrtz_triggers表trigger_name的外键
           trigger_group: qrtz_triggers表trigger_group的外键
           cron_expression:cron表达式
          
           表qrtz_scheduler_state:存储集群中note实例信息,quartz会定时读取该表的信息判断集群中每个实例的当前状态
           instance_name:之前配置文件中org.quartz.scheduler.instanceId配置的名字,就会写入该字段,如果设置为AUTO,quartz会根据物理机名和当前时间产生一个名字
           last_checkin_time:上次检查时间
           checkin_interval:检查间隔时间

    步骤4:
          配置quartz.properties文件

    #调度标识名 集群中每一个实例都必须使用相同的名称 org.quartz.scheduler.instanceName = scheduler#ID设置为自动获取 每一个必须不同 org.quartz.scheduler.instanceId = AUTO#数据保存方式为持久化 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX#数据库平台 org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate #数据库别名 随便取org.quartz.jobStore.dataSource = myXADS#表的前缀 org.quartz.jobStore.tablePrefix = QRTZ_#设置为TRUE不会出现序列化非字符串类到 BLOB 时产生的类版本问题 org.quartz.jobStore.useProperties = true#加入集群 org.quartz.jobStore.isClustered = true#调度实例失效的检查时间间隔 org.quartz.jobStore.clusterCheckinInterval = 20000 #容许的最大作业延长时间 org.quartz.jobStore.misfireThreshold = 60000#ThreadPool 实现的类名 org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool#线程数量 org.quartz.threadPool.threadCount = 10#线程优先级 org.quartz.threadPool.threadPriority = 5#自创建父线程 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true #设置数据源org.quartz.dataSource.myXADS.jndiURL = CT#jbdi类名 org.quartz.dataSource.myXADS.java.naming.factory.initial = weblogic.jndi.WLInitialContextFactory #URLorg.quartz.dataSource.myXADS.java.naming.provider.url = t3://localhost:7001

    展开全文
  • Axure RP Pro - 相关中题 - 不支持最大化显示Popup窗口Axure RP Pro支持Open Linkin PopupWindow动作,还可以设置多个参数,但是这些参数中不包括最大化显示Popup窗口。如果最大化显示Popup窗口的目的是模拟Model...

    Axure RP Pro - 相关中题 - 不支持最大化显示Popup窗口

    Axure RP Pro支持Open Link in Popup Window动作,还可以设置多个参数,但是这些参数中不包括最大化显示Popup窗口。如果最大化显示Popup窗口的目的是模拟Model模式对话框 窗口效果的话,可以在Popup窗口打开链接的同时在原窗口上用一个矩形遮盖所有的部件,并提示用户完成操作。

    [Axure RP Pro - 官方网站]

    http://www.axure.com/

    [Axure RP Pro - 关键词]

    axure

    [Axure RP Pro - 相关论坛]

    http://axure.com/cs/forums/

    [Axure RP Pro - Download下载]

    当前版本AXure RP Pro 5.1.0.1699, http://axure.cachefly.net/AxureRP-Pro-Setup.exe

     

    当前版本AXure RP Pro 5.1.0.1699, http://www.axure.com/files/AxureRP-Pro-Setup.exe

    Microsoft .Net Framework 2.0, http://www.microsoft.com/downloads/details.aspx?FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5

    翻译, Manual Installation手工安装包, http://www.axure.com/Files/AxureRPFiles.zip

     

    Microsoft Office Compatibility Pack兼容包 Service Pack 1 (SP1), http://www.microsoft.com/downloads/details.aspx?FamilyID=9a1822c5-49c6-47bd-8bec-0d68693ca564

     

    Axure RP Pro 5.0.0.1515, http://www.axure.com/files/5-0-0-1515/AxureRP-Pro-Setup.exe

     

    [Axure RP Pro - Beta测试版]

    下载Axure RP Pro 5.5 Beta, http://www.axure.com/downloadbeta.aspx

    Introduction to Version 5.5 Features: Part 1, http://axure.com/cs/blogs/axure/archive/2008/11/19/Introduction-to-Version-5.5-Features_3A00_-Part-1.aspx

    Introduction to Version 5.5 Features: Part 2, http://axure.com/cs/blogs/axure/archive/2008/11/13/Introduction-to-Version-5.5-Features_3A00_-Part-2.aspx

    Introduction to Version 5.5 Features: Part 3, http://axure.com/cs/blogs/axure/archive/2008/11/13/Introduction-to-Version-5.5-Features_3A00_-Part-3.aspx

     

    [Axure RP Pro - Tutorial教程 - 翻译]

    AXURE 101: Introduction介绍 - Article 1: Introduction to Axure RP - Axure RP介绍, http://www.axure.com/p101_1.aspx

    AXURE 101: Introduction介绍 - Article 2: Annotated Wireframes, http://www.axure.com/p101_2.aspx

    AXURE 101: Introduction介绍 - Article 3: Basic Interactions基本交互, http://www.axure.com/p101_3.aspx

    AXURE 101: Introduction介绍 - Article 4: Masters主控文档, http://www.axure.com/p101_4.aspx

    AXURE 101: Introduction介绍 - Article 5: HTML Prototypes - HTML原型, http://www.axure.com/p101_5.aspx

    AXURE 101: Introduction介绍 - Article 6: Functional mq s功能规格, http://www.axure.com/p101_6.aspx 

    AXURE 102: Flow Diagrams流程图 - Article 1: Flow Shapes & Connectors流程图形和连接符号, http://www.axure.com/p102_1.aspx 

    AXURE 102: Flow Diagrams流程图 - Article 2: Generating Flow Diagrams生成流程图, http://www.axure.com/p102_2.aspx

     

    AXURE 201: Rich Interactions复杂交互 - Article 1: Dynamic Panels动态面板, http://www.axure.com/p201_1.aspx

    AXURE 201: Rich Interactions复杂交互 - Article 2: OnMouseEnter, OnMouseOut, and Rollover Effects - OnMouseEnter, OnMouseOut和翻转效果, http://www.axure.com/p201_2.aspx

     

    AXURE 201: Rich Interactions复杂交互 - Article 3: Menus菜单, http://www.axure.com/p201_3.aspx

    AXURE 202: Rich Functionality复杂功能 - Article 1: Conditional Logic条件逻辑, http://www.axure.com/p202_1.aspx

    AXURE 202: Rich Functionality复杂功能 - Article 2: OnChange Event - OnChange事件, http://www.axure.com/p202_2.aspx

     

     

    AXURE 202: Rich Functionality复杂功能 - Article 3: OnKeyUp Event - OnKeyUp事件, http://www.axure.com/p202_3.aspx

    AXURE 202: Rich Functionality复杂功能 - Article 4: OnFocus and OnLostFocus Events - OnFocus和OnLostFocus事件, http://www.axure.com/p202_4.aspx

    AXURE 202: Rich Functionality复杂功能 - Article 5: Variables - 变量, http://www.axure.com/p202_5.aspx

    AXURE 202: Rich Functionality复杂功能 - Article 6: OnPageLoad Event - OnPageLoad事件, http://www.axure.com/p202_6.aspx

    AXURE 301: Maximizing Reuse of Masters最大化重用主控 - Article 1: Affecting Widgets in Masters在主控中影响部件, http://www.axure.com/p301_1.aspx

    AXURE 301: Maximizing Reuse of Masters最大化重用主控 - Article 2: Raised Events发起事件, http://www.axure.com/p301_2.aspx

    AXURE 401: Collaboration协作 - Article 1: Shared Projects共享工程, http://www.axure.com/p401_1.aspx

    [Axure RP Pro - Introduction介绍]

    RP的含义

    面板的组织方式

    [Axure RP Pro - Action动作]

    Parent Window父窗口

    [Axure RP Pro - Event事件]

    窗口间互操作

    [Axure RP Pro - Master主控文档]

    拖放控件
    Expand.Collapse伸缩控件

    将主控文档添加到多个页面

    [Axure RP Pro - Specification规格文档]

    规格文档中显示部件的属性

    规格文档中屏幕截图的脚标

    [Axure RP Pro - Wireframe线框]

    选择后面的部件

    rollover style翻转样式的常见误解

    [Axure RP Pro - Widget部件]

    水平线不能调整高度,垂直线不能调整宽度

    [Axure RP Pro - jQuery]

    如何在Axure RP Pro生成的HTML原型文档中集成jQuery, How to integrate jQuery into HTML prototype document generated by Axure RP Pro

    如何获取IFrame的URL,How to retrieve the URL of IFrame widget

    如何在Axure RP Pro生成的HTML原型文档中使用自定义脚本, How to integrate customized javascript into HTML prototype document generated by Axure RP Pro

    “移到最前”效果,"Bring to Front" Interaction

    如何实现淡入淡出效果,How to implement fade in and fade out effects

    如何设置焦点,How to implement the "set focus" action

    [Axure RP Pro - 相关问题]

    Manual Installation

    原型中切换页面时会闪一下

    如何实现页内多个锚的效果

    关闭Internet Explorer打开原型时出现的安全警告

    菜单部件不支持选中样式

    让规格文档中的页面图片和标题保持在同一页,fit section header and page image on one page

    跨原型链接页面

    显示视频

    OnMouseOver事件和Rollover翻转效果浏览器不兼容

    导入时保持变量有效

    变量值与部件内容并不都能相互传递

    导出在PDF

    显示Google地图

    在规格文档中描述Inline Frame部件的Default Target规格

    渐变填充

    使用正则表达式的较验函数在Firefox下出错

    Style Editor样式编辑器以及已知的一些缺陷

    Text Panel部件在设计时的效果与原型不一致

    在不同工程之间使用masters主控文档

    判断动态面板的状态

    原型中Droplist“下拉列表”部件在IE6中总显示在最前面

    设置首页面

    自定义样式不能应用于翻转样式

    线框中的字号与原型中的字号的关系

    修改自定义样式对已应用该样式部件的逻辑

    与IFrame部件中的页面互操作

    在OnPageLoad事件中使用多个case用例

    Open Link in Current Window,Close Current Window,Open Link in Parent Frame将忽略其余动作

    使用Google Code服务分享工程的限制及原因

    Button按钮部件不支持设置文字以及解决方法

    修改生成的prototype原型的css样式表

    在文本框中显示提示信息

    OnPageLoad事件中的动作不会触发部件的事件

    Droplist下拉列表框部件在规格文档中不包括默认值

    dynamic panel动态面板上的image图片部件设置了rollover翻转图片后在OnClick事件中不能正确隐藏所在面板

    文本不支持Rollover翻转效果以及迂回解决办法

    设定多套初始化变量

    表格的单元格不能使用动作设置文字

    Text Panel文本部件不支持超链接及迂回处理办法

    设置页面尺寸

    在规格文档中显示部件工具提示

    master主控文档的behavior行为是custom widget自定义部件时丢失raised event可触发事件

    模拟加法运算

    设置打开原型的默认浏览器

    Listbox列表框部件不支持修改选项

    数字键盘

    checkbox复选框部件的OnClick事件中复选框的状态已发生了改变

    监视变量

    限制输入数字

    Wireframe线框绘制尺寸的范围及处理方案

    不支持最大化显示Popup窗口

    展开全文
  • 期望最大化 (Expectation Maximization) 算法最初是由 Ceppellini[2] 等人 1950 年在讨论基因频率的估计的时候提出的。后来又被 Hartley[3] 和Baum[4] 等人发展的更加广泛。目前引用的较多的是 1977 年 Dempster[5]...

    期望最大化 (Expectation Maximization) 算法最初是由 Ceppellini[2] 等人 1950 年在讨论基因频率的估计的时候提出的。后来又被 Hartley[3] 和Baum[4] 等人发展的更加广泛。目前引用的较多的是 1977 年 Dempster[5]等人的工作。它主要用于从不完整的数据中计算最大似然估计。后来经过其他学者的发展,这个算法也被用于聚类等应用。

    因此如果大家理解了K-means聚类,那么这个算法就容易理解了,这里我们先一起来回归一下K-means的聚类思想,其实他的聚类思想很简单,我们来看一下算法过程:

    k-means的k就是最终聚集的簇数,这个要你事先自己指定。k-means在常见的机器学习算法中算是相当简单的,基本过程如下:

    • 首先任取k个样本点作为k个簇的初始中心;
    • 对每一个样本点,计算它们与k个中心的距离,把它归入距离最小的中心所在的簇;
    • 等到所有的样本点归类完毕,重新计算k个簇的中心;
    • 重复以上过程直至样本点归入的簇不再变动。

    通过上面大家可以看到,为了找到合适的聚类中心点,k-means刚开始给的初始中心是任意的,然后不断的更新迭代后按照上面算法步骤不停的更改k个中心的位置,直到他们都几乎不再变化位置,也就是说当k个位置几乎不再变化时基本上就说明了到达了真实的数据中心了。这里有一个思想就是我刚开始不知道数据的最佳K个中心点,但是我可以通过数据不停的迭代,进而达到理想的中心点,而这个思想也是EM算法的核心思想。
    下面先通过一个简单的例子引入EM算法的核心思想,然后在使用数学进行证明这样做的合理性。

    EM

    考虑一个投掷硬币的实验:现在我们有两枚硬币 A 和 B,这两枚硬币和普通的硬币不一样,他们投掷出正面的概率和投掷出反面的概率不一定相同。我们将 A 和 B 投掷出正面的概率分别记为\theta _A\theta _B。我们现在独立地做 5 次试验:随机的从这两枚硬币中抽取 1 枚,投掷 10 次,统计出现正面的次数。那么我们就得到了如表格1的实验结果。

    试验代号投掷的硬币出现正面的次数

    1

    2

    3

    4

    5

    B

    A

    A

    B

    A

    5

    9

    8

    4

    7

    在这个实验中,我们记录两组随机变量:

                                                         X = (X_1,X_2,X_3,X_4,X_5)

                                                          Z = (Z_1,Z_2,Z_3,Z_4,Z_5)

    其中X_i\in \left \{ 1,2,3,4,5,6,7,8,9,10 \right \},代表试验i中出现的正面的次数,Z_i\in \left \{ A,B \right \}代表这次试验投掷的是硬币A还是B。

    我们的目标是通过这个实验来估计 \theta =(\theta _A,\theta _B)的数值。这个实验中的参数估计就是有完整数据的参数估计,这个是因为我们不仅仅知道每次试验中投掷出正面的次数,我们还知道每次试验中投掷的是硬币 A 还是 B。
    一个很简单也很直接的估计 θ 的方法如公式(1)所示。                                               

     实际上这样的估计就是统计上的极大似然估计 (maximum likelihood estimation) 的结果。用P(X,Z|\theta )来表示 X,Z 的联合概率分布(其中带有参数 θ),那么对于上面的实验,我们可以计算出他们出现我们观察到的结果即 x^0 = (5,9,8,4,7),z^0 = (B,A,A,B,A)的概率。函数 P(X=x^{(0)},Z = z^{0}|\theta )就叫做 θ 的似然函数。我们将它对 θ 求偏导并令偏导数为 0,就可以得到如(1) 的结果。

    对其求偏导,这里只对\theta _A求偏导,\theta _B也是一样的求,这里我们把系数统一使用C来表示了,关于\theta _B的式子使用f(\theta _B)进行代替,然后整理一下上式得:

                                        P(X=x^0,Z = z^0|\theta ) = Cf(\theta _B)\theta _A^{24}(1-\theta _A)^6

    对其求偏导,并令其为0的:

                                         \frac{\partial P(X=x^0,Z = z^0|\theta )}{\partial \theta _A} = Cf(\theta _B)[24\theta _A^{23}(1-\theta _A)^6-6\theta ^{24}(1-\theta _A)^5]=0 

     此时化简解得\theta _A如下:

                                          24(1-\theta _A) - 6\theta _A = 0

                                           30\theta _A = 24

                                                \theta _A = 0.8

    同理可求                              \theta _B =0.45

    由此可见上面利用均值和这里使用最大释然函数的结果是一样的,因此这里的(1)式称为极大释然估计。这里大家应该明白了吧。下面我们把难度加大:

    我们将这个问题稍微改变一下,我们将我们所观察到的结果修改一下:我们现在只知道每次试验有几次投掷出正面,但是不知道每次试验投掷的是哪个硬币,也就是说我们只知道表1中第一列和第三列。这个时候我们就称 Z为隐藏变量 (Hidden Variable)X称为观察变量 (Observed Variable)。这个时候再来估计参数\theta _A\theta _B ,就没有那么多数据可供使用了,这个时候的估计叫做不完整数据的参数估计(这里X就可认为是HMM中的可见变量了,Z就是隐藏的状态变量了)。
    如果我们这个时候有某种方法(比如,正确的猜到每次投掷硬币是 A还是 B),这样的话我们就可以将这个不完整的数据估计变为完整数据估计。
    当然我们如果没有方法来获得更多的数据的话,那么下面提供了一种在这种不完整数据的情况下来估计参数 θ 的方法。我们用迭代的方式来进行:

      (1)  我们先赋给 θ 一个初始值,这个值不管是经验也好猜的也好,反正我们给它一个初始值。在实际使用中往往这个初始值是           有其他算法的结果给出的,当然随机给他分配一个符合定义域的值也可以。这里我们就给定 \theta _A= 0.7,\theta _B = 0.4
      (2)  然后我们根据这个来判断或者猜测每次投掷更像是哪枚硬币投掷的结果。比如对于试验 1,如果投掷的是 A,那么出现 5             个正面的概率为C_{10}^5\times 0.7^5\times (1-0.7^5)\approx 0.1029;如果投掷的是B,出现5个正面的概率为                                                    C_{10}^5\times 0.4^5\times (1-0.4)^5\approx 0.2007;基于试验1的试验结果,可以判断这个试验投掷的是硬币 A 的概率为                              0.1029/(0.1029+0.2007)=0.3389,是 B 的概率为 0.2007/(0.1029+0.2007)= 0.6611。因此这个结果更可能是投掷 B 出现             的结果。
       (3)  假设上一步猜测的结果为 B,A,A,B,A,那么根据这个猜测,可以像完整数据的参数估计一样 (公式2) 重新计算 θ 的值。

    这样一次一次的迭代 2-3 步骤直到收敛,我们就得到了 θ 的估计。这里大家应该能感受到这和K-means很像对吧,你可能有疑问,这个方法靠谱么?事实证明,它确 实是靠谱的。下面我们就从数学角度来说明他的合理性。

    数学证明

    首先来明确一下我们的目标:我们的目标是在观察变量 X 和给定观察样本 x_1,x_2,...,x_n 的情况下,极大化对数似然函数

    这个函数大家应该都能看懂吧,看不懂的请返回看我的上一篇博客。

    其中只包含观察变量的概率密度函数(其实是求边缘密度,即对另一个变量进行求和就可以了得到边缘密度了):

                                        

     其中 Z 为隐藏随机变量,\left \{ Z_j \right \} 是 Z 的所有可能的取值。那么把(6)式代入(5)式:

                                             

    这里我们引入了一组参数(不要怕多,我们后面会处理掉它的)α,它满足∀可能的j,\alpha _j ∈ (0,1]和
    \sum _j\alpha _j=1到这里,先介绍一个凸函数的性质,或者叫做凸函数的定义。f(x) 为凸函数,\forall i = 1,2,3,..,n,\lambda _i\in [0,1],\sum_{i=1}^{n}\lambda _i = 1,对 f(x) 定义域中的任意 n 个x_1,x_2,...,x_n 有 :

                                                    f(\sum_{i=1}^{n}\lambda _ix_i)\leq \sum_{i=1}^{n}\lambda _if(x_i)                                                     \left ( 8 \right ) 

    上式称为Jensen不等式

     对于严格凸函数,上面的等号只有在 x_1= x_2=...=x_n 的时候成立。关于凸函数的其他性质不再赘述。对数函数是一个严格凸函数。因而我们可以有下面这个结果:                           

                                              

    上式是\left ( 7 \right )式根据\left ( 8 \right )式得到的,只是不同的是ln是凹函数,但是同样适用Jensen不等式,只是不等号方向不一样罢了。 

    现在我们根据等号成立的条件来确定\alpha _j

                                                              

    这里需仔细推一下,我们知道\left ( 9 \right )的成立条件是x_1= x_2=...=x_n,那么联合概率密度P(X_i,Z_j)是不变的,等于一个常数,和j无关,和j无关的意思是当j确定时,无论i等于几上式都是一个常数,大家可以这样理解,因此可以写成\left ( 10 \right )式,对上式的j求和同时把\alpha _j乘到右边:

                                                          \sum_{j}P(X_i=x_i,Z=z_j) = \sum _j\alpha _j*c = c 

    我们仔细看看等式的左边,他是对j求和,而且P是联合概率密度,对某一个维度求和不就是求边缘密度吗?所以上式可以写为如下:

                                                \sum_{j}P(X_i=x_i,Z=z_j) = P(X_i=x_i)=\sum _j\alpha _j*c = c

    也就是说:

                                               P(X_i=x_i) = c

    此时把上式代入(10)式,可得(11)式

    其中 c 是一个与 j 无关的常数。因为\sum _j\alpha _j=1稍作变换就可以得到 

                                                              

    上式是什么意思呢?大家还记得条件概率的定义吗?

                                                                P(B|A) = \frac{P(AB)}{P(A)}

     因此(11)式就是条件概率的表达式即为P(Z=z_j|X=x_i) = \frac{P(X_i=x_i,Z=z_j)}{P(X=x_i)}.,这个式子代表什么意思呢?其实就是在我们知道了扔的硬币为正的情况下这个硬币为A或者为B的概率,就是再求隐藏的条件概率。

    现在来解释一下我们得到了什么。\alpha _j就是 Z=z_j 在 X=x_i下的条件概率或者后验概率。求 α 就是求隐藏随机变量 Z 的条件分布。总结一下目前得到的公式就是 

                                                 

    好,得到上式以后,我们如何求\theta呢,这里需要和大家说明的是,这里的\theta在上式没体现处理,他是包含在P和\alpha中的,这里大家需要理解,那我们如何求解参数\theta使的l(\theta )达到最大呢?这里我们需要明确上式是很复杂的,直接求导不好求,因此需要想办法进行间接求极大值,怎么求呢?这里给出一个简单的例子:

                                                    l(\theta )=d(\theta )q\left ( \theta \right )

    假设有一个待求极值的函数l(\theta ),如上式,其中d(\theta )很复杂无法求导,而q(\theta )相对简单一点,那么针对这样的函数我们如何求极值呢?这里提供一种迭代的方法,首先我给d(\theta )任意赋值一个\theta _0的值,此时d(\theta _0)就是一个常数了,那么上式就可以写成l(\theta )=d(\theta_0 )q\left ( \theta \right ),此时在对l(\theta )求导得到\theta _1,再把\theta _1代入d(\theta ),在类似的计算,直到\theta不再发生变化此时的\theta就是所求的值,过程如下:

                                                      \theta _0                              l(\theta )=d(\theta_0 )q\left ( \theta \right )        \rightarrow \theta _1

                                                      \theta _1                              l(\theta )=d(\theta_1 )q\left ( \theta \right )        \rightarrow \theta _2

                                                      \theta _2                              l(\theta )=d(\theta_1 )q\left ( \theta \right )        \rightarrow \theta _3

                                                                                             ..........

                                                                     迭代到\theta基本上不再变化或者达到我们设定的阈值

    解我们的(12)也是这样的思想。

    直接就极大值比较难求,EM 算法就是按照下面这个过程来的。 

    (1)  根据上一步的 θ 来计算 α,即隐藏变量的条件分布

    (2)  极大化似然函数来得到当前的 θ 的估计

    EM算法流程

    期望最大化算法就是在这个想法上改进的。它在估计每次投掷的硬币的时候,并不要确定住这次就是硬币 A 或者 B,它计算出来这次投掷的硬币是 A 的概率和是 B 的概率;然后在用这个概率(或者叫做 Z 的分布)来计算似然函数。期望最大化算法步骤总结如下:

    总结一下,期望最大化算法就是先根据参数初值估计隐藏变量的分布,然后根据隐藏变量的分布来计算观察变量的似然函数,估计参数的值。前者通常称为 E 步骤,后者称为 M 步骤。

    好本节就到这里,下一节来看看HMM的第三个问题的在语料不完整的情况下的解决方法。

    参考文献:《期望最大化算法》   binary_seach   December 3, 2012

     

    展开全文
  • 1. 基本语法(1)模块导入import openpyxl(2)读取表格wb = openpyxl.load_workbook('文本文件到表格.xlsx') sheet = wb.get_active_sheet() #获得当前sheet表(3)写入表格wb = openpyxl.Workbook() #创建一个...
  • JavaSwing_4.8: JTable(表格

    万次阅读 多人点赞 2017-09-24 21:13:38
    Java Swing 图形界面开发(目录) 1. 概述 官方JavaDocsApi: javax.swing.JTable JTable,表格。JTable 是用来显示和编辑常规二维单元表。 2. 创建简单的表格 package com.xiets...
  • 表格分割方法

    2020-11-10 08:21:47
    表格区域划分 1. 有线 1.1 霍夫直线检测法 Duda R O , Hart P E . Use of Hough Transformation to Detect Lines and Curves in Pictures[J]. Communications of the ACM, 1972, 15(1):11-15. 提出了基于霍夫变换...
  • Axure RP Pro - 翻译 - 5.5 Tutorial教程 - AXURE 301 Article 3: Maximizing Reuse of Masters最大化重用共用区块 - Custom Widget Libraries自定义部件库Overview概述 1. Custom Widget Libraries 1. 自定义部件...
  • Android表格自定义控件

    千次阅读 2016-04-09 18:39:27
    开启博客的第一天近期公司要做报表功能,在网上搜索下表格的样式后便自己写了一个自定义的表格控件,该表格控件能根据设置的数据中数据的最大值自动设置左侧信息栏显示的值,使得条形图能尽量的充满控件,条形图部分...
  • react+antd表格表格中的数值需通过对比判断出大小来显示不同的颜色,最大为红色,最小为绿色,中间值不变色
  • 微信小程序table表格自定义组件实现

    千次阅读 多人点赞 2020-10-22 17:16:22
    效果 属性 属性 类型 默认值 必填 说明 tabData Array ...表格标题 ...表格中需要展示的数据列 onclick Boolean false 否 为某一列设置点击事件,若同时为多列设置了点击事件,则只有第一个生效
  • 爬取表格数据

    2019-06-24 15:03:00
    判断表格是否加载出来,用到了 EC.presence_of_element_located 条件。表格加载出来后,设置一个页面判断,如果在第1页就等待页面加载完成,如果大于第1页就开始跳转。 要完成跳转操作,我们需要通过获取输入框...
  • handsontable 仿excel表格插件备忘

    千次阅读 2018-01-22 17:00:52
    这款插件的最大优点就是把excel从本地搬到了web上,而且操作与excel基本一致,使用者不需要重新学习,非常符合文员的.../*表格初始*/ var container = document.getElementById('你的表格id'); var hot = new Handso
  • 【java实现控制台打印表格

    千次阅读 2020-11-12 17:20:30
    判断给定数据库是否可以连接,习惯做法是安装一个客户端,输入连接信息后连接测试。但是客户现场通常只提供一个linux系统,没有相关客户端。因此,需要一个能在linux上运行的数据库连接测试工具。我的实现思路:使用...
  • 好用漂亮的Android 表格框架

    万次阅读 多人点赞 2018-01-11 13:54:24
    Android 表格使用的频率并不高,之前花了心思写了SmartTable表格,觉得android移动端表格就应该是这个样子的,地址https://github.com/huangyanbin/smartTable,一直放在github上无人问津,最近有同学说蛮好用的,为...
  • 摘要:表格问答是一种针对自然语言问题,根据表格内容给出答案的任务。 一、什么是表格问答 表1是一张综艺节目收视率报表,假如你需要了解市场份额在3%以上的综艺节目,你会选择采用什么样的方法? 首先,用肉眼...
  • 机房重构——导出excel表格

    热门讨论 2016-04-17 20:11:21
     第一次在做机房的时候记得如何导出excel表格的功能是参考的别人的,在这个做的时候不能再参考别人的了,大事小事,只有自己尽自己最大的努力去做就一定会有所收获。经过查资料,终于写出如何将DataGridView控件中...
  • DIV+CSS+JS在HTML页面制作表格的思想

    千次阅读 2019-04-13 20:25:01
    本文章主要是介绍了如何制作表格的思想。阅读这文章,至少得了解div标签的特性,特别是可以抽象理解div标签的——块思想。还有选择器的知识也是很重要。 2.表格的结构拆分 首先,我的认为。一张基本的表格主要有俩...
  • Spreadjs纯前端表格控件

    千次阅读 2017-08-30 10:04:23
    SpreadJS纯前端表格控件是基于HTML5的JavaScript电子表格和网格功能控件,适用于.NET、Java和移动端等各平台在线编辑类Excel功能的表格程序开发,类似Excel。 页面引用相应的js 如果购买正式版的话会有...
  • Excel表格导出,java代码,采用反射加注解的方式获得excel表格中的数据 maven所依赖: org.apache.poi poi-ooxml 3.11-beta1 1.java注解: /** * ClassName:Excel Function: Excel导出列头标记通用...
  • Python-docx 模块读写 Word 文档基础(三):读取文档文本信息、表格信息、段落格式、字体格式等前言:1、获取文档章节信息:2、获取段落文字信息:3、获取文字格式信息:4、获取文档中表格信息:结尾:【Python与...
  • Ext 表格的操作

    2010-09-14 19:01:00
    1) 表格数据选择 行选择模式: Js代码 var rowcount = grid.getSelectionNode().getSelections(); var rowcount = grid.getSelectionNode().getSelections(); 可以获取全部选中的记录,得到的...
  • excel表格省市区三级联动

    千次阅读 2019-01-22 17:54:04
    文章目录目录主要使用三个表格函数编写三级联动设置省设置市设置区(县)公式原理说明附上demo 主要使用三个表格函数 VLOOKUP(新吸毒人员登记表!J7,A:B,2,) 百度百科:VLOOKUP函数是Excel中的一个纵向查找函数,它与...
  • 好用漂亮的Android 表格框架3

    千次阅读 2018-02-07 05:43:47
    之前写了两篇关于Android表格的文章,受到很多同学的喜欢。github地址一些同学提出了新的需求。由于个人精力有限,只能增加个人比较实用的部分功能。下面介绍两个新功能。 附上之前两篇文章的地址 好用漂亮的...
  • 1.判断元素是否消失,是返回Ture,否返回False 备注:此方法未调好,暂时放这   四、参考代码: # coding:utf-8 from selenium import webdriver from selenium.webdriver.support.wait ...
  • 要点初见:Python+OpenCV校正并提取表格中的各个框

    千次阅读 多人点赞 2018-12-12 17:55:53
    最近做了个手写汉字简历识别比赛,需要先提取表格中含有指定信息的各个框,再用TensorFlow对框中的信息进行汉字、数字、英文识别。代码已开源:https://github.com/BingLiHanShuang/chinese_ocr,需要额外下载训练好...
  • Excel表格实用技巧大全

    千次阅读 2012-10-11 13:19:30
    Excel表格实用技巧大全 一、让数据显示不同颜色  在学生成绩分析表中,如果想让总分大于等于500分的分数以蓝色显示,小于500分的分数以红色显示。操作的步骤如下:首先,选中总分所在列,执行...
  • jqgrid格式字符串(整型、数字、货币、日期、显示连接) jqGrid的格式是定义在语言包中的JS中的,有如下已定义好的类型 formatter : {   integer : {thousandsSeparator: " ", defaultValue: '0'},   number ...
  • 我们任何的信息建设项目都为分析信息服务的,信息的载体无非就是各种各样的数据,我们表现和收集数据用得最多的应该就是表格了,最近一个项目中大量使用到表格,而且对表格的自定义要求甚高,一开始我自恃JS功力...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,802
精华内容 22,320
关键字:

判断表格是否最大化