colorRampPalette в R более 2 кластеров - PullRequest
0 голосов
/ 23 июня 2018

Я бы хотел, чтобы мои точки были окрашены в разные цвета нечетким образом, в соответствии с вероятностной функцией, связанной с точками.

Я справился за 2 случая. Сначала я строю свой набор данных и вероятности, связанные с двумя кластерами.

set.seed(16)
rbPal <- colorRampPalette(c('yellow','red')) 
(mu1<-c(0,0))                  # vector mean multinom 1
(S1<-matrix(c(0.1,0,0,0.6),2)) # var/cov matrix multinom 1
(mu2<-c(3,0))                  # vector mean multino 2
(S2<- matrix(c(1,0,0,0.1),2))  # var/cov matrix multinom 2

x1<-mvrnorm(n=100, mu=mu1,Sigma=S1 )
x2<-mvrnorm(n=100, mu=mu2,Sigma=S2 )

x<-rbind(x1,x2)              # Dataset

euc.dist<-function (a,b){
sqrt(sum((a-b)^2))
}

randC<-x[sample(nrow(x),2),]
Distmatrix<- t(apply(x,1,function(r) apply(randC,1, function(s) euc.dist(r, 
s))))
mat<-matrix(,200,2)
mat<-apply(mat,2,function(x) x=apply(Distmatrix,1, prod))/Distmatrix

P<-t(apply(mat, 1, function(x) x/sum(x)))
D4<-data.frame(x,P)

D4$Col <- rbPal(10)[as.numeric(cut(D4$X1.1,breaks = 10))]


plot(D4$X1,D4$X2,pch = 20,col = D4$Col, cex=1.2) 
points(randC, col="red")

Ex

Вот что я получаю, представляя 2 точки как центр тяжести скопления.

Что, если я хотел бы выполнить ту же работу цвета, представляя более 2 кластеров?

Так что я должен иметь:

[...]
set.seed(50)
rbPal <- colorRampPalette(c('yellow','red',"green"))
mat<-matrix(,200,3) 
randC<-x[sample(nrow(x),3),]
Distmatrix<- t(apply(x,1,function(r) apply(randC,1, function(s) euc.dist(r, 
s))))

mat<-apply(mat,2,function(x) x=apply(Distmatrix,1, prod))/Distmatrix

P<-t(apply(mat, 1, function(x) x/sum(x)))
D4<-data.frame(x,P)

D4$Col <- rbPal(10)[as.numeric(cut(D4$X1.1,breaks = 10))]


plot(D4$X1,D4$X2,pch = 20,col = D4$Col, cex=1.2) 
points(randC, col="red")

enter image description here

Это неправильно, потому что я хочу, чтобы у каждого центроида было максимальное значение для цвета, а затем затенение в соответствии с расстоянием в зависимости от того, какой кластер.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Мне кажется, я нашел хорошее решение, вот пример:

set.seed(50)
mat<-matrix(,200,3) 
randC<-x[sample(nrow(x),3),]
Distmatrix<- t(apply(x,1,function(r) apply(randC,1, function(s) euc.dist(r, 
                                                                         s))))

mat<-apply(mat,2,function(x) x=apply(Distmatrix,1, prod))/Distmatrix

P<-t(apply(mat, 1, function(x) x/sum(x)))
D4<-data.frame(x,P)


rbPal<-list()
for(i in 1:k){
  rbPal[[i]] <- colorRampPalette(c('white',col=I(i+1)))
}
for(i in 1:k){
  D4[[dim(D4)[2]+1]] <- rbPal[[i]](10)[as.numeric(cut(D4[[2+i]],breaks = 10))]
}


for(i in 1:k){
  D4[[dim(D4)[2]+1]]<-t(col2rgb(D4[[dim(D4)[2]-k+1]])) 
}

prova<-matrix(0,dim(D4)[1],3)
for(i in 1:k){
  prova<-prova+D4[,(dim(D4)[2]-k+i)]*P[,i]
}
prova[is.nan(prova)] <- 0
provcol=apply(prova,1, function(x) rgb(x[1], x[2], x[3], maxColorValue=255))
plot(D4$X1,D4$X2,pch = 20,col = provcol, cex=1.5) 
points(randC, col="red")

Я в основном создал k разной цветовой палитры, каждая из которых начинается с белого, который является общим для всех. Затем, согласно вероятностям, я смешал значения rgb вероятностей k-кластеров с взвешенным смешиванием.

enter image description here

0 голосов
/ 24 июня 2018

Вам может потребоваться выполнить функцию микширования самостоятельно.

Если у вас более двух кластеров, линейного цветового пространства уже недостаточно.

Самый простой выбор - это линейное микширование вкаждый компонент.Прямо вперед для реализации.В более сложных случаях вам может потребоваться, чтобы «сбалансированные» точки (где все расстояния равны) были серыми, а не средним цветом.

В качестве специального решения вы также можете настроить палитры для каждогокластер, от серого до кластеров цвет.Затем используйте (x_j-x_i) / x_j i-й палитры в качестве значения, где x_i - наименьшее, а x_j - второе наименьшее значение.Если x_i = x_j, значение будет 0 (серый).Если x_i = 0, значение будет равно 1.

Это, вероятно, довольно красиво, но может вводить в заблуждение, поскольку не везде используется одинаковое масштабирование.

...