高维中的凸包,找到多面体的顶点

2024-03-17

假设我有一个 6 维空间中的点云,我可以根据需要使其密集。这些点位于低维多面体的表面上(即点向量 (x1, x2, ... x6) 看起来是共面的)。

我想找到这个未知多面体的顶点,我当前的尝试通过 Python 中的 scipy 接口使用 qhull 算法。一开始我只会收到错误消息,显然是由较低维度的输入和/或许多退化点引起的。我尝试了几种蛮力方法来消除退化点,但不是很成功,所以最后,我认为所有这些点都必须位于凸包上。

这个问题 https://stackoverflow.com/questions/26408110/why-does-qhull-error-when-computing-convex-hull-of-a-few-points非常有帮助,因为它建议通过主成分分析进行降维。如果我将点投影到 4D 超平面,qhull 算法运行时不会出现错误(对于任何更高的维度,它不会运行)。

from scipy.spatial import ConvexHull
from sklearn.decomposition import PCA

model = PCA(n_components=4).fit(initial_points)
proj_points = model.transform(initial_points)
hull = ConvexHull(proj_points, qhull_options = "Qx")

上述问题的答案提到,在计算投影点的凸包后,需要将单纯形转换回来。但是 qhull 输出仅包含索引,为什么这些与初始点的索引不匹配?

现在我的问题是我不知道使用哪种精度来实际获得正确的顶点。无论我使点云有多密集,获得的顶点都会因不同的精度而不同。例如,对于 (10000, 6) 数组中的初始点,我得到(其中 E0.03 是该方法有效的最大值):

hull1 = ConvexHull(proj_points, qhull_options = "Qx, E0.03")
print len(hull1.vertices)
print hull1.vertices

5
[ 437 2116 3978 7519 9381]

并在轴 0,1,2 的一些(信息量不是很大的)投影中绘制它(其中蓝点代表初始点云的选择):

enter image description here But for a higher precision (of course) I get a different set:

hull2 = ConvexHull(proj_points, qhull_options = "Qx, E0.003")
print len(hull2.vertices)
print hull2.vertices

29
[  74   75  436  437  756 1117 2116 2366 2618 2937 3297 3615 3616 3978 3979
 4340 4561 4657 4659 4924 5338 5797 6336 7519 7882 8200 9381 9427 9470]

相同的投影(只是角度略有不同):

我怀疑第一张图片没有足够的顶点,而第二张图片可能有太多顶点。当然,我无法从这些图中提取严格的信息。但是有没有一种好的方法可以找出要使用的精度呢?或者也许是解决这个问题的完全不同的方法(我已经尝试了一些)?


在这个答案中,我假设您已经使用 PCA 将数据近乎无损地压缩为 4 维数据,其中减少的数据位于概念上很少面的 4 维多面体中。我将描述一种解决该多面体面的方法,这反过来会给您顶点。

Let xi in R4, i = 1, ..., m, be the PCA-reduced data points.

Let F = (a, b) be a face, where a is in R4 with a • a = 1 and b is in R.

We define the face loss function L as follows, where λ+, λ- > 0 are parameters you choose. λ+ should be a very small positive number. λ- should be a very large positive number.

L(F) = sumi+ • max(0, a • xi + b) - λ- • min(0, a • xi + b))

We want to find minimal faces F with respect to the loss function L. The small set of all minimal faces will describe your polytope. You can solve for minimal faces by randomly initializing F and then performing gradient descent using the partial derivatives ∂L / ∂aj, j = 1, 2, 3, 4, and ∂L / ∂b. At each step of gradient descent, constrain a • a to be 1 by normalizing.

∂L / ∂aj = sumi+ &bullet; xj &bullet; [a &bullet; xi + b > 0] - λ- &bullet; xj &bullet; [a &bullet; xi + b < 0]) for j = 1, 2, 3, 4

∂L / ∂b = sumi+ &bullet; [a &bullet; xi + b > 0] - λ- &bullet; [a &bullet; xi + b < 0])

Note 艾弗森括号 http://en.wikipedia.org/wiki/Iverson_bracket:如果 P 为真,则 [P] = 1;如果 P 为假,则 [P] = 0。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高维中的凸包,找到多面体的顶点 的相关文章

随机推荐

  • JobIntentService 和 IntentService 有什么区别?

    我不明白这两个 API 之间有什么区别 我的意思是何时使用第一个 为什么会有 JobIntentService 提前致谢 我建议阅读这篇文章 解释两者之间的区别意向服务和求职意向服务 https medium com hupareshubh
  • 如何设置休眠sql_mode

    有没有办法在 Hibernate 属性或连接字符串中设置 sql mode 对于 MySql 数据库 Thanks Stefano Yes as 有记录的 https dev mysql com doc connector j 5 1 en
  • .htaccess 重定向文件夹

    All 我想重定向所有访问的流量http 我的网站 http mysite to http mysite public http mysite public文件夹 目前我正在 htaccess 文件中使用以下内容来执行此操作 它适用于根目录
  • 在python中读取.dat文件

    我有一个 dat 文件 我不知道它是如何创建的 使用了什么分隔符以及有关它的任何详细信息 我只有相应的 mdf 和 csv 文件 就这样 python 有什么方法可以读取这个 dat 文件吗 我尝试过的几种方法 file 736 2 Per
  • Bash 中的 Echo 换行符打印文字 \n

    如何打印换行符 这仅仅打印 n echo e Hello nWorld Hello nWorld Use printf反而 printf hello nworld n printf在不同环境下的行为比echo
  • 我可以在 mongodb 的 $match 聚合函数中使用 $in 吗

    我试图在 match 聚合 函数中使用 in 运算符 由于某种原因 它不适用于 Id 字段 但我找不到任何文档指出 mongodb 不支持此功能 var ids 1 2 3 4 an example I am using real mong
  • Django 聚合:仅求和返回值?

    我有一个已付价值列表 并想显示已付总额 我已经使用了聚合和Sum一起计算值 问题是 我只想打印出总值 但聚合打印出 amount sum 480 0 480 0 为总增加值 在我看来 我有 from django db models imp
  • Kafka 一个分区有多个消费者

    我有一个将消息写入主题 分区的生产者 为了保持顺序 我想使用单个分区 并且我希望 12 个消费者读取该单个分区中的所有消息 没有消费者组 所有消息都应该发送给所有消费者 这是可以实现的吗 我读过一些论坛 每个分区只有一个消费者可以阅读 您可
  • 查找最长可能重复字符串的实用程序

    是否有任何工具或实用程序或 perl python 脚本可以在大型文本文件中找到最长的重复子字符串并打印这些模式以及每个模式出现的次数 http en wikipedia org wiki Longest repeated substrin
  • 如何从某个数字/偏移量开始自动增量?

    我正在运行 fgetcsv 查询以将一堆数据从 CSV 导入 WordPress 我想知道如何从某个数字开始自动递增 例如从 1000 开始 import1 INSERT into wp postmeta meta id post id m
  • Java 7 和 Java 8 之间的舍入不一致是一个错误吗?

    我发现舍入不一致DecimalFormat http docs oracle com javase 8 docs api java text DecimalFormat htmljava 7 和 java 8 之间的类 这是我的测试用例 D
  • 如果堆栈在数字较低的地址处增长,为什么指针比较会颠倒这一点?

    由于堆栈向下增长 即朝着数值较小的内存地址增长 为什么 i lt j是真的 如果我错了 请纠正我 但我想这是 C 创建者 C 维护的 的设计决定 但我想知道为什么 同样奇怪的是 堆分配的对象pin位于比堆栈变量在数值上更高的内存地址 这也与
  • 为什么在手动刷新响应时 ASP.NET 将 Content-Length 标头替换为 Transfer-Encoding 标头?

    我们的 Web 应用程序 ASP NET Web Forms 有一个页面 将向用户显示最近生成的 PDF 文件 由于 PDF 文件有时非常大 因此我们实现了一种 流式传输 方法 将其分块发送到客户端浏览器 尽管以块的形式发送数据 但我们在发
  • 使用 Cython 进行部分构建的构建

    我在构建中面临 cython 的问题 其中一部分是使用 cython 构建的模块 c文件和一个 pyx file 我已经尝试了很多解决方案 Sean Gillies 博客 814 将 pyproj 添加到构建中 http sgillies
  • (解)压缩 Base64 字符串

    PHP代码 txt John has cat and dog plain text txt base64 encode txt base64 encode txt gzdeflate txt 9 best compress txt base
  • Minecraft Forge EntityJoinWorldEvent 返回错误位置!错误

    在本地开发环境中使用 Eclipse Mars 1 Release 4 5 1 中的 Forge 1 8 9 I m trying to set a player s location every time they join or re
  • React:如何将道具从孩子传递到父母再到另一个孩子?

    我这里有一个简单的设置 我有一个父组件 其中有 2 个子组件附加到该父组件 在第一个子组件中 用户更改输入的值 然后 该更改的值将是我想从该子组件传递到父组件的道具 以便可以将其传递给附加到同一父组件的另一个子组件 Main parent
  • 如何在 Scrutor 中注册组件上的所有接口(类似 StructureMap)

    如何在程序集中注册所有接口scan扩展名没有在 ASP NET Core 2 中全部分开写入 在结构图中 Scan gt Declare which assemblies to scan Assembly StructureMap Test
  • Firebase 函数返回和承诺不会退出函数

    我仍然是 Firebase 世界的初学者 我一直在尝试找出以下代码的问题所在 但我在所有可能的方面都失败了 该代码应该检索uid来自数据库中的用户配置文件 然后使用它来更新身份验证配置文件 如果身份验证配置文件更新成功 则再次更新数据库配置
  • 高维中的凸包,找到多面体的顶点

    假设我有一个 6 维空间中的点云 我可以根据需要使其密集 这些点位于低维多面体的表面上 即点向量 x1 x2 x6 看起来是共面的 我想找到这个未知多面体的顶点 我当前的尝试通过 Python 中的 scipy 接口使用 qhull 算法