我和Julia有一个简单的问题:我想找到一个超平面在n维中经过n个点的方程。有没有什么简单的方法可以做到这一点?我正在解一个线性方程组,但是它可以是非奇异的,在这种情况下,Julia返回一个错误。有没有已知的方法来解Julia中的参数方程组或非奇异方程组?
以为例,考虑三维点[1 0 0],[0 0 1]和[1 0 1]。我想让y = 0作为解,通过系数向量[0 1 0 0]。
在圣人a,b,c,d = var('a b c d')
f1 = a + d
f2 = a + c + d
f3 = c + d
solve([f1==0,f2==0,f3==0],a,b,c,d)
为
[[a == 0, b == r1, c == 0, d == 0]]
非常感谢您的帮助
我不确定我完全理解这个问题,但是如果我们使用系数矩阵和向量来表达上面的问题,Julia允许
julia> [1 0 0 1; 1 0 1 1; 0 0 1 1] [0; 0; 0]
4-element Array{Float64,1}:
-0.0
0.0
-0.0
-0.0
得到一个特解和
julia> nullspace([1 0 0 1; 1 0 1 1; 0 0 1 1])
4×1 Array{Float64,2}:
3.92523e-17
1.0
0.0
-3.92523e-17
得到解空间的一个基底。(这里的数值问题有点不幸,理想情况下应该是[0;1;0;[0]当然。)如果我们把它读作[a; b; c; d] = [0; 0; 0; 0] + r*[0; 1; 0; 0]
,它基本上就是问题中给出的解。
如果矩阵是秩不足的,例如因为点共线,你仍然会得到的特解,但
nullspace
将返回一个基,其中不止一个向量。
这样做的一种方法是为这些点的协方差矩阵的最小特征值找到一个特征向量。这在计算上有点繁重。
我们可以用单位向量n和标量d来表示超平面,那么超平面上的点就是n'*x+d = 0的x。对于点x, n'*x+d是x到平面的距离。我们可以用最小二乘来求超平面:
如果X[]是k个给定点,我们求n, d使
最小Q(n,d) = Sum{ i | sqr( X[i]'*n+d)}/k
给定n,最小的d将是-Xbar。n,其中Xbar是X的均值,所以我们可以代入d,最小化
Q(n) = Sum{ i | sqr( x[i]'*n)}/k = n'*C*n
,
x[i] = X[i] - Xbar
C = Sum{ i | x[i]*x[i]'}/k -- the covariance of the data
这个Q将被一个n最小化,这个n是c的最小特征值的特征向量
所以练习是:计算Xbar和C。对角化C(如U * D * U'),如果D的最小项在(i,i)处,选择U的第i列),最后计算D为-n'*Xbar。
请注意,这里唯一的困难是这里可能有许多D的最小值—例如,如果所有的点都位于n-2维平面上。