2017-08-23 32 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