计算不规则间隔累积点的方法

时间:2016-08-09 02:47:56

标签: python numpy scikit-learn

我试图与this相反:给定(连续)强度的2D图像,生成一组不规则间隔的累积点,即不规则地覆盖2D地图的点,更接近每个其他在高强度区域(但没有重叠!)。

我的第一次尝试是"加权" K均值。由于我没有找到加权k均值的工作实现,我引入权重的方式包括重复高强度的点。这是我的代码:

import numpy as np
from sklearn.cluster import KMeans

def accumulation_points_finder(x, y, data, n_points, method, cut_value):
    #computing the rms
    rms = estimate_rms(data)
    #structuring the data
    X,Y = np.meshgrid(x, y, sparse=False)
    if cut_value > 0.:
        mask = data > cut_value
        #applying the mask
        X = X[mask]; Y = Y[mask]; data = data[mask]
        _data = np.array([X, Y, data])
    else:
        X = X.ravel(); Y = Y.ravel(); data = data.ravel()
        _data = np.array([X, Y, data])

    if method=='weighted_kmeans':
        res = []
        for i in range(len(data)):
            w = int(ceil(data[i]/rms))
            res.extend([[X[i],Y[i]]]*w)
        res = np.asarray(res)
        #kmeans object instantiation
        kmeans = KMeans(init='k-means++', n_clusters=n_points, n_init=25, n_jobs=2)
        #performing kmeans clustering
        kmeans.fit(res)
        #returning just (x,y) positions
        return kmeans.cluster_centers_

以下是两个不同的结果:1)利用所有数据像素。 2)仅使用高于某个阈值(RMS)的像素。

Without threshold

With threshold

正如您所看到的那样,点的间距似乎比高强度区域更集中。

所以我的问题是否存在(确定性的,如果可能的话)更好的方法来计算这样的积累点。

1 个答案:

答案 0 :(得分:1)

使用四叉树(https://en.wikipedia.org/wiki/Quadtree)将数据划分为相等方差单位(或者也可以使用浓度值?),使用定义的threhold,然后保持每单位一个点(质心) 。价值快速变化的区域将会有更多细分,背景区域将更​​少。