【问题标题】:Need help improving this Python function for determining Mean Absolute Deviation (MAD)需要帮助改进此 Python 函数以确定平均绝对偏差 (MAD)
【发布时间】:2020-08-27 19:13:20
【问题描述】:
def what_is_mad(list_of_nums):
    xbar = what_is_mean(list_of_nums)
    for num in list_of_nums:
        value1 = list_of_nums[0]
        value2 = list_of_nums[1]
        value3 = list_of_nums[2]
        value4 = list_of_nums[3]
        test = abs(value1 - xbar) + abs(value2 - xbar) + abs(value3 - xbar) + abs(value4 - xbar)
        mad = test / xbar
    return int(mad)

what_is_mad(2, 2, 4, 4)

我正在尝试构建自己的纯 Python 函数来确定平均绝对偏差 (MAD),并希望获得一些关于如何增强此代码的建议。它目前仅限于四个值,如上所示,但我希望能够让函数摄取任意数量的值。提前致谢。

【问题讨论】:

  • for循环不是每次都计算相同的值吗?
  • 为什么要麻烦循环然后硬编码值?

标签: python function


【解决方案1】:
xbar = mean(list_of_nums)
test=0
for num in list of nums:
    test = test + abs(num - xbar)
mad = test/xbar
return int(mad)

这循环遍历列表并一次总结绝对偏差,然后进行疯狂的计算。

【讨论】:

  • 我在运行建议的代码时收到此错误。我认为这与先前用于确定我在当前函数中用于确定 MAD 的平均值的函数有关。如果这是有道理的。错误是零除法错误。
  • @Tweep,你的错误没有发生,但你当然可以使用你的 mean 函数。我只是在简写
  • 你得到零除法错误,因为你的公式是错误的。
【解决方案2】:

在优化解决方案方面,pandas 有一个方法。

mad_in = [1,2,3,4...]

mad_out = pandas.Series(mad_in).mad()

【讨论】:

  • OP 说他们正在构建一个纯 python 函数。知道 pandas 函数是 C 加速的吗?我知道有些熊猫是。
  • 我不确定,但我想这可能不符合他们纯 Python 函数的想法。
【解决方案3】:

这可以使用 python 的内置 sum 操作和列表理解在几行中完成

def what_is_mad(*list_of_nums):
    count = len(list_of_nums)
    mean = sum(list_of_nums) / count
    mad = sum((abs(num - mean) for num in list_of_nums)) / count
    return mad

【讨论】:

  • 你不是创建一个额外的列表来保存绝对偏差值吗?这只是浪费空间。您可以使用简单的 for 循环并节省空间。
  • @GayalKuruppu 我编辑删除列表,现在使用生成器来避免在内存中创建列表。虽然如果 OP 担心效率,我认为他们会使用 3rd 方库,这将比在 python 列表上操作更有效。
  • list_of_nums前面的*是什么?
  • 它允许您将任意数量的位置参数传递给what_is_mad,以便您可以按照您在问题中指定的方式调用它(即what_is_mad(2, 2, 4, 4),而不是传递列表或元组@987654326 @)。请参阅this 了解更多信息。
  • @jodag 您正在调用一个数字列表并期望它是 *args。如果他让我们看到数千个输入,他将如何传递 *args?最简单的方法是给出一个清单。你不是把事情复杂化了吗?
【解决方案4】:

您的代码中计算平均绝对偏差的方式(公式)是错误的。您应该计算所有绝对偏差,将它们相加并除以 list_of_sums 中的元素数量,而不是均值。如果你的意思是纯 python 不使用任何库,这段代码就可以了。

xbar = sum(list_of_nums)/len(list_of_nums)
dev = 0
for num in list_of_nums:
    dev = dev + abs(num - xbar)
mad = dev/len(list_of_nums)
print(mad)

您可以使用列表推导式并以更少的行数编写代码。但它会创建另一个列表,这将花费空间来存储它,因此没有优化。

否则,您可以使用 numpy、scipy 或 pandas,它们具有计算 MAD 的内置函数

【讨论】:

  • Gayal,你的意思是写mad = dev / len(list_of_sums),因为在这个代码块的任何地方似乎都没有定义测试。
  • @Tweep 立即尝试
  • 完美。谢谢盖尔!
  • @GayalKuruppu 您对列表理解不正确。您应该阅读生成器表达式。生成器表达式不需要额外的空间。
  • @jodag 我没有说任何关于生成器表达式的内容,只是关于列表推导(您当时在代码中使用的不是生成器表达式)。
猜你喜欢
  • 2015-07-03
  • 2017-08-09
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2021-04-19
  • 2020-06-08
  • 1970-01-01
相关资源
最近更新 更多