我正在使用Witten和Tibshirani根据他们的论文撰写的sparcl
包:
Witten DM和R Tibshirani(2010)聚类中的特征选择框架。 Journal of the American Statistical Association 105(490):713-726
我查看函数HierarchicalSparseCluster
下的示例:
# Generate 2-class data
set.seed(1)
x <- matrix(rnorm(100*50),ncol=50)
y <- c(rep(1,50),rep(2,50))
x[y==1,1:25] <- x[y==1,1:25]+2
# Do tuning parameter selection for sparse hierarchical clustering
perm.out <- HierarchicalSparseCluster.permute(x, wbounds=c(1.5,2:6),nperms=5)
# Perform sparse hierarchical clustering
sparsehc <- HierarchicalSparseCluster(dists=perm.out$dists, wbound=perm.out$bestw, method="complete")
现在我检查dim(sparsehc$dists)
并返回4950和50.从模拟设置中,我们知道n=100
和p=50
。此外,根据手册,返回值dists
是数据矩阵x
的(n * n)xp 相异度矩阵。显然行尺寸不是n * n,因为它应该是100 * 100 = 10000而不是4950.我是否误解了什么?非常感谢你!
答案 0 :(得分:3)
似乎是sparcl
帮助页面中的错误:相异度矩阵dist
的维度为n2
x p
,其中n2=n*(n-1)/2
。实际上,我们不需要n
x n
距离矩阵,而只需要在主对角线上使用此矩阵的一部分。
sparcl
的来源支持我上面所说的内容:
<强> distfun.R 强>
distfun=function(x){
#if(!is.loaded("distfun")){
# dyn.load("distfun.so")
#}
n<-nrow(x)
p <- ncol(x)
x[is.na(x)]=0
mode(x)="single"
n2=n*(n-1)/2
junk=.Fortran("distfun",
x,
as.integer(n),
as.integer(p),
as.integer(n2),
d=single(n2*p), PACKAGE="sparcl"
)
return(junk$d)
}
在这里,我们可以看到如何计算n2
并将其传递给Fortran函数。
<强> distfun.f 强>
C Output from Public domain Ratfor, version 1.0
subroutine distfun(x,n,p,n2,d)
implicit double precision (a-h,o-z)
integer n,p,n2
real x(n,p),d(n2,p)
ii=0
do23000 i=1,n-1
do23002 ip=i+1,n
ii=ii+1
do23004 j=1,p
d(ii,j)=abs(x(i,j)-x(ip,j))
23004 continue
23005 continue
23002 continue
23003 continue
23000 continue
23001 continue
return
end
此处对于dist
矩阵中的每个要素,都会构造一个大小为n2
的列,其中包含对象之间成对距离的序列。例如,对于n=4
,p=2
和n2=4*3/2=6
,最终矩阵将为6x2
,其设计如下:
| 1 | 2 |
---------------------------
1 | d(1,2)_1 | d(1,2)_2 |
2 | d(1,3)_1 | d(1,3)_2 |
3 | d(1,4)_1 | d(1,4)_2 |
4 | d(2,3)_1 | d(2,3)_2 |
5 | d(2,4)_1 | d(2,4)_2 |
6 | d(3,4)_1 | d(3,4)_2 |
其中,例如,d(2,4)_1
是第一个特征的第二个和第四个对象之间的距离。