sample.int(m, k) 中的错误:无法获取大于总体的样本

Posted

技术标签:

【中文标题】sample.int(m, k) 中的错误:无法获取大于总体的样本【英文标题】:Error in sample.int(m, k) : cannot take a sample larger than the population 【发布时间】:2014-11-02 21:50:04 【问题描述】:

首先,让我说我对机器学习、kmeans 和 r 还很陌生,而这个项目是一种了解更多相关信息并将这些数据呈现给我们的 CIO 的方法,以便我可以在开发新的帮助台系统。

我有一个 60K 行的文本文件。该文件包含教师在 3 年内输入的帮助台票证的标题。

我想创建一个 r 程序来获取这些标题并创建一组类别。例如,与打印问题相关的术语,或与投影仪灯泡相关的一组术语。我用 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)

sample.int(m, k) 中的错误:当 'replace = FALSE' 时,无法获取大于总体的样本

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

TIA

【问题讨论】:

m_norm 足够容纳 25 个中心吗? 我将它放到 5 个中心并得到同样的错误。当我把它降到 2 时,我得到“do_one(nmeth) 中的错误:外部函数调用中的 NA/NaN/Inf (arg 1)” 既然您和R 一样是编程新手,我可以建议您从小处着手吗?创建一个包含适当数据的 10 行文件,以便您提前知道结果应该是什么。逐步运行以验证您是否应用了正确的算法。 @CarlWitthoft,我做到了。我使用 kmeans(m_norm,2) 使用 10 和 100 并得到相同的错误。当我将它放到 kmeans(m_norm,1) 时,我得到“do_one(nmeth) 中的错误:外部函数调用中的 NA/NaN/Inf (arg 1)”。可能是我只是在做错事或试图以错误的方式使用它......我已经观看了几个 youtube 视频并整理了代码试图使这项工作...... m_norm 有什么形状?是否有任何操作破坏了您的数据? 【参考方案1】:

我遇到了同样的问题,最后我发现目标聚类数大于某些类型的数据行。因为在你的方式中每种类型的数据可能会小于目标聚类数。

【讨论】:

【参考方案2】:

您正在读取包含多行的单个文件,而不是目录中的多个文件。而不是

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 文件的语料库,而不是 1 个包含 60k 行的文件。

【讨论】:

即使我也面临同样的问题。我的文本中只有 1000 行。同样的错误

以上是关于sample.int(m, k) 中的错误:无法获取大于总体的样本的主要内容,如果未能解决你的问题,请参考以下文章

lambda参数解包错误

lambda 参数解包错误

洛谷 1602 Sramoc问题

R语言sample.int有放回或者无放回采样随机整数实战

SpringBoot集合Linux的FastDFS与Nginx上传图片测试错误com.github.tobato.fastdfs.exception.FdfsConnectException: 无法获

Discord.js(节点)中的错误请求并且无法找出导致它的原因