首页 文章

在python中通过它们的接近度聚类值(机器学习?)[重复]

提问于
浏览
11

这个问题在这里已有答案:

我有一个在一组对象上运行的算法 . 该算法产生一个得分值,用于指示集合中元素之间的差异 .

排序后的输出是这样的:

[1,1,5,6,1,5,10,22,23,23,50,51,51,52,100,112,130,500,512,600,12000,12230]

如果您将这些值放在电子表格中,您会看到它们组成了组

[1,1,5,6,1,5] [10,22,23,23] [50,51,51,52] [100,112,130] [500,512,600] [12000,12230]

有没有办法以编程方式获得这些分组?

也许一些使用机器学习库的聚类算法?还是我在思考这个?

我看过scikit,但他们的例子对我的问题来说太先进了......

3 回答

  • 16

    如果您不知道群集的数量,那么这是一个很好的选择 MeanShift

    import numpy as np
    from sklearn.cluster import MeanShift, estimate_bandwidth
    
    x = [1,1,5,6,1,5,10,22,23,23,50,51,51,52,100,112,130,500,512,600,12000,12230]
    
    X = np.array(zip(x,np.zeros(len(x))), dtype=np.int)
    bandwidth = estimate_bandwidth(X, quantile=0.1)
    ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
    ms.fit(X)
    labels = ms.labels_
    cluster_centers = ms.cluster_centers_
    
    labels_unique = np.unique(labels)
    n_clusters_ = len(labels_unique)
    
    for k in range(n_clusters_):
        my_members = labels == k
        print "cluster {0}: {1}".format(k, X[my_members, 0])
    

    此算法的输出:

    cluster 0: [ 1  1  5  6  1  5 10 22 23 23 50 51 51 52]
    cluster 1: [100 112 130]
    cluster 2: [500 512]
    cluster 3: [12000]
    cluster 4: [12230]
    cluster 5: [600]
    

    修改 quantile 变量可以更改聚类编号选择条件

  • 17

    不要将聚类用于1维数据

    聚类算法是针对多变量数据而设计的 . 当你有一维数据时, sort 它,并寻找 largest gaps . 这在1d中是微不足道的,并且在2d中是不可能的 . 如果您想要更高级的东西,请使用核密度估计(KDE)并查找本地最小值来分割数据集 .

    这个问题有很多重复:

  • 3

    您可以使用群集对这些进行分组 . 诀窍是要了解数据有两个维度:您可以看到的维度,以及看起来像[1,2,3 ... 22]的"spatial"维度 . 您可以在_376313中创建此矩阵,如下所示:

    import numpy as np
    
    y = [1,1,5,6,1,5,10,22,23,23,50,51,51,52,100,112,130,500,512,600,12000,12230]
    x = range(len(y))
    m = np.matrix([x, y]).transpose()
    

    然后,您可以在矩阵上执行聚类,其中:

    from scipy.cluster.vq import kmeans
    kclust = kmeans(m, 5)
    

    kclust的输出将如下所示:

    (array([[   11,    51],
           [   15,   114],
           [   20, 12115],
           [    4,     9],
           [   18,   537]]), 21.545126372346271)
    

    对你而言,最有趣的部分是矩阵的第一列,它表示x维度中心的位置:

    kclust[0][:, 0]
    # [20 18 15  4 11]
    

    然后,您可以根据它们最接近的五个中心中的哪一个将您的点分配到群集:

    assigned_clusters = [abs(cluster_indices - e).argmin() for e in x]
    # [3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 2, 2, 2, 2, 1, 1, 0, 0, 0]
    

相关问题