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).
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.
Danke, das ist eine großartige Idee! Ich werde diese Methode studieren und versuchen, sie an meine Anforderungen anzupassen. – mavillan