我有2D数据,我想要聚集到K群集。让我们假设K=4
。运行聚类算法后,每个点都有一个4长度概率向量(其条目加起来为1),表示该点属于每个聚类的概率。
我的想法是为每个聚类分配颜色,然后制作散点图,其中每个点根据其概率向量着色为所有颜色的混合。如果K=3
它的颜色可能是RGB,那么我可以像this question 中所说的那样使用像ax.scatter(x1, x2, facecolors=probability_vectors)
这样的东西。我使用该解决方案在图像中绘制了具有K=2
(在所有向量中将蓝色列固定为0)的图。我仍然可以将其用于K=3
,但对于K=4
我需要不同的东西。有什么建议吗?
使用Tomáš Šíma回答,如果我使用此代码(对于5个群集):
import colorsys
from matplotlib import pyplot as plt
import numpy as np
N = 5
HSV = [(float(x)/N, 1, 1) for x in range(1,N+1)]
RGB = map(lambda x: colorsys.hsv_to_rgb(*x), HSV)
print HSV
plt.scatter(range(N),np.repeat(0.5,N),c=RGB,s=200)
我得到了这个输出:
[(0.2, 1, 1), (0.4, 1, 1), (0.6, 1, 1), (0.8, 1, 1), (1.0, 1, 1)]
我现在的问题是,如果我有一个概率向量为[0.5, 0.0, 0.0, 0.0, 0.5]
的点,即黄色簇的一半而红色的一半,则其颜色应为橙色。但是,如果我0.5*0.2 + 0.5*1.0
,我会0.6
为蓝色。我应该如何计算平均值以获得橙色而不是蓝色?
知道了,我只需要平均每个群集质心的RGB版本(而不是HUE)
答案 0 :(得分:1)
您正在寻找HSB色彩空间。
HSB中的颜色由3个值组成:
您可以轻松地从此空间生成N种最不同的颜色,然后转换为RGB
import colorsys
N = 5
HSV = [(x*1.0/N, 0.5, 0.5) for x in range(N)]
RGB = map(lambda x: colorsys.hsv_to_rgb(*x), HSV)
为了混合用于绘制点的HSB颜色,您可以对相应的RGB颜色进行重量平均,其权重等于概率向量。
答案 1 :(得分:1)
您可以使用matplotlib色彩文档的Colormap section中提到的RGBA方案。 A代表阿尔法。另请阅读ScalarMappable section。
根据问题中引用的答案进行修改:
db