Scipy:稀疏相似度与阈值的epsilon邻居

时间:2019-02-13 12:41:21

标签: python numpy scipy distance similarity

我想知道scipy是否提供了实现epsilon邻域搜索的原始但对内存友好的方法的选项:

计算我的数据的成对相似度,但将所有小于阈值epsilon的相似度动态设置为零,然后将结果直接作为稀疏矩阵输出。

例如scipy.spatial.distance.pdist()确实非常快,但是至少比我的时间限制要早达到内存限制,至少在我使用squareform()的情况下。

我知道在这种情况下有O(n * log(n))个解决方案,但现在如果结果稀疏就足够了。同样显然,我将不得不使用相似性而不是距离,但这应该不是一个大问题。

1 个答案:

答案 0 :(得分:1)

只要您可以根据距离度量(例如1减去相似度)重铸相似度度量,那么最有效的解决方案是使用sklearn的BallTree

否则,您可以通过将每个点与其他$ i -1 $点进行比较,并丢弃所有小于阈值的值,来构建自己的scipy.sparse.csr_matrix矩阵。

在不知道您的特定相似性度量标准的情况下,此代码应该可以大致解决问题:

package zm.study.xmlserialize.jackson;

import java.io.StringReader;

import org.junit.Test;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

public class JacksonIgnoreUnknownTest {

    public static class A {
       public String f1;
    }

    @JsonIgnoreProperties(ignoreUnknown=true)
    public static class B {
        public String f1;
    }

    @Test
    public void ignoreUnknownGlobally() throws Exception
    {
        String xml = "<A><f1>1</f1><f2>2</f2></A>";
        XmlMapper mapper = new XmlMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, true);
        mapper.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES);
        mapper.readValue(new StringReader(xml), A.class);
    }

    @Test
    public void ignoreUnknownPerType() throws Exception
    {
        String xml = "<B><f1>1</f1><f2>2</f2></B>";
        XmlMapper mapper = new XmlMapper();
        mapper.readValue(new StringReader(xml), B.class);
    }

}