Python3中概率分布的模糊集建模

2024-04-26 05:33:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一系列带有python3的示例值构建一个模糊集。在

例如,给定[6, 7, 8, 9, 27]我想获得一个函数:

  • 从0到5ca返回0.0
  • 从5ca逐渐上升到6
  • 从6到9保持在{}
  • 从9到10ca逐渐下降到{}
  • 从10ca到26ca停留在{}
  • 从26ca逐渐上升到27
  • 从27到28ca逐渐下降到{}
  • 从28ca及其后返回0.0。在

请注意,y值始终在[0.0, 1.0]范围内,如果一个序列缺少一个值,则该值的y为0.0。在

请考虑在最一般的情况下,输入值可能类似于[9, 41, 20, 13 ,11, 12, 14, 40, 4, 4, 4, 3, 34, 22](值总是可以排序的,但是请注意,在本系列中,4重复了3次,因此我希望概率为1,而所有其他值的概率值都较低——不一定是本例中的1/3)。在

Desired result

此图的顶部显示了绘制到x=16(手绘)的所需函数。我很乐意得到这样的东西。 图片的底部显示了一些额外的功能,这是很好的,但不是严格的强制要求:

  • 比我的图(A)中显示的更平滑
  • 累积效应(B),前提是。。。在
  • 函数永远不会超过1(C)并且。。。在
  • 函数永远不会低于0(D)。在

例如,我尝试过一些改编自polyfitbeziergauss或{a5}的方法,但结果并不是我预期的那样。 我也尝试过使用包^{},但我无法使其工作,因为它依赖于epydoc,这似乎与python3不兼容。对StatModels也没有运气。在

有人能建议如何实现预期的功能吗?提前谢谢。在

如果您想知道,我计划使用结果函数来预测给定值的可能性;对于上面描述的模糊集,例如,4.0返回0.0,6.5返回1.0,5.8类似于0.85。也许还有其他更简单的方法?在


这就是我通常处理输入值的方式(不确定是否需要添加0s的部分),有什么可以代替???来计算所需的f?在

def prepare(values, normalize=True):
    max = 0
    table = {}
    for value in values:
        table[value] = (table[value] if value in table else 0) + 1
        if normalize and table[value] > max:
            max = table[value]

    if normalize:
        for value in table:
           table[value] /= float(max)

    for value in range(sorted(table)[-1] + 2):
        if value not in table:
            table[value] = 0

    x = sorted(table)
    y = [table[value] for value in x]
    return x, y

if __name__ == '__main__':
    # get x and y vectors
    x, y = prepare([9, 41, 20, 13, 11, 12, 14, 40, 4, 4, 4, 3, 34, 22], normalize=True)

    # calculate fitting function
    f = ???

    # calculate new x's and y's
    x_new = np.linspace(x[0], x[-1], 50)
    y_new = f(x_new)

    # plot the results
    plt.plot(x, y, 'o', x_new, y_new)
    plt.xlim([x[0] - 1, x[-1] + 1])
    plt.show()

    print("Done.")

一个实际的例子,只是为了阐明这一点的动机。。。 这一系列的数值可能是人们放弃在售货亭前排队的分钟数。。。有了这样一个模型,我们可以通过知道等待了多长时间来预测某人离开队列的可能性。以这种方式读取的值可以被解除模糊化,例如在happily waiting[0.00,0.33],just waiting(0.33,0.66]和{}(0.66,1.00])。在about to leave的情况下,某人可能被某事(和广告?)所吸引说服他留下来。在


Tags: and函数innewforifvaluetable
2条回答
def pulse(x):
    return np.maximum(0, 1 - abs(x))

def fuzzy_in_unscaled(x, xs):
    return pulse(np.subtract.outer(x, xs)).sum(axis=-1)

def fuzzy_in(x, xs):
    largest = fuzzy_in_unscaled(xs, xs).max()
    return fuzzy_in_unscaled(x, xs) / largest
^{pr2}$

这利用了峰值必须在元素上的事实。并非所有pulse函数都是这样。在

你最好先计算largest,因为它是O(N^2)

这只对一组整数有效(由于np.bincount)。在

def fuzzy_interp(x, vals):
    vmn, vmx = np.amin(vals), np.amax(vals)
    v = vals - vmn + 1
    b = np.bincount(v, minlength = vmx - vmn + 2)
    b = b / np.amax(b)
    return np.interp(x - vmn - 1, np.arange(b.size), b, left = 0, right = 0)

相关问题 更多 >