Java 中的本福德定律 - 如何将数学函数放入 Java 中

2023-12-21

我有一个快速的问题。我正在尝试用java制作一个欺诈检测应用程序,该应用程序将主要基于本福德定律。本福德定律非常酷,它基本上可以解释为在真实的金融交易中,第一个数字通常是 1、2 或 3,很少是 8、9。我还没能得到本福德公式翻译成可以在Java中运行的代码。

http://www.mathpages.com/home/kmath302/kmath302.htm http://www.mathpages.com/home/kmath302/kmath302.htm此链接提供了有关本福德定律是什么以及如何使用它的更多信息。

我知道我必须使用 java 数学类才能使用自然对数函数,但我不知道该怎么做。任何帮助将不胜感激。

非常感谢!!


@Rui 提到了如何计算概率分布函数,但这对你没有多大帮助。

您想要使用的是柯尔莫哥洛夫-斯米尔诺夫检验 http://www.itl.nist.gov/div898/handbook/eda/section3/eda35g.htm or the 卡方检验 http://en.wikipedia.org/wiki/Pearson%27s_chi-squared_test。两者都用于将数据与已知的概率分布进行比较,以确定数据集是否可能/不可能具有该概率分布。

卡方适用于离散分布,K-S 适用于连续分布。


为了使用卡方与本福德定律,您只需创建一个直方图 H[N],例如有 9 个 bin N=1,2,... 9,迭代数据集以检查第一个数字,以计算 9 个非零数字(或 90 个 bin 的前两位数字)中每个数字的样本数。然后运行卡方检验,将直方图与预期计数 E[N] 进行比较。

例如,假设您有 100 条数据。 E[N] 可以根据本福德定律计算:

E[1] = 30.1030 (=100*log(1+1))
E[2] = 17.6091 (=100*log(1+1/2))
E[3] = 12.4939 (=100*log(1+1/3))
E[4] =  9.6910
E[5] =  7.9181
E[6] =  6.6946
E[7] =  5.7992
E[8] =  5.1152
E[9] =  4.5757

Then compute Χ2 = sum((H[k]-E[k])^2/E[k]), and compare to a threshold as specified in the test. (Here we have a fixed distribution with no parameters, so the number of parameters s=0 and p = s+1 = 1, and the # of bins n is 9, so the # of degrees of freedom = n-p = 8*. Then you go to your handy-dandy chi-squared table http://itl.nist.gov/div898/handbook/eda/section3/eda3674.htm and see if the numbers look ok. For 8 degrees of freedom the confidence levels look like this:

Χ2 > 13.362: 10% chance the dataset still matches Benford's Law

Χ2 > 15.507: 5% chance the dataset still matches Benford's Law

Χ2 > 17.535: 2.5% chance the dataset still matches Benford's Law

Χ2 > 20.090: 1% chance the dataset still matches Benford's Law

Χ2 > 26.125: 0.1% chance the dataset still matches Benford's Law

Suppose your histogram yielded H = [29,17,12,10,8,7,6,5,6], for a Χ2 = 0.5585. That's very close to the expected distribution. (maybe even too close!)

Now suppose your histogram yielded H = [27,16,10,9,5,11,6,5,11], for a Χ2 = 13.89. There is less than a 10% chance that this histogram is from a distribution that matches Benford's Law. So I'd call the dataset questionable but not overly so.

注意you必须选择显着性水平(例如 10%/5%/等)。如果您使用 10%,则预计大约每 10 个真正来自 Benford 分布的数据集就有 1 个会失败,即使它们没问题。这是一个判断。

看起来 Apache Commons Math 有一个卡方检验的 Java 实现:

ChiSquareTestImpl.chiSquare(double[] expected, long[] observed) http://commons.apache.org/math/api-2.2/org/apache/commons/math/stat/inference/ChiSquareTestImpl.html#chiSquare%28double%5B%5D,%20long%5B%5D%29


*关于自由度的注释 = 8:这是有道理的;你有 9 个数字,但它们有 1 个约束,即它们都必须加起来等于数据集的大小,所以一旦你知道直方图的前 8 个数字,你就可以算出第九个。


柯尔莫哥洛夫-斯米尔诺夫实际上更简单(直到我找到一个足够简单的说明它如何工作之前我才意识到这一点),但适用于连续分布。该方法的工作原理如下:

  • 您计算概率分布的累积分布函数 (CDF)。
  • 您可以计算经验累积分布函数 (ECDF),通过将数据集按排序顺序即可轻松获得该函数。
  • 您发现 D =(大约)两条曲线之间的最大垂直距离。

让我们根据本福德定律更深入地处理这些问题。

  1. CDF for Benford's Law: this is just C = log10 x, where x is in the interval [1,10), i.e. including 1 but excluding 10. This can be easily seen if you look at the generalized form of Benford's Law http://en.wikipedia.org/wiki/Benford%27s_law#Generalization_to_digits_beyond_the_first, and instead of writing it log(1+1/n), writing it as log(n+1)-log(n) -- in other words, to get the probability of each bin, they're subtracting successive differences of log(n), so log(n) must be the CDF

  2. ECDF:获取你的数据集,对于每个数字,将符号设置为正,用科学记数法写出来,并将指数设置为 0。(不知道如果你有一个数字为 0 该怎么办;这似乎不适合自己)到本福德定律分析。)然后按升序对数字进行排序。 ECDF 是任何有效 x 的数据点数量

  3. 计算每个 d[k] = max(CDF(y[k]) - (k-1)/N, k/N - CDF(y[k]) 的最大差值 D = max(d[k])。

这是一个例子:假设我们的数据集 = [3.02, 1.99, 28.3, 47, 0.61]。然后 ECDF 由排序数组 [1.99, 2.83, 3.02, 4.7, 6.1] 表示,计算 D 如下:

D = max(
  log10(1.99) - 0/5, 1/5 - log10(1.99),
  log10(2.83) - 1/5, 2/5 - log10(2.83),
  log10(3.02) - 2/5, 3/5 - log10(3.02),
  log10(4.70) - 3/5, 4/5 - log10(4.70),
  log10(6.10) - 4/5, 5/5 - log10(6.10)
)

其中 = 0.2988 (=log10(1.99) - 0)。

最后你必须useD 统计数据——我似乎无法在网上找到任何信誉良好的表格,但 Apache Commons Math 有一个柯尔莫哥洛夫斯米尔诺夫DistributionImpl.cdf() http://commons.apache.org/math/apidocs/org/apache/commons/math/distribution/KolmogorovSmirnovDistributionImpl.html#cdf%28double%29函数将计算出的 D 值作为输入,并告诉您 D 小于该值的概率。采用 1-cdf(D) 可能更容易,它告诉您 D 大于或等于您计算的值的概率:如果这是 1% 或 0.1%,则可能意味着数据不符合本福德定律,但如果是 25% 或 50%,则可能是一个很好的匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中的本福德定律 - 如何将数学函数放入 Java 中 的相关文章

  • 调用函数时切换“控制转移绕过初始化:”

    当我尝试构建以下开关时 出现 控制转移绕过初始化 错误 switch retrycancel case 4 The user pressed RETRY Enumerate all visible windows and store han
  • 使用 Spring MVC 返回 PDF 文件

    实际上 我有这个功能 我有一个框架 可以在其中设置 URL ip port birt preview report report rptdesign format pdf parameters 并且该框架呈现 PDF 文件 但我想隐藏该网址
  • 按下按钮时清除编辑文本焦点并隐藏键盘

    我正在制作一个带有编辑文本和按钮的应用程序 当我在 edittext 中输入内容然后单击按钮时 我希望键盘和焦点在 edittext 上消失 但我似乎无法做到这一点 我在 XML 中插入了这两行代码 android focusable tr
  • JPA:如何将字符串持久保存到数据库字段中,输入 MYSQL Text

    需求是用户可以写文章 所以我选择typeText为了contentmysql数据库内的字段 我怎样才能转换Java String into MySQL Text 干得好Jim Tough Entity public class Articl
  • MongoDB:尝试从 JSON 读取 Long 导致 java.lang.Integer 无法转换为 java.lang.Long

    我有一个代码可以从 MongoDB 读取特定格式的数据 我需要测试一下 为此 我使用要测试的数据创建一个 JSON id ObjectId 57552e32e4b0839ede67e0af serial 574000690 startDat
  • Ant 无法启动,给出主类错误

    我正在运行 Elementary OS 基于 Ubuntu 12 并且在运行 apache ant 时遇到问题 它在重新启动之前就可以正常工作 所以我不确定会发生什么变化 我在 etc environment 中定义了环境变量 如下所示 P
  • Java 反射:如何检索匿名内部类?

    我在另一个类中有一个匿名内部类 SomeClass Both SomeClass class getClasses and SomeClass class getDeclaredClasses 返回空数组 我在中找不到一些关于此的提示Cla
  • 在Java中使用BufferedWriter写入文件时监视文件大小?

    我正在将一个可能很长的项目列表写入文件 我正在写的项目的长度是可变的 如果生成的文件大小大于10M 则应将其分成多个文件 为了提高性能 我目前使用 BufferedWriter 如下所示 final FileOutputStream fos
  • 给定一个单词列表 - 在 java 中完成单词的好的算法是什么?权衡:速度/效率/内存占用

    我正在探索潜在的免费 付费应用程序的硬件 软件要求 最终目标是移动 Java 应用程序 该应用程序将从这个简单的目标开始 给定数据库中相关单词的列表 能够对单个字符串输入进行单词补全 换句话说 我已经知道数据库的内容 但算法的内存占用 速度
  • Haskell 点运算符

    我尝试在 Haskell 中开发一个简单的平均函数 这似乎有效 lst 1 3 x fromIntegral sum lst y fromIntegral length lst z x y 但是为什么下面的版本不行呢 lst 1 3 x f
  • 局部函数声明有什么用处吗?

    大多数像我这样的 C 程序员都曾犯过以下错误 class C int main C c declares a function c taking no arguments returning a C not as intended by m
  • Java中无参数的for循环

    我在看别人的代码 发现了这段代码 for 我不是 Java 专家 这行代码在做什么 起初 我认为这会创建一个无限循环 但在该程序员使用的同一个类中 while true 其中 如果我错了 请纠正我 是一个无限循环 这两个相同吗 为什么有人会
  • 在 Java 中使用 Inflater 解压缩 gzip 数据

    我正在尝试使用以下方法解压缩 gzip 数据Inflater 根据文档 如果参数 nowrap 为 true 则 ZLIB 标头和校验和 字段将不会被使用 这提供了与 GZIP 和 PKZIP 使用的压缩格式 注意 使用 nowrap 选项
  • java Runtime.getRunTime().exec 和通配符?

    我正在尝试使用删除垃圾文件 Process p Runtime getRuntime exec 只要我不使用通配符 它 就可以正常工作 即 Process p Runtime getRuntime exec bin rm f specifi
  • 设置 JAVA_HOME 变量时出现问题

    所以我刚刚下载了 Android Studio 并尝试设置 JAVA HOME 变量以便我可以运行它 我使用的是 Windows 8 并按照我找到的所有说明进行操作 但无济于事 转到高级系统设置 gt 环境变量 然后使用包含我的 jre7
  • 处理照片上传的最佳方式是什么?

    我正在为一个家庭成员的婚礼制作一个网站 他们要求的一个功能是一个照片部分 所有客人都可以在婚礼结束后前往并上传他们的照片 我说这是一个很棒的想法 然后我就去实现它 那么只有一个问题 物流 上传速度很慢 现代相机拍摄的照片很大 2 5 兆 我
  • 链表中的虚拟节点

    问 什么时候使用它们 作业问题 列表中的第一个和最后一个节点 有时用作列表中的第一个和最后一个节点 从未用作列表中的第一个和最后一个节点 维基百科说 哨兵节点是与链接一起使用的专门指定的节点 列表和树作为遍历路径终止符 哨兵节点的作用是 不
  • 将变量从 jenkins 传递到 testng.xml

    我想根据从詹金斯传递的变量运行测试用例 例如 选择您要运行的测试用例 测试用例一 测试用例二 在 pom xml maven 中
  • 如何配置嵌入式 MongoDB 以在 Spring Boot 应用程序中进行集成测试?

    我有一个相当简单的 Spring Boot 应用程序 它公开一个小型 REST API 并从 MongoDB 实例检索数据 对 MongoDB 实例的查询通过基于 Spring Data 的存储库 下面的一些关键代码 Main applic
  • 安卓框架?

    是否有任何框架比构建 Android 应用程序更容易 您会对其中一个感兴趣吗 很快就会有 我正在开发 DroidFu 一个 Android 共享库 它将为您提供 活动 和服务 中直接提供大量实用功能 例如生成列表和错误对话框 检查 Inte

随机推荐

  • 霍夫曼压缩算法

    我已经使用霍夫曼算法实现了文件压缩 但我遇到的问题是 要启用压缩文件的解压缩 所使用的编码树或代码本身也应该写入文件 问题是 我该怎么做 在压缩文件的开头编写编码树的最佳方法是什么 霍夫曼编码有一个非常标准的实现基本压缩库 BCL http
  • 如何将表格视图单元格附件应用于表格视图记录

    解释 我有一个从 JSON 填充的 UITableView 表视图的目的是让用户选择单独的行记录并让复选标记附件显示为结果 问题是 虽然我可以让选中的行出现复选标记 但复选标记应用于该行 而不是记录本身 例如 如果我在 tableview
  • 在科学环境中进行编程实践? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 背景 去年 我在一所大学的物理研究小组实习 在这个组中 我们主要使用的是LabVIEW http en wikipedia org w
  • 如何模拟鼠标点击屏幕上的某个位置?

    我想做的是操纵鼠标 出于我自己的目的 这将是一个简单的宏 所以它会将我的鼠标移动到屏幕上的某个位置并单击 就像我以一定的间隔单击一样 这是使用非托管函数来模拟鼠标单击的代码 This is a replacement for Cursor
  • 选择框箭头样式

    我想让第二个选择框箭头与第一个选择框箭头相同 但我不知道为什么它们不同 因为我没有设置箭头的样式 在大多数情况下 浏览器和操作系统决定选择框的样式 仅用 CSS 来更改它们几乎是不可能的 您必须研究替代方法 主要技巧是应用appearanc
  • List的实现既是Set a List(序列)?

    我正在扩展 LinkedList 并实现 Set 这样我就有了一个没有重复项的列表 我想知道这样的实现是否还不存在 我所要做的就是覆盖add e 方法首先查找元素 如果存在则不添加它 就像是 add E if get E null supe
  • Resharper - 如何关闭“私有”访问修饰符?

    我不喜欢在访问修饰符之前放置 私有 无论如何 它们默认都是私有的 这只是视觉上的混乱 如何关闭 resharper 不断用 私人 标记所有内容的功能 锐锐9 1 ReSharper gt 选项 gt 代码编辑 gt C gt 代码样式 gt
  • OkHttp 不断收到 StreamResetException:流已重置:当它为 200 时,内部错误

    I got StreamResetException stream was reset INTERNAL ERROR来自 OkHttp 有什么问题 这是日志 I okhttp OkHttpClient lt 200 https www ex
  • 在 python 中使用 getattr

    The getattr函数定义如下 getattr 对象 名称 默认 返回对象的命名属性的值 名称必须是字符串 如果字符串是对象属性之一的名称 则结果是该属性的值 例如 getattr x foobar 相当于x foobar 如果指定的属
  • Spring Eureka 应用程序不显示仪表板

    有一个 Eureka Server 应用程序 EnableEurekaServer SpringBootApplication public class RegistrationModulesServiceApplication publi
  • 为什么要用耳朵而不是战争?

    I read this https stackoverflow com questions 3923514 ejb explanation ear vs war and this https stackoverflow com questi
  • 如何操作谷歌应用程序引擎数据存储中的文件

    我的问题围绕用户将文本文件上传到我的应用程序 我需要获取此文件并使用我的应用程序对其进行处理 然后再将其保存到数据存储区 从我所读到的一点来看 我了解到用户上传作为 blob 直接进入数据存储 如果我可以获取该文件 对其执行操作 意味着更改
  • CKEditor & JavaScript - 在 CKEditor 中调整高度和宽度

    如何在CKEditor中调整高度 这是我的 CKEditor 代码 在参数中添加高度和宽度设置 CKEDITOR replace content toolbar
  • E2E 测试 - WebdriverJS、Selenium 和 Jasmine

    好的 我遵循了几个略有不同的示例 正 如您在下面的注释代码中看到的那样 他们都声称可以工作 但我无法让它这样做 我在用着 selenium webdriver jasmine node reporter fix jasmine node e
  • 将数据从“datetime_select”转换为 DateTime 对象的 Rails 方法在哪里?

    当我使用在表单中 它会生成如下 HTML
  • Angular 6 应用程序在生产构建后重新加载时中断

    我有一个应用程序 我在其中保存了 dist 文件夹 该文件夹是在我的服务器上成功完成完整生产构建后获得的 一切正常 所有模块和组件都工作正常 直到我手动重新加载浏览器窗口 它才会抛出以下错误 我还使用 base href dist 构建了项
  • 自定义Prolog算术函数

    我正在寻找类似内置算术运算符的东西 它在 Prolog 中 特别是在 SWI Prolog 中 有返回值 例如 如果你跑A is 1 2 3 2 它返回A 8 我该如何定义func运算符做类似的事情 操作员 E g A is 2 func
  • 使用 SQLAlchemy declarative_base() 在 VS Code 中“继承‘Base’,这不是一个类”

    VS 代码显示 继承 Base 它不是一个类 作为错误消息 给出以下内容 from sqlalchemy ext declarative import declarative base from sqlalchemy import Inte
  • Cython“无法获取内存视图切片的地址”

    我在 Cython 中创建一个简单的类时遇到问题 与处理 C 包装器中数组的内存视图相关的文档很少 我想创建一个具有时间 x y 和 z 属性的数据类 我需要这些属性是数组 最终可以在 Python 中调用 我以前使用 numpy 类型进行
  • Java 中的本福德定律 - 如何将数学函数放入 Java 中

    我有一个快速的问题 我正在尝试用java制作一个欺诈检测应用程序 该应用程序将主要基于本福德定律 本福德定律非常酷 它基本上可以解释为在真实的金融交易中 第一个数字通常是 1 2 或 3 很少是 8 9 我还没能得到本福德公式翻译成可以在J