2016-08-09 7 views
5

Ich versuche das Gegenteil von this zu tun: Gegeben ein 2D Bild von (kontinuierlichen) Intensitäten, erzeuge einen Satz von unregelmäßig beabstandeten Akkumulationspunkten, dh Punkten, die die 2D Karte unregelmäßig bedecken näher beieinander in den Bereichen hoher Intensitäten (, aber ohne Überlappung!).Methode zum Berechnen unregelmäßig beabstandeter Akkumulationspunkte

Mein erster Versuch war "gewichtet" k-Mittel. Da ich keine funktionierende Implementierung von gewichteten K-Means fand, besteht die Art, wie ich die Gewichte einführe, darin, die Punkte mit hohen Intensitäten zu wiederholen. Hier ist mein Code:

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_ 

Hier sind zwei verschiedene Ergebnisse: 1) Die Verwendung aller Daten Pixel. 2) Verwendung von nur Pixeln über einem bestimmten Schwellenwert (RMS).

Without threshold

With threshold

Wie Sie die Punkte sehen scheint regelmäßigem Abstand zu werden als in Bereichen mit hoher Intensität konzentriert.

Also meine Frage ist, wenn es eine (deterministisch wenn möglich) bessere Methode zur Berechnung solcher Akkumulationspunkte gibt.

Antwort

1

Die Daten unter Verwendung von Quadtrees (https://en.wikipedia.org/wiki/Quadtree) in Einheiten gleicher Varianz partitionieren (oder vielleicht auch, um den Konzentrationswert zu nutzen?), Unter Verwendung eines definierten Threehold, dann einen Punkt pro Einheit (den Schwerpunkt) beibehalten. Es wird mehr Unterteilungen in Bereichen mit sich schnell ändernden Werten geben, weniger in den Hintergrundbereichen.

+0

Danke, das ist eine großartige Idee! Ich werde diese Methode studieren und versuchen, sie an meine Anforderungen anzupassen. – mavillan

Verwandte Themen