0

我知道有這樣的問題和一些解決方案,但我希望有另一種方法。顏色分割:一個更好的聚類分析,找到K

目標:最終目標是聚集給定圖像的顏色,然後允許用戶更改這些顏色。用戶不需要輸入任何k。該算法確定K

方法:目前,我正在使用側影評分指標(http://scikit-learn.sourceforge.net/dev/modules/generated/sklearn.metrics.silhouette_score.html#sklearn.metrics.silhouette_score)。我使用MiniBatchKMeans對圖像進行聚類,然後計算k(4-8)範圍內的silhouette_score。該代碼將是:

# silhouetteCoeff determination 
def silhouetteCoeff(z): 
max_silhouette = 0 
max_k = 0 
for i in range(4, 17): 
    clt = MiniBatchKMeans(n_clusters = i, random_state = 42) 
    clt.fit(z) 
    silhouette_avg = silhouette_score(z, clt.labels_, sample_size = 250, random_state = 42) 
    print("k: ", i, " silhouette avg: ", silhouette_avg) 
    if (silhouette_avg == 1.0): 
     max_k = i 
     break 
    elif (silhouette_avg > max_silhouette): 
     max_silhouette = silhouette_avg 
     max_k = i 
print("Max silhouette: ", max_silhouette) 
print("Max k: ", max_k) 
return int(max_k) 

即使我的色彩量化圖像事先(16種顏色),功能仍需要一個良好的6-8秒運行(假設圖像大小400×400)。

我的問題是,有沒有更好或更快的找到k的方法?我也試過彎頭法,但還是得計算一下SSE。從對某些圖像的測試中,我發現了一個很好的平均值k = 8。但是在更多顏色密集的圖像上,該算法會失去一些顏色。

回答

0

衡量你的瓶頸!

輪廓在O(n²)中,所以很有可能它會成爲您的方法的瓶頸。此外,k-means變體比sklearn中的變體速度快得多......所以有很多潛力讓事情變得更快。

Minibatch kmeans甚至不會收斂,但只是近似結果。只要我不能將所有數據保存在內存中,只要我能說清楚就可以了。

將調色板減少到只有16種顏色,根本沒有任何幫助。