我有一个使用tm
包创建的文档语料库,我使用相同的包创建了一个文档术语矩阵。我想使用k-means聚类来聚类文档。我使用欧几里德距离,所以我首先将向量归一化,使欧几里得有意义。但是,在规范化时,它会产生“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中包含了NaN'值。当然,当我尝试使用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的值为零。所以它试图除以零,这当然是不可能的。但是,有谁知道为什么这是零,如何解决这个问题仍然可能吗?
答案 0 :(得分:0)
也许该文档为空?
然后它将具有标准0,并且你得到一个NaN。
检查您的预处理,但可能只是删除不良文档。