[R] Help in Recursive Function for steps reconstruction in Clusters Analysis - HCA: Single Link
Cleber Borges
k|ebyn @end|ng |rom y@hoo@com@br
Sat Oct 26 23:46:16 CEST 2024
For now, I've been able to think of a temporary solution... until I can
think of a better teaching solution:
The same function f():
#####
f <- function(xmd) {
rs <- NULL
xmd1 <- 999999999
xmd2 <- 999999999
if (xmd[1] > 0) {
xmd1 <- f(r$merge[ xmd[1], ])
} else {
xmd1 <- xmd[1]
}
if (xmd[2] > 0) {
xmd2 <- f(r$merge[ xmd[2], ])
} else {
xmd2 <- xmd[2]
}
return( rbind( rs, rbind( xmd1, xmd2 ) ) )
}
####
Didactic example to illustrate the chain behavior of the "Single Link"
Algorithm
n <- 100
d <- matrix( runif( n * 2 ), n, 2 )
r <- hclust( dist( d ), met='single' )
plot( d, cex=1, col=1 )
for( i in 1:( nrow( d ) - 1 ) ){
p <- as.numeric( abs( f( r$merge[ i, ] ) ) )
points( d[ p,], col=i, cex=2, pch=19 )
cat(' Step: ', i, '\n' )
flush.console()
Sys.sleep( .2 )
}
Em 26/10/2024 16:14, Cleber Borges escreveu:
> Hello everybody,
>
> I'm trying to build a function to illustrate, in 2D, the sequence of
> the "Single Link" algorithm (the purpose is merely didactic).
>
> The idea is to have the scatter of points on a graph.
> Iteratively, build the segments (with the "segments()" function, for
> each step).
>
> I simulated a data set "d", and created an object "r" using the command:
>
> r <- hclust( dist( d ), met='single' )
>
> My problem:
>
> I created a recursive function, "f()", to find the shortest distances.
> It is defined below.
> But the return has only one column, while I thought there would be two
> columns.
>
>
> What I get:
> ###############
> # Testing f()
> f( c(2, 3) ) #### is the fourth step of hclust
>
> [,1]
> xmd1 -6
> xmd2 -10
> xmd1 -3
> xmd1 -4
> xmd2 -5
>
> What I expected:
> ##################
>
> # xmd1 xmd2
> # -6 -10
> # -3 -5
> # -4 -5
>
>
> If anyone can help me with this recursive function, I would appreciate
> it in advance.
> I've never used recursion before, so I don't have a good grasp of how
> it works.
>
> Thank you very much in advance,
>
> Cleber.
>
>
>
> All details are below:
> ########################
>
>
> d <- scan()
> 0.986 0.900
> -1.331 1.503
> -0.220 -0.752
> 0.102 -0.071
> -0.171 0.018
> -0.782 0.490
> 1.154 -0.074
> -0.768 -1.529
> 1.761 -1.396
> -0.730 0.910
>
> d <- matrix( d, 10, byrow=T )
>
> r <- hclust( dist( d ), met='single' )
> r$merge
> # [,1] [,2]
> # [1,] -4 -5
> # [2,] -6 -10
> # [3,] -3 1
> # [4,] 2 3
> # [5,] -2 4
> # [6,] -8 5
> # [7,] -1 -7
> # [8,] 6 7
> # [9,] -9 8
>
>
> f <- function(xmd) {
>
> rs <- NULL
> xmd1 <- 999999999
> xmd2 <- 999999999
>
> if (xmd[1] > 0) {
> xmd1 <- f(r$merge[ xmd[1], ])
> } else {
> xmd1 <- xmd[1]
> }
>
> if (xmd[2] > 0) {
> xmd2 <- f(r$merge[ xmd[2], ])
> } else {
> xmd2 <- xmd[2]
> }
>
> return( rbind( rs, rbind( xmd1, xmd2 ) ) )
> }
>
>
>
> # Testing f()
> f( c(2, 3) )
>
> # result of f()
> # [,1]
> # xmd1 -6
> # xmd2 -10
> # xmd1 -3
> # xmd1 -4
> # xmd2 -5
>
> # My expectative:
> # xmd1 xmd2
> # -6 -10
> # -3 -5
> # -4 -5
>
>
> # Testing f()
> f( c( 6, 7) )
>
> # result of f()
> # [,1]
> # xmd1 -8
> # xmd1 -2
> # xmd1 -6
> # xmd2 -10
> # xmd1 -3
> # xmd1 -4
> # xmd2 -5
> # xmd1 -1
> # xmd2 -7
>
>
> # My expectative:
> # xmd1 xmd2
> # -8 -10
> # -2 -10
> # -6 -10
> # -3 -5
> # -4 -5
> # -1 -7
>
More information about the R-help
mailing list