一、简介

概率软逻辑(PSL,Probabilistic soft logic)是用于开发概率模型的机器学习框架,由加州大学圣克鲁兹分校和马里兰大学的统计关系学习小组LINQS开发。目前其复杂的环境构建方式和Groovy语言表达给像作者一样的初学者带来了不小的困难,而且诸多的依赖项经常使原本已经构建好的模型小错误频繁。

经过努力,作者将其构建成单个jar包,并且加入编码机制使其可以支持各种语言的数据。主要贡献有三:

1.将PSL原本复杂的依赖打包为单个jar包,加入依赖即可开始使用。

2. 将不够熟悉的Groovy语言模型构建方式全部转化为.java支持,只需一个.java文件便可进行模型构建。

3.加入编码机制,使PSL可以轻松处理除英文以外语言的数据。

链接:https://pan.baidu.com/s/1PybpNoPpvk4jmSMw7Rm_7A 密码:g1cx
链接文件夹里有三个文件:
PSL_swust1.0.jar 修改过的PSL模型
SimpleAcquaintances.zip PSL官方例子的改编版本(不包含权重学习和函数)
Entity_resolution.zip PSL官方例子的改编版本(包含权重学习和函数)

使用时请将PSL_swust1.0.jar加入java项目依赖即可,导入示例项目也需要将项目lib文件夹下PSL_swust.jar加入依赖。

二、举例说明

以SimpleAcquaintances内SimpleAcquaintances.java为例进行阐述。

1.配置项

/** ======【配置项】======*/Tool tool = new Tool();DataStore datastore;HashMap<String, Partition> partitions = new HashMap<String, Partition>();String path = tool.getPath(new SimpleAcquaintances().getClass())+ "/../data/";// SimpleAcquaintances改为当前类名String[] paths = tool.getFiles(path);PSLMODEL psl = new PSLMODEL(paths, "H2");// 在安装了postgresql数据库时可H2改为postgresqldatastore = psl.getDatastore();psl.transcoding = false;//是否给数据编码(此值只决定数据是否编码,谓词默认都要编码)

• 使用时SimpleAcquaintances需要改为当前类名(目的是为了通过Tool类 getPath() 函数获取获取当前项目文件夹)。
• 当安装配置了postgreSQL时可将 “H2” 改为 “postgresql” 来使用postgreSQL数据库(H2为模型自带数据库,运行于内存)。
transcoding 项设置为 true 时候模型会给数据编码,此时模型可以支持处理各种语言的数据(另外,设置true编码后设置谓词属性为UniqueIntID,可提升模型计算效率)。
• 此修改后的版本依然保留了PSL自带的相似度计算函数和自定义函数功能,但是编码后的数据无法通过PSL自带相似度计算函数计算相似度 (因为,编码后的数据不再是原来的字符串)。

2.定义分区

        // 权重学习分区// partitions.put("learn_obs", datastore.getPartition("learn_obs"));// partitions.put("learn_target",// datastore.getPartition("learn_target"));// partitions.put("learn_truth", datastore.getPartition("learn_truth"));// 实验分区datastore = psl.getDatastore();partitions.put("obs", datastore.getPartition("obs"));partitions.put("target", datastore.getPartition("target"));partitions.put("truth", datastore.getPartition("truth"));psl.setPartitions(partitions);

当需要权重学习时(有训练数据时),需要定义权重学习分区。
• “obs” 代表已知数据分区;
• “target” 代表要推理的目标数据储存分区(当要使用LazyInference推理时可以不往里面加载数据),
• “truth” 为真实数据分区。

3.谓词(函数)定义

HashMap<String, ConstantType[]> p = new HashMap<String, ConstantType[]>();HashMap<String, ExternalFunction> f = new HashMap<String, ExternalFunction>();// 添加谓词p.put("Lived", new ConstantType[] { ConstantType.UniqueStringID,ConstantType.UniqueStringID });p.put("Likes", new ConstantType[] { ConstantType.UniqueStringID,ConstantType.UniqueStringID });p.put("Knows", new ConstantType[] { ConstantType.UniqueStringID,ConstantType.UniqueStringID });// 添加函数
//      f.put("SameInitials", new SameInitials());
//      f.put("SameNumTokens", new SameNumTokens());psl.definePredicates(p, f);// 谓词、函数输入模型

• 谓词定义只需替换修改即可,可随意增减。
• 谓词常用属性有UniqueStringID、UniqueIntID、String等。
• 函数可以定义PSL自带相似度函数(transcoding 为false时),也可定义继承ExternalFunction的自定义函数。

4.规则定义

String[] rules = {"20.0: ( LIVED(P1, L) & (P1 != P2) & LIVED(P2, L) ) >> KNOWS(P1, P2) ^2","5.0: ( (L1 != L2) & (P1 != P2) & LIVED(P2, L2) & LIVED(P1, L1) ) >> ~( KNOWS(P1, P2) ) ^2","10.0: ( LIKES(P2, L) & (P1 != P2) & LIKES(P1, L) ) >> KNOWS(P1, P2) ^2","5.0: ( KNOWS(P1, P2) & KNOWS(P2, P3) & (P1 != P3) ) >> KNOWS(P1, P3) ^2","1.0 * KNOWS(P1, P2) + -1.0 * KNOWS(P2, P1) = 0.0 .","5.0: ~( KNOWS(P1, P2) ) ^2"};psl.defineRules(rules);// 规则输入模型

规则格式: 权重: 规则体 >> 规则头
• ^2代表平方优化,
• 定义自己项目的规则只需按照例子里的规则格式增减规则即可。
提示:算术规则的定义只能写成 "apredicateX(A,B)+bpredicte(A,B)= 0.0 ." 的形式,如PSL可接受的规则:“Knows(P1, P2) = Knows(P2, P1) .” 在作者修改版本中请写成 "1.0 KNOWS(P1, P2) + -1.0 KNOWS(P2, P1) = 0.0 ." ,否则会报错,后期会进行优化。

5.导入数据

/** ======【导入数据】======* 其中"1-2"表示对数据的一二列进行转码* 只有在transcoding = true时作用,表示只对1,2两列进行转码*/psl.loadData("Lived", path + "Lived_obs.txt", "obs", "1-2");psl.loadDataTruth("Likes", path + "likes_obs.txt", "obs", "1-2");psl.loadData("Knows", path + "knows_obs.txt", "obs", "1-2");psl.loadData("Knows", path + "knows_targets.txt", "target","1-2");psl.loadDataTruth("Knows", path + "knows_truth.txt", "truth","1-2");
//      ArrayList<String[]> likepe = tool.fileToArrayList(path + "likes_obs.txt", "1-2-3");
//      psl.insertDataTruth("Likes", likepe, "obs");
//      psl.insertData("Likes", likepe, "obs");

• 此版本提供了loadData,loadDataTruth,insertData,insertDataTruth四种方法载入数据,格式为:loadData("谓词",谓词对应数据文件路径, "要导入的分区", "要取的列(不包含概率值那一列)")
loadData,loadDataTruth中的"1-2"表示对数据的一二列进行转码, 只有在transcoding = true时作用,表示对数据文件里的1,2两列进行转码,多列增加即可,以“-”分开。
• loadData,loadDataTruth区别在于:用loadDataTruth加载数据,默认最后一列为概率值
insertData,insertDataTruth适用于一个数据文件存储了多个谓词对应数据的情况,使用前需要先将文件转化为List数据,此文版本里包含的工具类Tool提供了 fileToArrayList("文件路径","要提取的列数")函数辅助完成转化工作。
• ""1-2-3""表示要取出1、2、3作为谓词的数据,insertDataTruth取出的每个数据 "1-2-...-n"的第n项默认是概率值。

6.权重学习

//  psl.learnWeights("learn_target", "Lived-Likes", "learn_obs", "learn_truth","MaxLikelihoodMPE");

格式:learnWeights("训练数据目标分区", "封闭谓词,即:作为已知数据,推理过程不会再新产生的原子", "训练数据已知数据分区", "真实数据存放分区","权重学习方法")
• 当有训练数据时候可进行权重学习优化规则权重。
• 此版本保留了五种PSL权重优化方法:
"LazyMaxLikelihoodMPE",
"MaxLikelihoodMPE",
"MaxPiecewisePseudoLikelihood",
"MaxPseudoLikelihood",
"SimplexSampler"
替换即可使用。

7.打印输出模型

psl.printModel();

• 可用于查看已经定义的模型及编码后的模型(规则)。

8.运行推理

//      psl.runLazyInference("已知数据分区", "目标分区(存放结果)");
//      psl.runLazyInference("obs", "target");
//      psl.runInference(""已知数据分区"","封闭谓词1-封闭谓词2" , "目标分区(包含定义的目标原子)");psl.runInference("obs","Lived-Likes" , "target");

• 此版本有两种推理方式:LazyMPEInference,MPEInference
LazympeInference格式:runLazyInference("已知数据分区", "目标分区 用于存放结果")
MPEInference格式:runInference(""已知数据分区"","封闭谓词1-封闭谓词2" , "目标分区 包含了输入的目标原子")

9.数据输出

psl.writeOutput("target", "Knows", path+ "/result/knows_inffer.txt");

• 输出函数使用格式:writeOutput("目标分区", "要输出的数据对应谓词1-要输出的数据对应谓词2", 输出路径)

10.评估实验结果

psl.evalResults("target", "truth", "Knows", path+ "/result/evalResults.txt");

• 评估函数使用格式:evalResults("目标分区", "真实数据分区", "目标谓词1-目标谓词2", 评估结果输出路径)
• 值得一提的是,"目标谓词1-目标谓词2" 项需要填写所有真实数据分区所包含数据对应的谓词。

11.关闭模型

psl.closeModel();

• 推理完成,请关闭模型。

转载于:https://blog.51cto.com/13919428/2160041

概率软逻辑(PSL,Probabilistic soft logic)通用(可处理中文)版本相关推荐

  1. 关系从句逻辑【Relational clausal logic】

    命题从句逻辑是相当粗粒度的,因为它以命题[propositions](即任何可以被赋予真值的事物)作为其基本构建块.例如,在命题逻辑中不可能形成以下论点: Peter likes all his st ...

  2. 概率潜在语义分析(Probabilistic Latent Semantic Analysis,PLSA)

    概率潜在语义分析(Probabilistic Latent Semantic Analysis,PLSA) 目录 概率潜在语义分析(Probabilistic Latent Semantic Anal ...

  3. 概率霍夫变换(Progressive Probabilistic Hough Transform)原理详解

    概率霍夫变换(Progressive Probabilistic Hough Transform)的原理很简单,如下所述: 1.随机获取边缘图像上的前景点,映射到极坐标系画曲线: 2.当极坐标系里面有 ...

  4. 【软件项目管理】任务(活动)之间的排序依据主要有:强制性依赖关系、软逻辑关系、外部依赖关系

    任务(活动)之间的排序依据主要有:强制性依赖关系.软逻辑关系.外部依赖关系. 项目各项任务(活动)之间存在相互联系与相互依赖关系,根据这些关系安排各项活动的先后顺序.确定任务(活动)之间关联关系的依据 ...

  5. Kong 1.0通用(GA)版本正式发布!

    今天,我们很高兴地公布Kong 1.0[1]的通用版本--这是一款可扩展.快速且开源的微服务API网关,可用于对混合及云原生架构进行管理.保护与连接.Kong运行有全部服务之前,并可以通过多种插件实现 ...

  6. 概率矩阵分解(Probabilistic Matrix Factorization)

    摘要 很多现有的协同过滤的方法既不能处理非常大的数据集,也不能容易地应对有非常少的评价的用户.在这篇论文中,我们提出了概率矩阵分解(PMF)模型,它的规模与观察值的数目线性相关,并且更重要的是,它在非 ...

  7. 拿到软银巨额投资后,通用无人车部门Cruise可能要单独IPO了

    李杉 编译整理 量子位 出品 | 公众号 QbitAI 拿下孙正义Vision Fund的22.5亿美元投资之后,通用对于旗下的无人车部门Cruise Automation又传出了一些更宏大的战略规划 ...

  8. 量子笔记:布尔逻辑/代数、逻辑门、通用门、可逆计算

    目录 0. 前言 1. 布尔逻辑.布尔代数和布尔函数 2. 香农.开关.逻辑门.电路 3. 门与计算 4. 功能完备性与通用门 4.1 功能完备性 4.2 通用门 5. 可逆计算和可逆门 5.1 可逆 ...

  9. 2018-01-05 通用型的中文编程语言探讨之一: 高考

    在可预见的未来, 高考仍是最重要的也最有社会影响力的人才选拔机制. 很久没有关注, 最近得知高考自选科目中开始增加了编程一项(见如何评价2017浙江高考七选三科目中包含技术?). 虽然个人对编程是否应 ...

最新文章

  1. 链路层寻址与 ARP
  2. 生成大小写字母加数字混合ID与自定义进制转换
  3. 水抗攻击 apt攻击手段
  4. 进击的新版NavMesh系统:看我飞檐走壁
  5. mysql大量数据插入探讨(量变引起质变)
  6. 深度解密 Go math/rand
  7. 7 个让您需要渐进式 Web 应用程序做项目开发的理由
  8. Shoutem旨在成为React Native移动应用领域的WordPress
  9. CodeForces 903D Almost Difference
  10. 1.5 编程基础之循环控制 45 金币 方法二(python3实现)
  11. 小米平板5或无缘MIUI 13:搭配骁龙870 预装MIUI 12.5系统
  12. php报错集合,centos7安装php5.6报错集合
  13. linux codeblocks汉化
  14. 每日新闻丨英特尔公布未来10年技术路线图;微软下月起终止支持Windows 7
  15. CentOS客户端加载ISCSI磁盘
  16. 三菱PLC传送类指令应用
  17. 【数字电路】集成逻辑门电路
  18. mkdir命令、chmod修改权限、利用scp 远程上传下载文件/文件夹
  19. 计算机课代表总结与反思,生物课代表总结与反思(38页)-原创力文档
  20. Php session_start错误,PHP 解决错误:Warning: session_start()... 的方法

热门文章

  1. Python对图像进行二维Gabor滤波加速
  2. Tcl Tutorial 笔记1 · 输出
  3. jyoryo mysql_分类 Tools 下的文章
  4. vc浏览器_自主创业项目推荐,晨兴资本刘芹:我的市场非共识+超配投资原则VC洞见...
  5. string.split方法 保留分隔符_Python pandas库159个常用方法使用说明
  6. layui table 复选框数据_Python操作三大数据库 Mysql
  7. oracle 10g dg参数配置,Windows平台之Oracle10g DG配置
  8. idea重写接口没有@override_【自学C#】|| 笔记 19 接口
  9. 表单提交_django 的ajax提交与表单提交记录
  10. linux生成ssl申请文件,Shell脚本实现生成SSL自签署证书