我有一个流形学习/非线性降维问题,我知道物体之间的距离达到某个阈值,超过这个阈值我就知道距离是“远”的。此外,在某些情况下,某些距离可能会丢失。我试图使用sklearn.manifold
来执行查找1d表示的任务。一种自然的表示方法是将“远”距离表示为inf
,将丢失的距离表示为nan
。
然而,由于我得到了scikit-learn
,目前nan
似乎不支持inf
中的多个学习函数的距离矩阵中的sklearn.manifold
和ValueError: Array contains NaN or infinity
值。
这有什么概念上的原因吗?一些方法似乎特别适合于inf
,例如非度量MDS。另外,我知道这些方法在其他语言中的一些实现能够处理丢失的/inf值。
我没有使用inf
而是考虑将“far”值设置为一个非常大的数字,但我不确定这将如何影响结果。
更新:
我在sklearn.manifold.MDS._smacof_single()
的代码中找到了一段代码和一条注释,上面写着"similarities with 0 are considered as missing values"
。这是一种未记录的指定缺少值的方法吗?这是否适用于所有的多功能?
最佳答案
简而言之:正如您所提到的,非度量MDS能够处理不完全异类矩阵。您是对的:当使用MDS(metric=False)
时,将值设置为零allows将被解释为缺少值。它不适用于其他不基于非度量MDS的流形学习过程,但是可能有类似的(非文档化的)方法可用。
关于你的问题
用高值替换inf可以确定低维表示的形状。这是否有效,而不是一个概念性的问题,只有知道inf值的来源才能回答。inf条目的意思是“这些数据彼此之间的距离是reeaaaalllyyyy”,用高值替换是有意义的(就像在您的例子中一样)。如果缺少关于差异性的知识,我不建议用inf替换。如果没有其他解决方案(如非度量MDS或矩阵完成),那么我建议在这种情况下用可测量距离的中值替换(checkoutImputation)。
查看我的answer到2017年的一个类似问题。
关于python - scikit-learn流形学习函数中的NaN/inf值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17529646/