Я имею дело с DTM и хочу выполнить кластеризацию k-средних, иерархических и k-medoids. Могу ли я сначала нормализовать DTM? - PullRequest
1 голос
/ 07 мая 2020

Данные, AllBooks имеет 590 наблюдений 8266 переменных. Вот код, который у меня есть:

AllBooks = read_csv("AllBooks_baseline_DTM_Unlabelled.csv")
dtms = as.matrix(AllBooks)
dtms_freq = as.matrix(rowSums(dtms) / 8266)
dtms_freq1 = dtms_freq[order(dtms_freq),]
sd = sd(dtms_freq)
mean = mean(dtms_freq)

Это говорит мне, что мое среднее значение: 0,01242767 и мой std. разработчик составляет: 0,01305608

Итак, поскольку мое стандартное отклонение невелико, это означает, что данные имеют низкую изменчивость с точки зрения размера документов. Так мне DTM нормализовать не надо? Под нормализацией я подразумеваю использование функции масштабирования в R, которая вычитает среднее значение данных и делит его на стандартное отклонение.

Другими словами, мои большие вопросы: когда я должен стандартизировать данные (в частности, матрицу терминов документа) для целей кластеризации?

Вот небольшой вывод данных:

dput(head(AllBooks,10))
budding = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0), enjoyer = c(0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0), needs = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), sittest = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0), eclipsed = c(0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0), engagement = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    exuberant = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), abandons = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0), well = c(0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0), cheerfulness = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    hatest = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), state = c(0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0), stained = c(0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0), production = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), whitened = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0), revered = c(0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0), developed = c(0, 0, 0, 2, 0, 0, 0, 0, 0, 0), 
    regarded = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), enactments = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0), aromatical = c(0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0), admireth = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    ), foothold = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), shots = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0), turner = c(0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0), inversion = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    lifeless = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), postponement = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0), stout = c(0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0), taketh = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), kettle = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0), erred = c(0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0), thinkest = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), modern = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0), reigned = c(0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0), sparingly = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    visual = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), thoughts = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0), illumines = c(0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0), attire = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    explains = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -10L))

Вы можете просмотреть полные данные по ссылке: https://www.dropbox.com/s/p9v1y6oxith1prh/AllBooks_baseline_DTM_Unlabelled.csv?dl=0

1 Ответ

0 голосов
/ 08 мая 2020

У вас разреженный набор данных, в котором преобладают нули, поэтому стандартное отклонение очень низкое. Вы можете масштабировать его, если некоторые из ваших ненулевых счетчиков очень велики, например, некоторые из них равны 100, а другие - 1 и 2. вряд ли можно найти значимые центры. Может быть доступно несколько вариантов, проверьте эту ссылку на уменьшение размерности . Существуют также подходы на основе графиков, такие как это используется в биологии .

Ниже приведен simpleisti c способ кластеризации и визуализации:

x = read.csv("AllBooks_baseline_DTM_Unlabelled.csv")
# remove singleton columns
x = x[rowMeans(x)>0,colSums(x>0)>1]

Рассматривать его как двоичный и иерархический на двоичном расстоянии:

hc=hclust(dist(x,method="binary"),method="ward.D")
clus = cutree(hc,5)

Рассчитать PCA и визуализировать:

library(Rtsne)
library(ggplo2)

pca = prcomp(x,scale=TRUE,center=TRUE)
TS = Rtsne(pca$x[,1:30])
ggplot(data.frame(Dim1=TS$Y[,1],Dim2=TS$Y[,2],C=factor(clus)),
aes(x=Dim1,y=Dim2,col=C))+geom_point()

enter image description here

Кластер 5 кажется очень другим, и они отличаются этими словами:

names(tail(sort(colMeans(x[clus==5,]) - colMeans(x[clus!=5,])),10))
 [1] "wisdom" "thee"   "lord"   "things" "god"    "hath"   "thou"   "man"   
 [9] "thy"    "shall" 
...