如何将二维椭圆拟合给定点

2024-01-06

我想安装一个2D array通过椭圆函数:(x / a)² + (y / b)² = 1---->(所以得到a和b)

然后,能够在我的图表上重新绘制它。 我在互联网上找到了很多例子,但没有人给出这个简单的笛卡尔方程。我可能搜索得很糟糕!我认为这个问题的基本解决方案可以帮助很多人。

以下是数据示例:

可悲的是,我无法输入这些值......所以让我们假设我有一个 X,Y 数组定义每个点的坐标.


这可以直接使用最小二乘法来求解。您可以将此定义为最小化数量平方和 (alpha * x_i^2 + beta * y_i^2 - 1),其中 alpha 为 1/a^2,beta 为 1/b^2。您拥有 X 中的所有 x_i 和 Y 中的 y_i,因此您可以找到 ||Ax - b||^2 的最小值,其中 A 是 Nx2 矩阵(即 [X^2, Y^2]),x 是列向量 [alpha; beta] 和 b 是全 1 的列向量。

以下代码解决了 Ax^2 + Bxy + Cy^2 + Dx +Ey = 1 形式的椭圆的更一般问题,尽管想法完全相同。 print 语句给出 0.0776x^2 + 0.0315xy+0.125y^2+0.00457x+0.00314y = 1 生成的椭圆的图像也如下

import numpy as np
import matplotlib.pyplot as plt
alpha = 5
beta = 3
N = 500
DIM = 2

np.random.seed(2)

# Generate random points on the unit circle by sampling uniform angles
theta = np.random.uniform(0, 2*np.pi, (N,1))
eps_noise = 0.2 * np.random.normal(size=[N,1])
circle = np.hstack([np.cos(theta), np.sin(theta)])

# Stretch and rotate circle to an ellipse with random linear tranformation
B = np.random.randint(-3, 3, (DIM, DIM))
noisy_ellipse = circle.dot(B) + eps_noise

# Extract x coords and y coords of the ellipse as column vectors
X = noisy_ellipse[:,0:1]
Y = noisy_ellipse[:,1:]

# Formulate and solve the least squares problem ||Ax - b ||^2
A = np.hstack([X**2, X * Y, Y**2, X, Y])
b = np.ones_like(X)
x = np.linalg.lstsq(A, b)[0].squeeze()

# Print the equation of the ellipse in standard form
print('The ellipse is given by {0:.3}x^2 + {1:.3}xy+{2:.3}y^2+{3:.3}x+{4:.3}y = 1'.format(x[0], x[1],x[2],x[3],x[4]))

# Plot the noisy data
plt.scatter(X, Y, label='Data Points')

# Plot the original ellipse from which the data was generated
phi = np.linspace(0, 2*np.pi, 1000).reshape((1000,1))
c = np.hstack([np.cos(phi), np.sin(phi)])
ground_truth_ellipse = c.dot(B)
plt.plot(ground_truth_ellipse[:,0], ground_truth_ellipse[:,1], 'k--', label='Generating Ellipse')

# Plot the least squares ellipse
x_coord = np.linspace(-5,5,300)
y_coord = np.linspace(-5,5,300)
X_coord, Y_coord = np.meshgrid(x_coord, y_coord)
Z_coord = x[0] * X_coord ** 2 + x[1] * X_coord * Y_coord + x[2] * Y_coord**2 + x[3] * X_coord + x[4] * Y_coord
plt.contour(X_coord, Y_coord, Z_coord, levels=[1], colors=('r'), linewidths=2)

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

如何将二维椭圆拟合给定点 的相关文章

  • 打包布尔数组需要通过 int (numpy 1.8.2)

    我正在寻找更紧凑的方式来存储布尔值 numpy 内部需要 8 位来存储一个布尔值 但是np packbits允许打包 他们 这真是太酷了 问题是要打包在4e6字节数组a32e6字节我们需要首先使用的布尔值数组256e6字节将布尔数组转换为
  • 如果列全部为 nan,则使 numpy.nanargmin 返回 nan

    是否可以使用numpy nanargmin 使其返回numpy nan 在其中只有 nan 的列上 现在 它提出了一个ValueError 当这种情况发生时 我不能使用numpy argmin 因为当列中只有几个 nan 时 这将会失败 h
  • python matplotlib 保存图形而不显示

    我想创建一个直方图并将其保存到文件中而不将其显示在屏幕上 我现在拥有的代码默认显示该图 我找不到任何方法来抑制显示该图 我也尝试过 pyplot hist nrs 也有同样的问题 import math time matplotlib py
  • Aptana Python stdlib 与 virtualenv 的问题

    我最近开始开发一个项目 仅使用 vim 作为我的文本编辑器和 virtualenv 设置 我从 GitHub 在此 virtualenv 上安装了一些 API 最终 项目变得有点大了 超出了 vim 的处理能力 所以我不得不将项目移动到 I
  • 加速 Numpy 数组上的循环

    在我的代码中 我有一个 for 循环 它对多维 numpy 数组进行索引 并使用每次迭代时获得的子数组进行一些操作 看起来像这样 for sub in Arr do stuff using sub 现在使用完成的东西sub是完全矢量化的 所
  • 如何在 pygame 中水平翻转图像?

    这是在 pygame 如何翻转图像 假设一个图像 猪向右看 时向左看 我按向左箭头键 然后保持这样 即使我不按任何键或者按向上和向下箭头键 那么 当我按向右箭头键时 如何再次将其切换回向右看 并使其保持这种状态 即使我不按任何键或按向上和向
  • Numpy 中矩阵乘以另一个矩阵的每一行

    我有一个大小为 4x4 的齐次变换矩阵和一个大小为 nx3 的轨迹 该轨迹的每一行都是一个向量 我想将齐次变换矩阵乘以轨迹的每一行 下面是代码 append zero column at last trajectory np hstack
  • rpy2 在从 R 到 Python 的数据帧中处理 NA/缺失值时出现问题

    我在使用rpy2包进行转换时遇到问题dataframe将 R 中的内容保存到 Python 中 import os os environ R HOME Library Frameworks R framework Resources imp
  • Theano导入错误

    我正在尝试在 CPU 机器上安装 Theano 运行 intel HD 显卡 没有 NVIDIA 在 python 中测试时出现以下导入错误 WARNING theano configdefaults g not detected Thea
  • 如何每隔一行读取 CSV 文件

    如何从 CSV 文件中每 2 行获取数据 例如 如果我有一个看起来像这样的文件 0 1 0 23 34 1 45 45 2 78 16 3 110 78 4 48 14 5 76 23 6 55 33 7 12 13 8 18 76 如何迭
  • IndexError:布尔索引与维度 0 上的索引数组不匹配

    在我将 Numpy 更新到 1 13 1 之前 我的代码工作正常 现在我收到以下错误 IndexError boolean index did not match indexed array along dimension 0 dimens
  • 对象对于所需数组来说太深 - scipy.integrate.odeint

    我昨天刚开始使用Python 使用时遇到错误scipy integrate odeint 我定义了一个函数 def SIR x t beta gamma mu M 这需要numpy array物体x t and M 标量浮动beta gam
  • Numpy 花哨的索引和分配

    通常 numpy 会强制分配的左侧和右侧匹配 例如如果我这样做a b b必须是相同的形状或广播到相同的形状a 但该规则似乎有一个例外 gt gt gt a np arange 10 gt gt gt a array 0 1 2 3 4 5
  • Numpy 导入失败

    在 RPi2 上 我使用 pip review 升级了所有软件包 但 numpy 不再工作 我尝试通过 pip 和 apt 卸载并重新安装 numpy 但我没有运气 Apt 安装 numpy 1 12 1 如果我尝试安装它不会通过 pip
  • python中的张量点运算

    我有两个数组A 1 2 3 and B 1 0 1 0 问题是如何在 python 中执行张量点积 我期待得到 C 1 2 3 0 0 0 1 2 3 0 0 0 函数 np tensordot 返回有关数组形状的错误 对这个问题稍微补充一
  • 在 python matplotlib 中用多种颜色填充多边形

    我正在使用 matplotlib 绘制多边形补丁 并希望表示每个多边形的部分以特定颜色填充 即制作一个饼图 但形状为三角形 正方形或六边形 有没有办法改变饼图的形状或表示多边形的多种填充颜色 Thanks 更新 这是我的意思的模拟 您可以创
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • 更新 Sqlalchemy 中的多个列

    我有一个在 Flask 上运行的应用程序 并使用 sqlalchemy 与数据库交互 我想用用户指定的值更新表的列 我正在使用的查询是 def update table value1 value2 value3 query update T
  • 乘以行并按单元格值附加到数据框

    考虑以下数据框 df pd DataFrame X a b c d Y a b d e Z a b c d 1 2 1 3 df 我想在 列中附加数字大于 1 的行 并在该行中的数字减 1 df 最好应该 然后看起来像这样 或者它可能看起来
  • 具有屏蔽无效值的 pcolormesh

    我试图将一维数组绘制为 pcolormesh 因此颜色沿 x 轴变化 但每个 x 的 y 轴保持不变 但我的数据有一些错误值 因此我使用屏蔽数组和自定义颜色图 其中屏蔽值设置为蓝色 import numpy as np import mat

随机推荐