有没有一种科学的方法来对这个问题的连续数字进行分组

数据挖掘 Python 聚类
2022-03-06 23:31:33

我使用 python,我有一个包含 19 个元素的数字列表,我想将此列表分成 6 个或更少的组。

该列表可能包含 0 和 1 之间的数字。它不能被订购,我需要保持它的形式并被切断

列表:

Numbers :  [[ 0.867   - 0.808   - 0.740    - 0.746    - 0.674   - 0.669   -
              0.648   - 0.722   - 0.781    - 0.612    - 0.575   - 0.566   -
              0.500   - 0.555   - 0.818    - 0.800    - 0.500   - 0.500   - 0.666 ]]   

我想得到像这样的集群:

A: [[ 0.867   - 0.808   - 0.740    - 0.746 ]]

B: [[ 0.674   - 0.669   - 0.648 ]]

C: [[ 0.722   - 0.781 ]]

D: [[ 0.612   - 0.575   - 0.566    - 0.500    - 0.555  ]]

E: [[ 0.818   - 0.800 ]]

F: [[ 0.500   - 0.500    - 0.666 ]]

我用眼睛分裂,为此,我要求一种科学的方法来实现我的目标。

  • 关于我如何定义这些集群:

我有一个从额外函数中获得的值,它等于 0.80。我需要将列表中的每个值与 0.80 进行比较以了解差异。

进行比较后,我得到下表

Numbers      Difference_0.80
0.867            +0.06 
0.808             0.0
0.740            -0.06
0.746            -0.06

0.674            -0.13
0.669            -0.14
0.648            -0.16

0.722            -0.08
0.781            -0.02

0.612            -0.19
0.575            -0.23
0.566            -0.24
0.500            -0.3
0.555            -0.25

0.818            +0.01
0.800             0.0

0.500            -0.3
0.500            -0.3
0.666            -0.14

当我尝试聚类方法(n_clusters = 2)时,我得到了:

0   category_Kk-mean
0.867   0
0.808   0
0.740   0
0.746   0
0.674   1
0.669   1
0.648   1
0.722   0
0.781   0
0.612   1
0.575   1
0.566   1
0.500   1
0.555   1
0.818   0
0.800   0
0.500   1
0.500   1
0.666   1

但是我也想知道这个类别(D)比类别(B)有很大的减少:

category D
0.612   1
0.575   1
0.566   1
0.500   1
0.555   1
Category B

0.674   1
0.669   1
0.648   1

我尝试使用 n_clusters=3 但结果非常糟糕

统计或数学中是否有任何方法可以帮助我获得它

1个回答

因为您关心排序,所以您可以在二维中表示您的点(其中 x 坐标只是重新调整的序列号)并应用 K-means。


import numpy as np

numbers = np.array([0.867, 0.808, 0.740, 0.746, 0.674, 
                    0.669, 0.648, 0.722, 0.781, 0.612, 
                    0.575, 0.566, 0.500, 0.555, 0.818, 
                    0.800, 0.500, 0.500, 0.666])

#you can experiment with other step sizes
step_size = (numbers.max() - numbers.min())/len(numbers)
numbers2d = np.array([(step_size * i,x) for (i,x) in enumerate(numbers - 0.8)])

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=6)
kmeans.fit(numbers2d) #random init - possibly different result each time

print(kmeans.labels_)

import matplotlib.pyplot as plt

for cluster in set(kmeans.labels_):
    x = np.where(kmeans.labels_==cluster)[0]
    y = numbers[x]
    x = numbers2d[:,0][x]
    plt.scatter(x,y)

plt.show()

输出:

[3 3 3 3 1 1 1 1 1 4 4 4 4 4 5 5 2 2 0]

在此处输入图像描述