如何在 3D 中对固定点进行多项式拟合

2023-11-25

我在 3D 空间中有一组 x,y,z 点和另一个名为charge它表示存储在特定 x、y、z 坐标中的电荷量。我想对此数据进行加权(按探测器中沉积的电荷量进行加权,这恰好对应于更多电荷的更高权重),以便它通过给定点(顶点)。

现在,当我在 2D 中执行此操作时,我尝试了各种方法(将顶点带到原点并对所有其他点进行相同的变换,并强制拟合穿过原点,给予顶点非常高的权重)但是没有一个比 Jaime 在这里给出的答案更好:如何用不动点进行多项式拟合

它使用拉格朗日乘子的方法,这是我在本科生高级多变量课程中隐约熟悉的方法,但没有太多其他内容,而且该代码的转换似乎并不像添加 z 坐标那么容易。 (请注意,即使代码没有考虑存入的费用金额,它仍然给了我最好的结果)。我想知道是否有相同算法的版本,但是是 3D 版本。我还在 Gmail 中联系了该答案的作者,但没有收到他的回复。

以下是有关我的数据以及我在 2D 中尝试执行的操作的更多信息:如何权衡散点图中的点以进行拟合?

这是我执行此操作的代码,其中我强制顶点位于原点,然后适合数据设置fit_intercept=False。我目前正在对 2D 数据采用这种方法,因为我不确定拉格朗日乘子是否有 3D 版本,但有一些线性回归方法可以在 3D 中执行此操作,例如,这里:在 3D 中拟合直线:

import numpy as np
import sklearn.linear_model

def plot_best_fit(image_array, vertexX, vertexY):
    weights = np.array(image_array)
    x = np.where(weights>0)[1]
    y = np.where(weights>0)[0]
    size = len(image_array) * len(image_array[0])
    y = np.zeros((len(image_array), len(image_array[0])))
    for i in range(len(np.where(weights>0)[0])):
        y[np.where(weights>0)[0][i]][np.where(weights>0)[1][i]] = np.where(weights>0)[0][i]
    y = y.reshape(size)
    x = np.array(range(len(image_array)) * len(image_array[0]))
    weights = weights.reshape((size))
    for i in range(len(x)):
        x[i] -= vertexX
        y[i] -= vertexY
    model = sklearn.linear_model.LinearRegression(fit_intercept=False)
    model.fit(x.reshape((-1, 1)),y,sample_weight=weights)
    line_x = np.linspace(0, 512, 100).reshape((-1,1))
    pred = model.predict(line_x)
    m, b = np.polyfit(np.linspace(0, 512, 100), np.array(pred), 1)
    angle = math.atan(m) * 180/math.pi
    return line_x, pred, angle, b, m

image_array是一个 numpy 数组并且vertexX and vertexY分别是顶点的 x 和 y 坐标。这是我的数据:https://uploadfiles.io/bbhxo。我无法创建玩具数据,因为没有简单的方法来复制该数据,它是由中微子与氩核相互作用的 Geant4 模拟生成的。我不想摆脱数据的复杂性。而这个特定事件恰好是我的代码不起作用的事件,我不确定是否可以专门生成数据,因此我的代码不起作用。


这更多的是一个手工制作的使用基本优化的解决方案。这是直截了当的。只需测量一点到要拟合的线的距离,并使用基本方法最小化加权距离optimize.leastsq。代码如下:

# -*- coding: utf-8 -*
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.cm as cm
from scipy import optimize
import numpy as np

def rnd( a ):
    return  a * ( 1 - 2 * np.random.random() ) 

def affine_line( s, theta, phi, x0, y0, z0 ):
    a = np.sin( theta) * np.cos( phi )
    b = np.sin( theta) * np.sin( phi )
    c = np.cos( theta )
    return np.array( [ s * a + x0, s * b + y0, s * c + z0 ] )

def point_to_line_distance( x , y, z , theta, phi, x0, y0, z0 ):
    xx = x - x0
    yy = y - y0
    zz = z - z0
    a = np.sin( theta) * np.cos( phi )
    b = np.sin( theta) * np.sin( phi )
    c = np.cos( theta )
    r = np.array( [ xx, yy, zz ] )
    t = np.array( [ a, b, c ] )
    return np.linalg.norm( r - np.dot( r, t) * t )

def residuals( parameters, fixpoint, data, weights=None ):
    theta, phi = parameters
    x0, y0, z0 = fixpoint
    if weights is None:
        w = np.ones( len( data ) )
    else:
        w = np.array( weights )
    diff = np.array( [ point_to_line_distance( x , y, z , theta, phi , *fixpoint ) for x, y, z in data ] )
    diff = diff * w
    return diff

### some test data
fixpoint = [ 1, 2 , -.3 ]
trueline = np.array( [ affine_line( s, .7, 1.7, *fixpoint ) for s in np.linspace( -1, 2, 50 ) ] )
rndData = np.array( [ np.array( [ a + rnd( .6), b + rnd( .35 ), c + rnd( .45 ) ] ) for a, b, c in trueline ] )
zData = [ 20 * point_to_line_distance( x , y, z , .7, 1.7, *fixpoint ) for x, y, z in rndData ]

### unweighted
bestFitValuesUW, ier= optimize.leastsq(residuals, [ 0, 0],args=( fixpoint, rndData ) )
print bestFitValuesUW
uwLine = np.array( [ affine_line( s, bestFitValuesUW[0], bestFitValuesUW[1], *fixpoint ) for s in np.linspace( -2, 2, 50 ) ] )

### weighted ( chose inverse distance as weight....would be charge in OP's case )
bestFitValuesW, ier= optimize.leastsq(residuals, [ 0, 0],args=( fixpoint, rndData, [ 1./s for s in zData ] ) )
print bestFitValuesW
wLine = np.array( [ affine_line( s, bestFitValuesW[0], bestFitValuesW[1], *fixpoint ) for s in np.linspace( -2, 2, 50 ) ] )

### plotting
fig = plt.figure()
ax = fig.add_subplot( 1, 1, 1, projection='3d' )
ax.plot( *np.transpose(trueline ) ) 
ax.scatter( *fixpoint, color='k' )
ax.scatter( rndData[::,0], rndData[::,1], rndData[::,2] , c=zData, cmap=cm.jet )

ax.plot( *np.transpose( uwLine ) ) 
ax.plot( *np.transpose( wLine ) ) 

ax.set_xlim( [ 0, 2.5 ] )
ax.set_ylim( [ 1, 3.5 ] )
ax.set_zlim( [ -1.25, 1.25 ] )

plt.show()

返回

>> [-0.68236386 -1.3057938 ]
>> [-0.70928735 -1.4617517 ]

results

固定点以黑色显示。原来的线是蓝色的。未加权和加权拟合分别为橙色和绿色。数据根据与线的距离进行着色。

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

如何在 3D 中对固定点进行多项式拟合 的相关文章

随机推荐

  • 使用 python 进行 oauth 谷歌

    我对网络编程相当陌生 我想在这里从头开始 我试图在网上搜索 但最终完全困惑了 现在我想学习的是如何通过Python脚本验证Google帐户 任何人都可以向我提供代码片段或任何示例 预先非常感谢 在过去几周的几次失败尝试之后 我花了一整天的时
  • 模拟私有构造函数

    The Site课程是由外部团队向我提供的 并且有private构造函数 public class Site int id String brand private Site int id String brand this id id t
  • Entity Framework 4.1“Code First”SetInitializer 在 Database.Delete 之后不会再次调用

    首先尝试使用 EF 4 1 代码进行一些单元测试 我有我的实时数据库 SQL Server 和我的单元测试数据库 Sql CE 在与 EF Sql CE 4 0 和事务支持进行斗争 并失败 后 我决定运行测试的最简单方法是 创建数据库 运行
  • 从 CouchDB 中的 Erlang 视图发出元组

    CouchDB 版本 0 10 0 使用本机 erlang 视图 我有一个以下形式的简单文档 id user 1 rev 1 9ccf63b66b62d15d75daa211c5a7fb0d type user identifiers AB
  • 使用 SCM 进行没有历史记录的 git 克隆

    我们的项目很大 我们希望避免克隆所有 git 历史记录 是否有可能git clone通过depth 1 using checkout scm在詹金斯 我找不到任何有关如何配置的文档SCM或者如果可能的话如何传递参数 Added 找到文档了
  • 无法验证以下目标配置(S3 到 SQS)

    我正在尝试使用无服务器设置一个工作流程 该工作流程创建一个新的 S3 存储桶 一个新的 SQS 队列 当在 S3 存储桶中创建一个对象时 将消息放入队列中 并在队列上有足够的消息时启动 lambda队列 我的资源块中有以下内容 resour
  • WinForms | C# |在文本框中间自动完成?

    我有一个自动完成功能的文本框 如下所示 txtName AutoCompleteMode AutoCompleteMode Suggest txtName AutoCompleteSource AutoCompleteSource Cust
  • Ascii 文件中的 Python BOM 错误

    我在使用 Python 2 6 时遇到了一个奇怪且烦人的问题 我正在尝试在我的嵌入式 Linux ARM 板上运行此文件 以及其他文件 http svn tuxisalive com software suite v3 smart core
  • python multiprocessing.Pool杀死*特定*长时间运行或挂起的进程

    我需要执行许多并行数据库连接和查询的池 我想使用 multiprocessing Pool 或并发 futures ProcessPoolExecutor Python 2 7 5 在某些情况下 查询请求花费太长时间或永远无法完成 挂起 僵
  • Java中如何对URL进行编码以避免特殊字符? [复制]

    这个问题在这里已经有答案了 我需要java代码来编码URL以避免特殊字符 例如空格和 和 等 URL 构造很棘手 因为 URL 的不同部分对于允许使用的字符有不同的规则 例如 加号在 URL 的查询部分中保留 因为它代表空格 但在 URL
  • 从 wav 文件读取样本

    我正在尝试用 html5 制作一个网页 它将 wav 文件中的示例数据存储在数组中 有没有办法用javascript获取样本数据 我正在使用文件输入来选择 wav 文件 在 javascript 中我已经添加了 document getEl
  • 使用 git 有效地重写(rebase -i)大量历史记录

    我有一个 git 存储库 最新版本中有大约 3500 个提交和 30 000 个不同的文件 它代表了多人大约 3 年的工作成果 我们已获得将其全部开源的许可 我正在努力发布整个历史记录 而不仅仅是最新版本 为此 我感兴趣的是 回到过去 并在
  • JavaScript 中对象的“内部槽”是什么?

    我试图从一点上理解 ECMAScript 2015 规范 对象的内部槽 但这一段对我来说似乎很不清楚 尤其是这句话 内部槽对应于与对象关联并由各种 ECMAScript 规范算法使用的内部状态 它使用正确的语法吗 有人能用英语解释这个概念吗
  • 在 Windows 7 上,node.js 安装程序失败并显示“CAQuietExec Failed”和 1603 错误代码

    我试图在 Windows 7 上安装 node js 但是 每次我尝试安装时都会出现以下错误 MSI s A0 64 20 01 44 207 Executing op CustomActionSchedule Action Registe
  • 如何在 GitHub Actions CI/CD 中构建 Flutter

    我正在尝试 GitHub Actions 来构建我的 Flutter 应用程序 但我不知道该选择哪个容器映像 是否有可用于 Flutter 的可信容器镜像 我需要进行哪些调整才能在构建步骤中使用 Flutter SDK Run flutte
  • 我可以从 xaml 中过滤集合吗?

    我有一个 wpf mvvm 应用程序 我的视图模型中有一个可观察的集合 public ObservableCollection
  • 如何在表单POST方法中传递jquery datepicker值?

    我在日期表单中有一个输入文本 我使用 JQuery datepicker 来选择日期
  • x86 给定 AH 和 AL 计算 AX?

    我在理解x86汇编中的寄存器时遇到困难 我知道EAX是完整的32位 AX是低16位 然后AH和AL是AX的高8位和低8位 但我正在做一个问题 如果 AL 10 且 AH 10 AX 中的值是多少 我对此的想法是将 10 转换为二进制 101
  • 无法解析的 StackExchange API 响应

    我编写了一个小程序来分析来自 StackExchange API 的个人资料数据 但该 API 向我返回了无法解析 无法读取的数据 收到的数据 使用c 自行下载 u001f b 0 0 0 0 0 u0004 0mRMo 0 f d c u
  • 如何在 3D 中对固定点进行多项式拟合

    我在 3D 空间中有一组 x y z 点和另一个名为charge它表示存储在特定 x y z 坐标中的电荷量 我想对此数据进行加权 按探测器中沉积的电荷量进行加权 这恰好对应于更多电荷的更高权重 以便它通过给定点 顶点 现在 当我在 2D