如何为KMeans矢量化json数据?

时间:2017-08-23 09:16:42

标签: apache-spark scikit-learn pyspark k-means

我有许多问题和选择,用户将要回答。它们的格式如下:

question_id, text, choices

对于每个用户,我将每个用户的已回答问题和选择的选项存储为mongodb中的json:

{user_id: "",  "question_answers" : [{"question_id": "choice_id", ..}] }

现在我尝试使用K-Means聚类和流媒体来根据他们的问题选择找到大多数类似的用户,但我需要将我的用户数据转换为一些矢量数字,如Spark中的示例文档here

kmeans数据样本和我想要的输出:

0.0 0.0 0.0
0.1 0.1 0.1
0.2 0.2 0.2
9.0 9.0 9.0
9.1 9.1 9.1
9.2 9.2 9.2

我已经尝试过使用scikit-learn的DictVectorizer,但它似乎并没有正常工作。

我为每个question_choice组合创建了一个键,如下所示:

from sklearn.feature_extraction import DictVectorizer
v = DictVectorizer(sparse=False)
D = [{'question_1_choice_1': 1, 'question_1_choice_2': 1}, ..]
X = v.fit_transform(D)

我尝试将用户的每个问题/选择对转换为:

v.transform({'question_1_choice_2': 1, ...})

我得到了这样的结果:

[[ 0.  1.  0.  0.  0.  0.  0.  0.  0.  0.]]

这是正确的做法吗?因为我需要每次创建所有选择和答案的词典。有没有办法在Spark中做到这一点?

提前致谢。对不起,我是数据科学的新手。

1 个答案:

答案 0 :(得分:2)

不要将K-Means与分类数据一起使用。让我How to understand the drawbacks of K-means引用KevinKim

  
      
  • k-means假设每个属性(变量)的分布方差是球形的;

  •   
  • 所有变量具有相同的方差;

  •   
  • 所有k个簇的先验概率是相同的,即每个簇具有大致相等的观察数量;如果违反了这3个假设中的任何一个,则k-means将失败。

  •   

使用编码的分类数据,前两个假设几乎肯定会被违反。

有关进一步的讨论,请参阅K-means clustering is not a free lunch David Robinson

  

我尝试使用K-Means群集和流媒体根据他们的问题选择找到最相似的用户

对于相似性搜索,请使用MinHashLSH和近似连接:

您需要StringIndexOneHotEncode所有变量,如以下答案所示:

请参阅the comment henrikstroem