首页 > 解决方案 > 通过 PCA 线拟合进行聚类的算法

问题描述

这更像是一个应用数学/算法问题,而不是一个编码问题,但是当我试图解决它时,sklearn这似乎是一个很好的提问地方。

我正在为自定义压缩格式编写纹理压缩器。它存储每个纹素块的少量颜色端点,并且这些端点的线性加权组合以恢复每个纹素的特定值。实现这种类型的压缩器的标准方法是使用 PCA 来查找主轴,因此您的端点是该线任一端的数据点,然后您沿着 PCA 轴进行插值以获得颜色。

该格式支持多个分区 - 每个分区都有自己的颜色端点,数据块中的纹素可以分配给任何单个分区。将纹素分配给分区的一个常见技巧是对颜色值使用 kmeans 聚类,但这往往会聚类像素的“斑点”(下图中的红色圆圈),这与压缩方案的匹配方式并不匹配想要对数据进行编码。

在此处输入图像描述 在此示例中,您可以直观地看到数据中确实存在三“行”数据点(以黑色显示)。这些将是算法的理想选择 - 至少在测试它们是否可以以更好的质量编码方面 - 因为对线段的良好拟合意味着两个端点之间的良好拟合线性插值。

是否有任何标准算法可以围绕线拟合而不是空间聚类进行这种数据点聚类?

标签: pythongraphicsscikit-learn

解决方案


一个有趣的问题! 和我涉足的领域

让我感到震惊的是,它可能与Levkovich-Maslyuk、Kalyuzhny 和 Zhirkov 的“具有自适应块分区的纹理压缩”有关。具体来说,请看图 1。

他们的系统似乎在独立的小块上工作,即 8x8 块,因此搜索空间被合理地控制。如果您打算这样做,那么他们的算法可能仍然适用。

如果不是,例如您的“线性集”可以在整个纹理中的任何位置使用,那么我怀疑他们的方法是否可行。

[免责声明:我自己没有尝试过以下]

也许您仍然可以使用类似 VQ 的方法,但是,您可以不存储 2 种颜色,即定义一个线段?即而不是“k-means”有“k-segments”?

显然,您的“最佳拟合”是与线段的距离,所有最近颜色的“平均”步骤就是 PCA 算法。

当你想产生新的候选人时你会做什么并不那么清楚。也许如果你想要 N 个,你可以简单地从一组随机的 N 个候选者开始,然后重复应用最佳拟合和重新映射算法。

或者,也许每次迭代都可以找到匹配最差的像素来生成新的候选像素。

在我看来,其中之一值得研究。

我很好奇的是您计划使用多少位来混合端点以及如何确定要使用的段。


推荐阅读