gpt4 book ai didi

python - 使用 Python 在优化曲线上找到 "elbow point"

转载 作者:行者123 更新时间:2023-11-28 21:35:55 25 4
gpt4 key购买 nike

我有一个点列表,它们是 kmeans 算法的惯性值。
为了确定最佳集群数量,我需要找到这条曲线开始变平的点。

数据示例

以下是我的值列表的创建和填充方式:

sum_squared_dist = []
K = range(1,50)
for k in K:
km = KMeans(n_clusters=k, random_state=0)
km = km.fit(normalized_modeling_data)
sum_squared_dist.append(km.inertia_)

print(sum_squared_dist)

我怎样才能找到一个点,这条曲线的节距增加(曲线正在下降,所以一阶导数为负)?

我的方法
derivates = []
for i in range(len(sum_squared_dist)):
derivates.append(sum_squared_dist[i] - sum_squared_dist[i-1])

我想使用肘部方法找到任何给定数据的最佳聚类数。有人可以帮助我如何找到惯性值列表开始变平的点吗?

编辑
数据点:
[7342.1301373073857, 6881.7109460930769, 6531.1657905495022,  
6356.2255554679778, 6209.8382535595829, 6094.9052166741121,
5980.0191582610196, 5880.1869867848218, 5779.8957906367368,
5691.1879324562778, 5617.5153566271356, 5532.2613232619951,
5467.352265375117, 5395.4493783888756, 5345.3459908298091,
5290.6769823693812, 5243.5271656371888, 5207.2501206569532,
5164.9617535255456]

图形:
graph

最佳答案

我在 a Python package 之后研究了 Kneedle algorithm 。它发现 x=5 作为曲线开始变平的点。文档和论文更详细地讨论了选择拐点的算法。

y = [7342.1301373073857, 6881.7109460930769, 6531.1657905495022,  
6356.2255554679778, 6209.8382535595829, 6094.9052166741121,
5980.0191582610196, 5880.1869867848218, 5779.8957906367368,
5691.1879324562778, 5617.5153566271356, 5532.2613232619951,
5467.352265375117, 5395.4493783888756, 5345.3459908298091,
5290.6769823693812, 5243.5271656371888, 5207.2501206569532,
5164.9617535255456]

x = range(1, len(y)+1)

from kneed import KneeLocator
kn = KneeLocator(x, y, curve='convex', direction='decreasing')
print(kn.knee)
5

import matplotlib.pyplot as plt
plt.xlabel('number of clusters k')
plt.ylabel('Sum of squared distances')
plt.plot(x, y, 'bx-')
plt.vlines(kn.knee, plt.ylim()[0], plt.ylim()[1], linestyles='dashed')

knee point

关于python - 使用 Python 在优化曲线上找到 "elbow point",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51762514/

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