2017-08-23 52 views
2

我有许多问题和选择,用户将要回答。他们有这样的格式:如何为KMeans矢量化Json数据?

question_id, text, choices 

并为每个用户我保存回答问题,并选择的选择由每个用户在MongoDB中一个JSON:

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

现在我试图使用k - 意味着根据他们的问题选择寻找最相似的用户群集和流,但我需要将我的用户数据转换为一些向量编号,如Spark的文档here中的示例。

k均值的数据样本和我想要的输出:

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学习的尝试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中做到这一点?

在此先感谢。抱歉,我是数据科学新手。

+0

什么是您的阅读格式?你如何阅读你的数据?什么是类型? – eliasah

+0

@eliasah我会从mongodb读取它,它是json。这样我就需要加载问题和选择来首先生成矢量化器,然后通过用户使用矢量化器来转换他们的数据,我认为这非常有效。 –

+3

将您的JSON数据与您展示的K-Means样本数据关联起来有点困难。使用K-Means,您需要确保实际处理间隔或比率数据。如果您的数据是名义或有序的,您不能使用K-Means。但是,您可以使用K模式,该模式根据名义或有序数据的不相似性进行操作。相关论文:Joshua Zhexue Huang的“用k-模式聚类分类数据”和J.M.Peña等人的“用于K-Means算法的四种初始化方法的经验比较”。 – henrikstroem

回答

2

不要对分类数据使用K-Means。让我引用How to understand the drawbacks of K-means通过KevinKim

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

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

  • 对于所有k个簇的先验概率是相同的,即,每个集群具有观测的数量大致相等;如果这三个假设中的任何一个被违反,那么k-means将会失败。

随着编码分类数据的前两个假设几乎是肯定侵犯。

进一步讨论通过David Robinson看到K-means clustering is not a free lunch

我试图用K-均值聚类和流媒体根据自己的问题

对于相似性搜索使用MinHashLSH用近似的选择,找到最相似的用户加入:

您必须登录StringIndexOneHotEncode如下面的回答显示了所有的变量:

the comment看到henrikstroem

+1

这正是我在评论中在OP最后一个问题中指出的。 – eliasah