Иерархическая кластеризация с использованием косинусного расстояния в R - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу выполнить иерархическую кластеризацию, используя косинусное сходство с языком программирования R для совокупности документов, но я получил следующую ошибку:

Ошибка в if (is.na (n) || n> 65536L) stop («размер не может быть ни NA, ни превышать 65536»): пропущенное значение там, где необходимо TRUE / FALSE

Что мне делать?

Чтобы воспроизвести его, вотпример:

library(tm)
doc <- c( "The sky is blue.", "The sun is bright today.", "The sun in the sky is bright.", "We can see the shining sun, the bright sun." )
doc_corpus <- Corpus( VectorSource(doc) )
control_list <- list(removePunctuation = TRUE, stopwords = TRUE, tolower = TRUE)
tdm <- TermDocumentMatrix(doc_corpus, control = control_list)



tf <- as.matrix(tdm)
( idf <- log( ncol(tf) / ( 1 + rowSums(tf != 0) ) ) )
( idf <- diag(idf) )
tf_idf <- crossprod(tf, idf)
colnames(tf_idf) <- rownames(tf)

tf_idf

cosine_dist = 1-crossprod(tf_idf) /(sqrt(colSums(tf_idf^2)%*%t(colSums(tf_idf^2))))
cluster1 <- hclust(cosine_dist, method = "ward.D")

Тогда я получаю ошибку:

Ошибка в том, что (is.na (n) || n> 65536L) stop ("размер не может быть NAни превышать 65536 "): пропущенное значение, где требуется ИСТИНА / ЛОЖЬ

1 Ответ

0 голосов
/ 18 сентября 2018

Есть 2 проблемы:

1: cosine_dist = 1-crossprod(tf_idf) /(sqrt(colSums(tf_idf^2)%*%t(colSums(tf_idf^2)))) создает NaN, потому что вы делите на 0.

2: hclust нужен объект dist, а не просто матрица.См. ?hclust для получения более подробной информации

Обе проблемы могут быть решены с помощью следующего кода:

.....
cosine_dist = 1-crossprod(tf_idf) /(sqrt(colSums(tf_idf^2)%*%t(colSums(tf_idf^2))))

# remove NaN's by 0
cosine_dist[is.na(cosine_dist)] <- 0

# create dist object
cosine_dist <- as.dist(cosine_dist)

cluster1 <- hclust(cosine_dist, method = "ward.D")

plot(cluster1)

enter image description here

...