Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在循环上运行相同函数时出错,否则不会出错_R - Fatal编程技术网

R 在循环上运行相同函数时出错,否则不会出错

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,

我已经编写了一个函数来手动执行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, 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
函数几次,就会看到错误。听起来很合理。但当我在每个特征的最小值和最大值之间随机分配中心时,我想不出这是怎么发生的。我将深入研究,看看到底发生了什么样的组合(通过循环不同的种子),您可以将中心随机分配到不同的数据点,确保它们不相同。(我认为发生这种情况的原因正是因为你分配中心的方式)听起来很合理。但当我在每个特征的最小值和最大值之间随机分配中心时,我想不出这是怎么发生的。我将深入研究,看看到底发生了什么样的组合(通过循环不同的种子),您可以将中心随机分配到不同的数据点,确保它们不相同。(我认为发生这种情况的原因正是因为您分配中心的方式)