找到两列之间的等式

时间:2013-02-18 11:27:37

标签: algorithm

我有一张桌子  的输入

A B 
3 20
5 30
6 35

我需要一种算法来找出与两列A和B相关的公式(方程式)

输出

B=(A+1)*5

3 个答案:

答案 0 :(得分:1)

一种相对简单的方法是使用最小二乘曲线拟合用于各种曲线族(比如多项式达到n-2度,指数,幂律)并寻找具有最小残差的曲线。这会给你近似的公式(除非你只接受零残差的曲线),但也许你的应用可以吗?

答案 1 :(得分:0)

假设您想要的公式是多项式。

我们知道什么?对于A值列表,我们有它们的B值。对于“n”A值,我们可以找到的最佳多项式是(n-1)度。为什么呢?

基本上我正在解决如下的线性系统:

x + Ay + (A^2)z = B

以示例:

x + 3y + 9z = 20
x + 5y + 25z = 30
x + 6y + 35z = 35

解决这个问题后,我们可以发现(x,y,z)=(5,5,0)。这意味着我们的多项式是5 + 5A + 0(A ^ 2),这与示例中显示的B =(A + 1)* 5基本相同。

我们可以使用任何方法解决系统问题。不知道它是否有用,但我会在这里抛出一些代码用高斯消除法解决它(在Python中):

def solve(A, B):
    n = len(A)
    M = [[a**i for i in range(n)]+[b] for a,b in zip(A,B)]

    for i in range(n):
        M[i] = [x / M[i][i] for x in M[i]]

        for j in range(n):
            if j==i: continue
            M[j] = [xj - xi * M[j][i] for xi, xj in zip(M[i], M[j])]

    return [M[i][-1] for i in range(n)]

print solve([3,5,6], [20, 30, 35])

答案 2 :(得分:-1)

如果公式是一阶线性的,就像在示例中一样,那么您正在寻找:

http://en.wikipedia.org/wiki/Linear_regression

或更高阶线性方程

http://en.wikipedia.org/wiki/Polynomial_regression