- 2014 年 3 月 3 日
- 瓦西利斯·弗里尼奥提斯(Vasilis Vryniotis)
- 。 没意见
在上一篇文章中,我们讨论了有关 数据包络分析 技术,我们已经看到了如何将其用作有效的非参数排名算法。 在此博客文章中,我们将在JAVA中开发数据包络分析的实现,并将用它来评估网页和Web上文章的社交媒体流行度。 该代码是开源的(根据GPL v3许可),您可以从以下位置免费下载 Github上.
更新:Datumbox机器学习框架现在是开源的,免费提供给 下载。 签出com.datumbox.framework.algorithms.dea软件包,以查看Java中数据包络分析的实现。
JAVA中的数据包络分析实现
该代码是用JAVA编写的,可以直接从以下位置下载 Github上。 它已获得GPLv3许可,因此可以随意使用,修改和自由分发。
该代码实现了 数据包络分析 算法,使用 lp_solve库 解决线性规划问题并使用从中提取的数据 Web SEO分析 索引,以便根据其在Facebook,Google Plus和Twitter上的份额来构建网页的综合社交媒体流行度指标。 该算法的所有理论部分已在上一篇文章中介绍,在源代码中,您可以找到有关实现的详细javadoc注释。
下面我们对实现的体系结构进行高级描述:
1. lp_solve 5.5库
为了解决各种线性编程问题,我们使用了一个名为lp_solve的开源库。 特定的库用ANSI C编写,并使用JAVA包装器调用库方法。 因此,在运行代码之前,必须在系统上安装lp_solve。 库的二进制文件都可用于 Linux和Windows 您可以在下面阅读有关安装的更多信息 lp_solve文档.
在尝试运行JAVA代码之前,请确保系统上已安装了特定的库。 有关安装和配置库的任何问题,请参阅lp_solve文档。
2. DataEnvelopmentAnalysis类
这是DEA算法实现的主要类别。 它实现了一个称为EstimateEfficiency()的公共方法,该方法获取记录图并返回其DEA分数。
3. DeaRecord对象
DeaRecord是一个特殊的对象,用于存储我们的记录数据。 由于DEA需要分离输入和输出,因此DeaRecord对象以DEA可以处理数据的方式分别存储我们的数据。
4. SocialMediaPopularity类
SocialMediaPopularity是一个使用DEA来基于其Facebook赞,Google +1和Tweets评估社交媒体网络上页面受欢迎程度的应用程序。 它实现了两个受保护的方法calculatePopularity()和estimatePercentiles()以及两个公共方法loadFile()和getPopularity()。
computePopularity()使用DEA实现根据页面的社交媒体计数来估计页面的分数。 EstimatePercentiles()方法获取DEA分数并将其转换为百分位数。 通常,百分位数比DEA分数更容易解释; 因此,当我们说某个页面的受欢迎程度得分为70%时,意味着该特定页面比70%的页面更受欢迎。
为了能够估计特定页面的受欢迎程度,我们必须具有包含其他页面的社交媒体计数的数据集。 这是有道理的,因为为了预测哪个页面受欢迎,哪个页面不受欢迎,您必须能够将其与网络上的其他页面进行比较。 为此,我们使用txt格式提供的Web SEO Analytics索引中的一个匿名小样本。 您可以通过从网络上更多页面中提取社交媒体计数来构建自己的数据库。
loadFile()方法用于在DEA上加载上述统计信息,而getPopularity()方法是一种易于使用的方法,可获取Facebook的点赞,Google +1和页面上的Tweets数量,并评估其在社交媒体上的受欢迎程度。
使用数据包络分析JAVA实现
在DataEnvelopmentAnalysisExample类中,我提供了两个有关如何使用代码的示例。
第一个示例直接使用DEA方法根据组织单位的输出(问题,收据,需求)和投入(股票,工资)评估效率。 此示例摘自 DEAzone.com网站.
Map<String, DeaRecord> records = new LinkedHashMap<>(); records.put("Depot1", new DeaRecord(new double[]{40.0,55.0,30.0}, new double[]{3.0,5.0})); //...adding more records here... DataEnvelopmentAnalysis dea = new DataEnvelopmentAnalysis(); Map<String, Double> results = dea.estimateEfficiency(records); System.out.println((new TreeMap<>(results)).toString());
第二个示例使用我们的社交媒体流行度应用程序通过使用来自社交媒体的数据(例如Facebook Likes,Google +1和Tweets)评估页面的流行度。 所有社交媒体计数均标记为输出,我们将空输入向量传递给DEA。
SocialMediaPopularity rank = new SocialMediaPopularity(); rank.loadFile(DataEnvelopmentAnalysisExample.class.getResource("/datasets/socialcounts.txt")); Double popularity = rank.getPopularity(135, 337, 9079); //Facebook likes, Google +1s, Tweets System.out.println("Page Social Media Popularity: "+popularity.toString());
必要的扩展
所提供的代码只是如何将DEA用作排名算法的示例。 以下是为了改进实施而必须进行的一些扩展:
1.加快实施
特定的DEA实现评估数据库中所有记录的DEA分数。 由于我们需要解决的线性编程问题与数据库中的记录数一样多,这使实现速度变慢。 如果我们不需要计算所有记录的分数,那么我们可以大大加快执行速度。 因此,该算法的较小扩展可以使我们更好地控制应解决哪些记录以及应仅将其用作约束的方法。
2.扩展社交媒体计数数据库
提供的社交媒体计数数据库包含Web SEO Analytics索引中的1111个样本。 为了能够估算出更准确的流行度分数,必须使用更大的样本。 您可以通过估计更多网页上的社交媒体数量来创建自己的数据库。
3.添加更多的社交媒体网络
该实现使用Facebook赞,Google +1和Tweets数量来评估文章的受欢迎程度。 不过,可以轻松考虑其他社交媒体网络的指标。 您需要做的就是使用您感兴趣的网络中的社交媒体计数构建数据库,并扩展SocialMediaPopularity类以进行相应处理。
关于实施的最终意见
为了能够扩展实现,您必须对如何 数据包络分析 作品。 上一篇文章对此进行了介绍,因此在进行任何更改之前,请确保您已阅读本教程。 此外,为了使用JAVA代码,您必须在系统中安装lp_solve库(请参见上文)。
如果您在有趣的项目中使用实现 我们写信 我们将在我们的博客上介绍您的项目。 另外,如果您喜欢这篇文章,请花一点时间在Twitter或Facebook上分享。