将数据拟合到方格(通过多个参数离散点)

问题描述 投票:0回答:1

我在二维方格上测量了点。

data points

如何将数据拟合到方格中?我想曲线拟合或最小二乘近似等一些方法会起作用,但我找不到任何针对同一问题的文献。

  • 晶格有离散点
  • 晶格是用多个参数建模的:平移(
    x0
    y0
    )、旋转(
    θ
    )、晶格间距(
    d
    ),并且不能表示为
    y=f(x; a,b,...)
    形式。
least-squares data-fitting
1个回答
0
投票

TLDR;不可能(没有细格子的惩罚)

所以我有同样的问题,我研究了为什么这是不可能的。我证明,对于每个

n
有理点,
x1, ... , xn
都存在一些有理
q, b
,这样对于每个
i
都存在一个整数
z
,使得
xi = z * q + b

归纳证明:

基本情况:

我们从

n=2
开始,为此,选择
q = x1 - x0
b = x0

假设:

让存在

x1, ..., xn+1
有理点。那么对于第一个
n
点,存在一些有理数
q, b
,使得对于每个
i<=n
都存在一个整数
z
,使得
xi = z * q + b

归纳步骤:

从假设中获取

q, b
。我们找到一个自然数 beta,使得
q' := q / s, b
满足
i<=n+1
的假设。

确实,对于每个自然数和

i<=n
,当
xi = z * q + b
时,也
xi = z * s * q' + b

现在我们必须选择一个自然的

s
,使得
x := xn+1 = z * q' + b
代表整数
z

我会推导出

s
,这也将证明这样的
s
存在。定义
beta
x = beta * q + b
。因为除了
beta
之外的每个数字都是有理数,所以
beta
也是有理数:

beta = u / v

定义

s := v

那么它成立:

x = beta * q + b = u / v * q + b = u / v * s * q' + b = u * q' + b
其中
u
是整数。

经验证明

使用证明中的公式,我制作了一个Python程序,可以为任意分数找到完美的格子:

from fractions import Fraction
import random

def random_fract():
    return Fraction(
        random.randint(2, 1_000),
        random.randint(2, 100)
    )

def test_one_lattice():
    x_vals = [random_fract() for i in range(1_000)]
    # remove duplicates -- the algorithm doesn't work for them
    x_vals = list(set(x_vals))
    q = x_vals[1] - x_vals[0]

    b = x_vals[0]
    for fract in x_vals[2:]:
        q /= ((fract-b) / q).denominator
    for x in x_vals:
        z = (x - b) / q
        assert z * q + b == x
        assert z % 1 == 0

if __name__ == "__main__":
    for _ in range(50):
        test_one_lattice()

请记住,这也适用于空间的多个维度(它们是独立的)以及晶格的多个维度(只需将其他向量设置为零)

© www.soinside.com 2019 - 2024. All rights reserved.