gpt4 book ai didi

algorithm - 两点之间的对数分布曲线的正确算法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:48:32 25 4
gpt4 key购买 nike

我已经阅读了很多关于生成 tagcloud 权重的对数分布的正确方法的教程。他们中的大多数将标签分组为步骤。这对我来说似乎有些愚蠢,所以我根据我所读的内容开发了自己的算法,以便它沿着阈值和最大值之间的对数曲线动态分布标签的计数。这是它在 python 中的本质:

from math import log
count = [1, 3, 5, 4, 7, 5, 10, 6]
def logdist(count, threshold=0, maxsize=1.75, minsize=.75):
countdist = []
# mincount is either the threshold or the minimum if it's over the threshold
mincount = threshold<min(count) and min(count) or threshold
maxcount = max(count)
spread = maxcount - mincount
# the slope of the line (rise over run) between (mincount, minsize) and ( maxcount, maxsize)
delta = (maxsize - minsize) / float(spread)
for c in count:
logcount = log(c - (mincount - 1)) * (spread + 1) / log(spread + 1)
size = delta * logcount - (delta - minsize)
countdist.append({'count': c, 'size': round(size, 3)})
return countdist

基本上,如果不对个体计数进行对数计算,它会在点 (mincount, minsize) 和 (maxcount, maxsize) 之间生成一条直线。

该算法很好地近似了两点之间的曲线,但有一个缺点。 mincount 是一个特例,它的对数为零。这意味着 mincount 的大小将小于 minsize。我曾尝试编造数字来尝试解决这种特殊情况,但似乎无法解决问题。目前,我只是将 mincount 视为一种特殊情况,并将“or 1”添加到 logcount 行。

有没有更正确的算法来画两点之间的曲线?

3 月 3 日更新:如果我没记错的话,我正在记录计数,然后将其代入线性方程。换句话说,在 y=lnx 中,x=1,y=0 时,对特殊情况进行描述。这就是 mincount 发生的情况。但 mincount 不能为零,标签未被使用 0 次。

尝试代码并插入您自己的数字进行测试。将 mincount 视为特例对我来说很好,我觉得这比解决这个问题的任何实际解决方案都要容易。我只是觉得必须对此有一个解决方案,而且可能有人想出了一个解决方案。

4 月 6 日更新:一个简单的 google搜索出现了很多我读过的教程,但是 this可能是最完整的阶梯标签云示例。

4 月 28 日更新:响应 antti.huima 的解决方案:绘制图形时,您的算法创建的曲线位于两点之间的线下方。我一直在尝试调整周围的数字,但似乎仍然无法想出一种方法将该曲线翻转到该线的另一侧。我猜想如果将函数更改为某种形式的对数而不是指数,它将完全满足我的需要。那是对的吗?如果是这样,谁能解释如何实现这一目标?

最佳答案

感谢 antti.huima 的帮助,我重新思考了我想做的事情。

采用他的解题方法,我想要一个等式,其中 mincount 的对数等于两点之间的线性方程。

weight(MIN) = ln(MIN-(MIN-1)) + min_weight
min_weight = ln(1) + min_weight

虽然这给了我一个很好的起点,但我需要让它通过点 (MAX, max_weight)。它需要一个常量:

weight(x) = ln(x-(MIN-1))/K + min_weight

求解 K 我们得到:

K = ln(MAX-(MIN-1))/(max_weight - min_weight)

因此,将这一切放回到一些 python 代码中:

from math import log
count = [1, 3, 5, 4, 7, 5, 10, 6]
def logdist(count, threshold=0, maxsize=1.75, minsize=.75):
countdist = []
# mincount is either the threshold or the minimum if it's over the threshold
mincount = threshold<min(count) and min(count) or threshold
maxcount = max(count)
constant = log(maxcount - (mincount - 1)) / (maxsize - minsize)
for c in count:
size = log(c - (mincount - 1)) / constant + minsize
countdist.append({'count': c, 'size': round(size, 3)})
return countdist

关于algorithm - 两点之间的对数分布曲线的正确算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/604953/

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