首页 文章

sample.int(m,k)中的错误:不能采用大于总体的样本

提问于
浏览
2

首先,让我说我是机器学习,kmeans和r的新手,这个项目是一个了解更多这方面的工具,并将这些数据呈现给我们的CIO,所以我可以用它来开发新的服务台系统 .

我有一个60K行文本文件 . 该文件包含教师在3年内输入的服务台门票的 Headers .

我想创建一个r程序来获取这些 Headers 并创建一组类别 . 例如,与打印问题相关的术语,或与投影仪灯泡相关的一组术语 . 我用r打开文本文档,清理数据,删除停止词和其他我认为没有必要的词 . 我已经获得了频率> = 400的所有术语列表,并将其保存到文本文件中 .

但是现在我想申请(如果它可以完成或适当)kmeans聚类到同一个数据集,看看我是否可以提出类别 .

下面的代码包含将写出使用的术语列表> = 400的代码 . 它在最后,并被注释掉 .

library(tm) #load text mining library
library(SnowballC)
options(max.print=5.5E5) 
setwd('c:/temp/') #sets R's working directory to near where my files are
ae.corpus<-Corpus(DirSource("c:/temp/"),readerControl=list(reader=readPlain))
summary(ae.corpus) #check what went in
ae.corpus <- tm_map(ae.corpus, tolower)
ae.corpus <- tm_map(ae.corpus, removePunctuation)
ae.corpus <- tm_map(ae.corpus, removeNumbers)
ae.corpus <- tm_map(ae.corpus, stemDocument, language = "english")  
myStopwords <- c(stopwords('english'), <a very long list of other words>)
ae.corpus <- tm_map(ae.corpus, removeWords, myStopwords) 

ae.corpus <- tm_map(ae.corpus, PlainTextDocument)

ae.tdm <- DocumentTermMatrix(ae.corpus, control = list(minWordLength = 5))


dtm.weight <- weightTfIdf(ae.tdm)

m <- as.matrix(dtm.weight)
rownames(m) <- 1:nrow(m)

#euclidian 
norm_eucl <- function(m) {
  m/apply(m,1,function(x) sum(x^2)^.5)
}
m_norm <- norm_eucl(m)

results <- kmeans(m_norm,25)

#list clusters

clusters <- 1:25
for (i in clusters){
  cat("Cluster ",i,":",findFreqTerms(dtm.weight[results$cluster==i],400,"\n\n"))
}


#inspect(ae.tdm)
#fft <- findFreqTerms(ae.tdm, lowfreq=400)

#write(fft, file = "dataTitles.txt",
#      ncolumns = 1,
#      append = FALSE, sep = " ")

#str(fft)

#inspect(fft)

当我使用RStudio运行时,我得到:

> results <- kmeans(m_norm,25)
Error in sample.int(m, k) : cannot take a sample larger than the population when 'replace = FALSE'

我不太确定这意味着什么,我也没有在网上找到很多这方面的信息 . 有什么想法吗?

TIA

2 回答

  • 0

    您正在读取具有多行而不是目录中的多个文件的单个文件 . 代替

    ae.corpus<-Corpus(DirSource("c:/temp/"),readerControl=list(reader=readPlain))`
    

    你需要使用

    text <- readLines("c:\\temp\\your_file_name", n = -1)
    ae.corpus<-Corpus(VectorSource(text),readerControl=list(reader=readPlain))
    

    然后你将获得一个包含60K文件的语料库,而不是一个包含60k行的文件 .

  • 0

    我遇到了同样的问题,最后我发现目标簇的数量大于某些类型的数据行 . 因为您的方式中每种类型的数据可能小于目标簇数 .

相关问题