2017-01-03 364 views
0

我想使用DBSCAN和spark_sklearn對我的輸入數據進行聚類。我想在聚類後獲取每個輸入實例的標籤。可能嗎?使用DBSCAN和spark_sklearn對數據進行聚類

閱讀http://pythonhosted.org/spark-sklearn的文檔,我試過如下:

temp_data = Spark DataFrame containing 'key' and 'features' columns, 
      where 'features' is a Vector. 

ke = KeyedEstimator(sklearnEstimator=DBSCAN(), estimatorType="clusterer") 
print ke.getOrDefault("estimatorType") --> "clusterer" 

ke.fit_pedict(temp_data) --> ERROR: 'KeyedEstimator' object has no attribute 'fit_predict' 

k_model = ke.fit(temp_data) 
print k_model.getOrDefault("estimatorType") --> "clusterer" 

k_model.fit_pedict(temp_data) --> ERROR: 'KeyedModel' object has no attribute 'fit_predict' 

k_model.predict(temp_data) --> ERROR: 'KeyedModel' object has no attribute 'predict' 

k_model.transform(temp_data) --> ERROR: estimatorType assumed to be a clusterer, but sklearnEstimator is missing fit_predict() 
(NOTE: sklearn.cluster.DBSCAN actually have fit_predict() method) 

什麼我一般使用sklearn(無火花),是適合(dbscan_model.fit(temp_data-features)),並從模型(labels = dbscan_model.labels_)上設置標籤。如果我可以使用spark-sklearn獲得'labels_'屬性,那也沒關係。

如果上述調用('transform'或'predict')不起作用,是否可以在使用spark-sklearn擬合數據後獲得'labels_'?我怎樣才能做到這一點?假設我們獲得了'labels_',我怎樣才能將輸入實例映射到labels_?他們有相同的訂單嗎?

+0

避免使用繞過軟件的軟件......軟件將軟件包裝在軟件中......堆疊層殺死性能(而且pyspark已經有了緩慢的聲譽),並且你不再擁有所有的功能。 –

回答

0

只有在KMeans的情況下,我們可以預測集羣標籤,因爲scikit-learn估算器提供了這個功能。

不幸的是,對於其他一些羣集器例如DBSCAN來說情況並非如此。

+0

對於DBSCAN,有沒有辦法獲得輸入實例的集羣? sckit-learn允許達到'labels_'屬性。 – user2737636

0

我設法得到'labels_'屬性;但是我仍然不知道結果標籤的順序是否與輸入實例相同。

temp_data = Spark DataFrame containing 'key' and 'features' columns, 
     where 'features' is a Vector. 

ke = KeyedEstimator(sklearnEstimator=DBSCAN()) 
k_model = ke.fit(temp_data) 

def getLabels(model): 
    return model.estimator.labels_ 

labels_udf = udf(lambda x: getLabels(x).tolist(), ArrayType(IntegerType()))("estimator").alias("labels") 
res_df = km_dbscan.keyedModels.select("key", labels_udf) 
相關問題