我有许多问题和选择,用户将要回答。它们的格式如下:
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中做到这一点?
提前致谢。对不起,我是数据科学的新手。
答案 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
和近似连接:
您需要StringIndex
和OneHotEncode
所有变量,如以下答案所示: