2017-01-03 27 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) 
相关问题