0
我有使用tm
包創建的文檔的語料庫,並且我使用相同的包製作了文檔術語矩陣。我想用k-means聚類來聚集文檔。我使用歐幾里德距離,所以我首先對矢量進行歸一化處理,以使歐幾里得變得有意義。但是,規範化時,它會爲一個特定文檔創建'NaN'值,我不知道爲什麼。該代碼使用:R中的K均值聚類:規範化DTM創建'NaN'
m = dtm
norm_eucl = function(m) m/apply(m, MARGIN=1, FUN=function(x) sum(x^2)^.5)
m_norm = norm_eucl(m)
cl = kmeans(m_norm, 2)
當我看着m_norm
,它說,(例如):
Terms term1 term2
Docs
1 0.2568640 0.8650674
2 0.6204346 0.0000000
3 NaN NaN
4 0.0000000 0.6543098
所以文獻3中, '男' 值。當然,當我嘗試使用k-means時,會拋出以下錯誤:
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)
因爲它無法處理'NaN'值。但是,我不明白爲什麼這些'NaN'值是首先創建的?
編輯: 當我看apply(m, MARGIN=1, FUN=function(x) sum(x^2)^.5)
從norm_eucl
功能的上方,用於文檔3的值是零。所以它試圖用零除,這當然是不可能的。但有誰知道爲什麼這是零和如何解決這個問題,所以kmeans仍然有可能?
如果文檔3中沒有條款,那就刪除它。至於爲什麼它沒有條款,我們必須看看你如何處理你的語料庫和數據。可能的原因:1)只有稀疏條款會被刪除,如果您按稀疏過濾。 2)只有停用詞,數字和/或標點符號。 3)沒有正確讀入語料庫,最後空了。 – emilliman5