gpt4 book ai didi

functional-programming - 标准 ML : Calculating the average of a given set

转载 作者:行者123 更新时间:2023-12-04 08:41:08 24 4
gpt4 key购买 nike

我最近的任务是计算标准机器学习中一组(由输入给出)的平均值。

这个想法是有一个像下面这样的函数,你输入一个实数列表并接收这些数字的平均值(也是一个实数),这样当你输入函数时终端会给出这个作为返回答案:

average = fn : real list -> real

我们也在教程中讨论过这个问题,但我想知道在标准机器学习中创建这样的函数时是否有某种技巧。

提前致谢!

最佳答案

将数字相加并除以长度。一个简单的递归 sum通常是您在任何 SML 教程中都会看到的第一个示例之一。您需要具有 sum 的空列表基础案例评估为 0.0而不是 0确保返回类型是 real .一旦你定义了 sum函数然后你可以定义 average在 1 行中使用 sum和内置 length功能。一个微妙之处在于,SML 不允许实数除以整数。您可以使用转换函数 Real.fromInt在总和除以它之前的长度。将同一个列表传递两次会有些低效,一次是求和,一次是计算它的长度,但是当你第一次学习这门语言时,没有理由担心这些事情。

在编辑上:由于您找到了一个自然的解决方案并在评论中分享了它,这里有一个更惯用的版本,它计算一次遍历列表的平均值:

fun average nums =
let
fun av (s,n,[]) = s/Real.fromInt(n)
| av (s,n,x::xs) = av (s+x,n+1,xs)
in
av (0.0, 0, nums)
end;

它通过定义一个帮助函数来完成繁重的工作。这些在函数式编程中被广泛使用。在没有可变状态的情况下,一个常见的技巧是显式地将数量作为参数传递,这些数量将被命令式语言中的相应循环连续修改。此类参数通常称为 accumulators因为他们通常会积累不断增长的列表、运行总和、运行产品等。这里 sn是累加器,带有 s元素和 n列表的长度。在 (s,n,[]) 的基础案例中没有什么可累积的,因此返回最终答案。在非基本情况下, (s,n,x::xs) , sn被适当修改并与列表的尾部一起传递给辅助函数。 av的定义是 tail-recursive因此将以循环的速度运行而不增加堆栈。唯一的一点就是整体 average函数需要做的是用适当的初始值调用辅助函数。 let ... helper def ... in ... helper called with start-up values ...end是一个常用的习惯用法,用于防止程序的顶层被辅助函数弄乱。

关于functional-programming - 标准 ML : Calculating the average of a given set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33319795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com