我想根据与这些点相关的概率函数,以一种模糊的方式为这些点着色。
我已经处理了2起案件。首先,我建立我的数据集和给定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")
这就是我将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")
这是错误的,因为我希望每个质心都具有某种颜色的最大值,然后根据距离决定阴影,具体取决于哪个类。
答案 0 :(得分:1)
您可能需要自己做混合功能。
如果您有两个以上的簇,那么线性色彩空间就不再足够了。
最简单的选择是在每种组分中进行线性混合。直接实施。对于更高级的情况,您可能希望“平衡”点(所有距离都相等)为灰色,而不是平均颜色。
作为临时解决方案,您还可以为每个群集设置调色板,从灰色到群集颜色。然后使用第i个调色板的(x_j-x_i)/ x_j作为值,其中x_i是最小的值,x_j是第二小的值。如果x_i = x_j,则该值为0(灰色)。如果x_i = 0,则值为1。
这可能很漂亮,但可能会引起误解,因为它并非在所有地方都使用相同的缩放比例。
答案 1 :(得分:0)
我想我找到了一个很好的解决方案,这就是问题所在:
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个不同的调色板,每个调色板都是从白色开始的,白色是每个人的共同色。然后,根据概率,将k个聚类概率的rgb值与加权混合混合。