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