R 在循环上运行相同函数时出错,否则不会出错
我已经编写了一个函数来手动执行k均值聚类。该函数在调用时按预期工作,但在循环中多次调用同一函数时,会抛出错误:R 在循环上运行相同函数时出错,否则不会出错,r,R,我已经编写了一个函数来手动执行k均值聚类。该函数在调用时按预期工作,但在循环中多次调用同一函数时,会抛出错误: for (i in seq_len(1000)){km(iris)} 1:nrow(中心)中出错:长度为0的参数 功能是: km = function(df,c=2,times=10){ # browser() df = sapply(df,as.numeric) centers = sapply(1:ncol(df), function(x)runif(c,
for (i in seq_len(1000)){km(iris)}
1:nrow(中心)中出错:长度为0的参数
功能是:
km = function(df,c=2,times=10){
# browser()
df = sapply(df,as.numeric)
centers = sapply(1:ncol(df), function(x)runif(c, min(df[,x]), max(df[,x])))
print(1:nrow(centers))
for (i in seq_len(times)){
dist_mat = sapply(1:nrow(centers), function(x)as.matrix(dist(rbind(df,centers[x,])))[nrow(df)+1,1:nrow(df)] )
seed_allot = apply(dist_mat,1,which.max)
centers = sapply(1:(ncol(df)),function(x) tapply(df[,x],seed_allot,mean))
}
# plot(df[,1],df[,2],col=seed_allot)
# points(centers,pch=14)
}
正常工作且无错误的调用:
km(iris)
引发错误的循环调用:
for (i in seq_len(1000)){km(iris)}
与
kmeans
集群一样,即使指定了两个集群(或中心),也可能只得到一个集群(即所有样本分配给一个集群,而另一个集群没有样本)
在这种情况下,seed\u allot
变成所有的1或2,并且它使得中心(在seed\u allot
之后的一个)只有一行
它使中心类
成为数值类
——而您期望的是矩阵
。nrow(centers)
为类numeric
的对象返回NULL
,您将得到错误消息
错误发生在下一次迭代的
dist_mat=sapply(1:nrow(中心),
函数(x)作为矩阵(dist(rbind(df,centers[x,]))行(df)+1,
1:nrow(df)])
与kmeans
集群一样,即使指定了两个集群(或中心),也可能只得到一个集群(即所有样本分配给一个集群,而另一个集群的样本为零)
在这种情况下,seed\u allot
变成所有的1或2,并且它使得中心(在seed\u allot
之后的一个)只有一行
它使中心类
成为数值类
——而您期望的是矩阵
。nrow(centers)
为类numeric
的对象返回NULL
,您将得到错误消息
错误发生在下一次迭代的
dist_mat=sapply(1:nrow(中心),
函数(x)作为矩阵(dist(rbind(df,centers[x,]))行(df)+1,
1:nrow(df)])
这个错误似乎是随机的。如果多次调用km
函数,则会看到错误。错误似乎是随机的。如果调用km
函数几次,就会看到错误。听起来很合理。但当我在每个特征的最小值和最大值之间随机分配中心时,我想不出这是怎么发生的。我将深入研究,看看到底发生了什么样的组合(通过循环不同的种子),您可以将中心随机分配到不同的数据点,确保它们不相同。(我认为发生这种情况的原因正是因为你分配中心的方式)听起来很合理。但当我在每个特征的最小值和最大值之间随机分配中心时,我想不出这是怎么发生的。我将深入研究,看看到底发生了什么样的组合(通过循环不同的种子),您可以将中心随机分配到不同的数据点,确保它们不相同。(我认为发生这种情况的原因正是因为您分配中心的方式)