如何找到一维数据中的簇数和每个簇的平均值

机器算法验证 分布 聚类 算法
2022-03-29 05:50:27

我们有一个价格列表,需要找到集群(或区间)的数量和每个集群(或区间)的平均价格。唯一的限制是我们希望集群均值彼此之间至少有 X 距离。

K-means 似乎不起作用,因为它需要指定集群的数量作为输入。

发现这些的原因是价格成为一个“重要”集群,具有更多数据点作为交易的支撑位和阻力位。目前,这个过程是通过简单的人工观察图表上的价格集群来完成的。但这里的目的是在算法中对此进行量化,使其更加客观和可衡量。

3个回答

不要在一维数据上运行聚类(例如 k-means)。

为什么:一维数据可以排序利用排序的算法比不利用排序的算法效率更高。

看看经典统计

忘记诸如“数据挖掘”和“集群”之类的流行语吧!

对于您的任务,我建议您使用内核密度估计这是一种从统计学中得到充分证明的技术,而且非常灵活。要对数据进行聚类,请在密度估计中查找最大值最小值以拆分数据。它速度快,并且比聚类分析具有更强大的理论背景。

何时使用聚类分析

本质上,使用聚类分析,当您的数据如此庞大和复杂时,您无法再使用经典的统计建模。当您有太多变量和太复杂的过程来建模它们时。当密度估计不再起作用时。当您无法再可视化数据时。

即使在二维数据中,也不要进行聚类分析。可视化您的数据,并手动标记您的集群。k-means等方法无论如何都会产生k-cluster结果;即使您的数据集中没有集群!因为他们盲目地优化了一些数学方程,没有进行实际检查。如果您手动对数据进行聚类,您的结果将更有意义。

XMeans算法可用于直接从数据中估计聚类总数,无需人工指导。Weka 包一个Java 实现期望最大化算法也可以用于自动估计集群的总数。有一个 Weka 实现此外,如果您更喜欢以这种方式而不是在 Java 中进行分析,那么至少有一个单独的贡献者版本(即未经 mathworks.com 批准)用于在 MATLAB 中执行高斯混合模型聚类。

您可以只估计价格的概率密度函数。如果它们是正态分布的混合,希望您会在混合的高斯核中观察到几个峰值。它可以用 Python 轻松实现,我相信也有其他语言的包。

from scipy.stats import kde
import matplotlib.pyplot as plt     
density = kde.gaussian_kde(x) # x: list of price
xgrid = np.linspace(x.min(), x.max(), Num_Price)   
plt.plot(xgrid, density(xgrid))
plt.show()