【问题标题】:A quick way to compute the average of multiple timeseries?计算多个时间序列平均值的快速方法?
【发布时间】:2013-07-22 07:49:03
【问题描述】:

我正在使用 Numpy 在 Python 中编写 K-Means 算法。到所有质心的距离部分非常优化(使用质心矩阵而不是单独计算每个质心),但我正在努力计算新质心部分。我正在从数据集中复制每个质心的数据来计算平均值。

我认为不复制会更快。如何在 Python/Numpy 中执行此操作?

代码sn-p:

    for c_i in range(k):
        sub_data = np.zeros([n_per_c[c_i],data_width])

        sub_data_i = 0
        for data_i in range(data_length):
            if label[data_i] == c_i:                    
                sub_data[sub_data_i,:] = data[data_i,:]
                sub_data_i += 1

        c[c_i] = np.mean(sub_data, axis=0)

c 是我拥有的质心列表,data 是整个数据集,label 是带有类标签的列表。

【问题讨论】:

    标签: python numpy k-means


    【解决方案1】:

    我认为以下代码与您的代码相同,没有任何显式中间数组:

    for c_i in range(k):
        c[c_i] = np.mean(data[label == c_i, :], axis=0)
    

    摆脱最后一个循环更加困难,但这应该可行:

    label_counts = np.bincount(label)
    label_sums = np.histogram2d(np.repeat(label, data_length),
                                np.tile(np.arange(data_length), k),
                                bins=(k, data_length),
                                weights=data.ravel())[0]
    c = label_sums / label_count[:, None]
    

    【讨论】:

    • 谢谢詹姆!第一个解决方案已经将代码从 1 分钟加速到不到 1 秒。你能解释一下第二种解决方案的作用吗?我真的无法理解它。
    • label_counts 是每个标签出现次数的计数。我知道需要每个标签和列的值的总和。 data.ravel() 是您的 data 数组扁平化,所有行一个接一个地连接。 np.repeat(label, data_length) 索引每个单独数据条目的标签。同样,np.tile(np.arange(data_length), k) 索引列号。使用该大小的 bin 对 np.histogram2d 的调用只是将具有相同标签和列的所有值相加,并以正确的形状返回。最后,将这些总和除以计数,将计数广播到整行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2021-08-18
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多