【问题标题】:How to find Optimum value from the plot values python?如何从绘图值python中找到最佳值?
【发布时间】:2022-06-14 08:27:03
【问题描述】:

我有一个 python 字典

{'kValues': [2,   3,   4,   5,   6,   7,   8,   9,   10],
  'WSS': [21455, 5432, 4897, 4675, 4257, 3954, 3852, 3756, 3487],
  'SS': [0.75, 0.85, 0.7, 0.52, 0.33, 0.38, 0.42, 0.46, 0.47]}

当我针对 WSS 和 SS 绘制 kValues 时,我得到以下行

第一个图的最佳值是 k 值 = 3,第二个图的最佳值是 k 值 = 3

如何在不可视化图表的情况下从字典中提取 k 值

标准 - 第一个图总是有一个肘部,要提取肘点,第二个图总是有一个上升后下降,这提高了要提取的值

【问题讨论】:

  • 这些图的形状总是一样吗? WSS 和 SS?
  • 您在每种情况下的最佳标准是什么?然后,由于您只是在视觉上将其应用于系列,因此一旦您拥有最佳功能,您就可以在没有视觉效果的情况下做同样的事情。
  • 第一个图总是有一个肘部,要提取肘点,第二个图总是有一个上升后下降,即要提取上升值
  • 您可以使用 i-1 和 i+1 点的角度。这看起来是最优化的解决方案。

标签: python


【解决方案1】:

您可以使用 3 个点 p1、p2 和 p3 之间的角度,这只会有帮助,肘部接近 90 度的点和深部的 0 点。 我正在分享我的代码,规范化很棘手。

import math
kValues= [1 , 2 ,   3,   4,   5,   6,   7,   8,   9,   10]
WSS= [81000,21455, 5432, 4897, 4675, 4257, 3954, 3852, 3756, 3487]
SS=[0.75, 0.85, 0.7, 0.52, 0.33, 0.38, 0.42, 0.46, 0.47]

#get all the angles between k values as x and WSS as y
angles=[]
#each WSS slab values
normalize_wss=2000
for i in range(1,len(WSS)-1,1):
    p1=(kValues[i-1]*normalize_wss,WSS[i-1])
    p2=(kValues[i]*normalize_wss,WSS[i])
    p3=(kValues[i+1]*normalize_wss,WSS[i+1])
    #find angle between 3 points p1,p2,p3
    angle1=math.degrees(math.atan2(p3[1]-p2[1],p3[0]-p2[0]))
    angle2=math.degrees(math.atan2(p1[1]-p2[1],p1[0]-p2[0]))
    angles.append([angle1-angle2])
print(angles)

【讨论】:

    【解决方案2】:

    您可以使用导数找到 SS 中的峰值:

    import numpy as np
    k_ss = kValues[np.where(np.sign(np.diff(SS, append=SS[-1])) == -1)[0][0]]
    

    diff 计算元素之间的差异(导数),然后我们找到导数变化的第一个位置sign(超过峰值)。

    对于 WSS,它有点复杂,因为您必须定义一个阈值,这将定义一个肘部,您可以从数据中获取一些示例并使用它。这是一个将阈值设置为最大导数的 1/10 的代码:

    d = np.diff(WSS, append=WSS[-1])
    th = max(abs(d)) / 10
    k_wss = kValues[np.where(abs(d) < th)[0][0]]
    

    除此之外,您可以尝试将数据拟合到渐近曲线并提取常数

    【讨论】:

      【解决方案3】:

      找到了这个很棒的python库来找到最佳值

      https://pypi.org/project/kneed/

      from kneed import KneeLocator
      kneedle = KneeLocator(kValues, WSS, S=1.0, curve="convex", direction="decreasing")
      print(kneedle.knee)  # 3
      print(kneedle.elbow)  # 3
      

      可以根据图案配置曲线和方向

      【讨论】:

        猜你喜欢
        • 2023-01-27
        • 2017-08-12
        • 2015-06-29
        • 1970-01-01
        • 2012-06-11
        • 1970-01-01
        • 2021-06-15
        • 2022-12-06
        • 2014-02-06
        相关资源
        最近更新 更多