RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-236181

Eugene Bartosh's questions

Martin Hope
Eugene Bartosh
Asked: 2020-12-28 01:31:57 +0000 UTC

按给定向量与数据库中向量之间的最小欧几里得距离搜索

  • 10

在 PostgreSQL 表中,double[] 类型的字段存储高维向量(准确地说是 128 个坐标)。

 create table tab (
   id integer, 
   name character varying(200)
   vector double precision[]
 )

对于给定的向量,您需要从数据库中返回一条记录,其中该向量与表记录中的向量之间的欧几里得距离最小。

有一个函数可以使用众所周知的公式计算两个向量的欧几里得距离SQRT((v1[1]-v2[1])^2+(v1[2]-v2[2])^2+....+(v1[128]-v2[128])^2):

CREATE OR REPLACE FUNCTION public.euclidian(
  arr1 double precision[],
  arr2 double precision[])
  RETURNS double precision AS
$BODY$
  select sqrt(SUM(tab.v)) as euclidian from (SELECT 
     UNNEST(vec_sub(arr1,arr2)) as v) as tab;
$BODY$
LANGUAGE sql IMMUTABLE STRICT

辅助功能:

CREATE OR REPLACE FUNCTION public.vec_sub(
  arr1 double precision[],
  arr2 double precision[])
RETURNS double precision[] AS
$BODY$
  SELECT array_agg(result)
    FROM (SELECT (tuple.val1 - tuple.val2)*(tuple.val1 - tuple.val2) 
        AS result
        FROM (SELECT UNNEST($1) AS val1
               ,UNNEST($2) AS val2
               ,generate_subscripts($1, 1) AS ix) tuple
    ORDER BY ix) inn;
$BODY$
LANGUAGE sql IMMUTABLE STRICT

要求 :

select tab.id as tabid, tab.name as tabname, 
        euclidian(target_vector,tab.vector) as eucl from tab 
order by eulc ASC
limit 1

到目前为止,一切都很好。但不难看出,查询只能通过穷举表中的所有记录来执行。在某种程度上,这适合每个人,但是现在数据库正在增长,并且出现了一个问题,即详尽的搜索并不是很好,委婉地说。现在数据库中有几千条记录,还没有明显的性能问题,但几万条记录已经不远了。

问题 - 在执行查询时,如何设计并在选项卡表中提供索引搜索?这样至少 90% 的不必要记录被索引丢弃,剩下的 10% 已经允许通过完整的枚举。

PS 寻找解决方案的当前方向之一:PostGIS扩展允许您在 3 维空间中按距离搜索和排序 (ST_3DDistance)、按距离过滤 (ST_3DWithin) 等 - 这可以通过索引快速完成。也许有人以某种方式将其抽象为 N 维空间的情况?

PS2。气象观测数据:

  • 做了一个查询 select max(val), min(val) from (select unnest(vector) as val from tab) as tab1 - 0.485470712185 -0.41735497117 - 我不确定,我认为坐标值理论上可以不超过 1.0 模
  • 虽然向量未归一化,但距 (0,0,...0) 的距离在 1.2 到 1.6 的范围内。

PS3。这不是我第一次解决这样的问题 - 上一次它与在点云 (3D) 中查找最近的点有关,但是我在内存中(iBoxDB 数据库)本地拥有一切,我什至没有尝试摆脱一个完整的枚举......这就是postgresql服务器的全部力量——从我想要解决的原理来看)。

PS4。根据观测数据,点之间的最大距离(基于可用的统计数据)约为 3.2 - 让我们将其扩展为 5,以防万一,或最多 10。我绝对对相距超过 1.0 的点不感兴趣从彼此。让我们从 128 维空间中挑出几个(多少不介意,比如说 10.20)三维投影 - 坐标集 (v1,v2,v3)、(v4,v5,v6) 等。显然,如果在其中一个三维投影中距离超过极限(1.0),那么在全坐标组上它肯定不会变小。接下来,我们尝试应用 PostGIS 中的内容 - 我们索引它们的每个向量的三维投影,然后在搜索时,我们使用 ST_3DWithin < 1.0 设置过滤器(过滤器的数量将等于选择的三个 -尺寸投影)。值得一试的新年前夜:-) 我真的很想从 PostGIS 专家那里得到一个称职的评论 - 奇迹会在除夕发生,还是我们可以玩得开心?:-)

PS5。在水桶的方向上,我建议不要再挖了-首先,无论您如何分散它们,它们都会很多-即使您建立在投影上而不是在全维度上,假设取前64个坐标并将它们分散在花束中(<0,>=0) - 它将起作用 18446744073709551616 可能的花束 - 它在哪里......其次,存在花束边界的问题 - 点可以在最小距离处但落入相邻花束,在查询中必须考虑到这一点,为此,您需要为每个花束保留邻居图...如果您应用最简单的分区 (<0,>=0) - 原则上,它失去了所有意义,因为对于一个轴,只有一个边界,您仍然需要在这里和那里查看...如果您将每个轴分为 4 个范围 - 花束的数量肯定会达到无穷大... 第三,

sql
  • 3 个回答
  • 10 Views
Martin Hope
Eugene Bartosh
Asked: 2020-02-28 22:37:25 +0000 UTC

EPP 域创建验证失败

  • 0

我必须通过 sidn.nl API 创建域,在此之前我突破了 oak 技术支持 - HELLO、LOGIN 和 DOMAIN CHECK 已经在工作,所以我有一个会话,那里的一切都是正确的。

返回此 XML 的命令语法错误:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command><create>
<domain:create xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
<domain:name>5gmobiel.nl</domain:name><domain:period unit="y">1</domain:period><domain:ns>
<domain:hostObj>ns1.sidn.nl</domain:hostObj></domain:ns>
<domain:ns><domain:hostObj>ns2.sidn.nl</domain:hostObj></domain:ns>
<domain:registrant>FLO015428-AFGLI</domain:registrant>
<domain:contact type="admin">FLO015428-AFGLI</domain:contact>
<domain:contact type="tech">FLO015428-AFGLI</domain:contact>
<domain:authInfo><domain:pw></domain:pw></domain:authInfo>
</domain:create></create>
<extension>
<secDNS:create xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1"></secDNS:create></extension>
<clTRID>AFREG-12345</clTRID>
</command></epp>

这是结果:

<response><result code="2001"><msg>Command syntax error</msg></result><trID><clTRID>AFREG-12345</clTRID><svTRID>SIDN</svTRID></trID></response>

XML essno 检查https://validator.w3.org/check

api
  • 1 个回答
  • 10 Views
Martin Hope
Eugene Bartosh
Asked: 2020-02-23 01:33:16 +0000 UTC

服务器未响应 EPP HELLO

  • 0

我需要与 .NL 区域注册商合作 - sidn.nl。

他们有 EPP 服务器。我采用标准的 EPP HELLO 模板,通过 CURL 添加 4 个字节(大端的消息大小)——作为响应,服务器根本不给出任何响应。以下是我准备一切的方式:

var epp_hello = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>'+
    '<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">'+
    '    <hello/>'+
    '</epp>'; // шаблон
var xml = bigEndian(epp_hello)+""; // big endian
curl.setOpt(Curl.option.URL, "drs.domain-registry.nl"); // 
curl.setOpt(Curl.option.PORT, 700); 
curl.setOpt(Curl.option.POST, 1);
curl.setOpt(Curl.option.HEADER, true);
curl.setOpt(Curl.option.POSTFIELDS, xml);
curl.setOpt(Curl.option.HTTPHEADER , ['Content-type: text/xml']);
curl.setOpt(Curl.option.TIMEOUT , 180);
curl.setOpt(Curl.option.SSL_VERIFYPEER, true); 
curl.setOpt(Curl.option.SSL_VERIFYHOST, false);   
curl.perform();  

作为回应,我什么也得不到——没有标题,没有数据。

控制面板中的 IP 已准确注册。他们的技术支持给我发了一个手册链接,它描述了一般的 EPP 并说

遇见 vriendelijke groet :-)

更新:感谢 Mike 的提示,确实不应该使用 curl。不知何故,如果是 XML,那么出于习惯,它意味着 HTTP - 但在这里,有一种特殊的偏好,方法......

然而,到目前为止,转换为 TCP 没有任何帮助:

var epp_hello = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>'+
                '<epp xmlns="urn:ietf:params:xml:ns:epp-1.0"><hello/></epp>'; 
var xml = bigEndian(epp_hello); 

var client = new net.Socket();
client.connect(700, "drs.domain-registry.nl", function(xxml) {
    console.log('Connected ', xxml);
    client.write(xxml);
}.bind(null,xml));

client.on('data', function(data) {
    console.log('Received: ' + data);
    client.destroy();
});

client.on('close', function() {
    console.log('Connection closed');
});

没有数据来自服务器。

xml
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5