Результаты numpy.linalg.svd меняются в зависимости от количества набранных баллов - PullRequest
0 голосов
/ 26 ноября 2018

У меня возникли проблемы с numpy.linalg.svd при подборе линии, наиболее подходящей для спирали.Я создал идеальную спираль, используя следующее параметрическое уравнение:

import numpy as np

def helix(t):
    c = 0.5
    r = 5
    X = r * np.cos(t)
    Y = r * np.sin(t)
    Z = c * t
    return X, Y, Z

Чтобы рассчитать ось винта этой спирали, я сгенерировал некоторые точки из уравнения спирали, выполняя итерацию и нанося на график диапазон значений t,и вычислили SVD массива:

value = []
matrix = []
for i in range(0,101):
    value = helix(i)
    matrix.append(value)

array = np.array(matrix)

datamean = list(array.mean(axis=0))
subtracted = array - datamean
uu, ss, vv = np.linalg.svd(subtracted)

Для этой спирали SVD, принадлежащее вектору оси винта, должно быть (0,0,1).Тем не менее, в результате SVD (-0.00331051, -0.0121754,0.99992).Хотя разница между вычисленным вектором и вектором (0,0,1) кажется небольшой, это приводит к резкому отклонению от оси истинного винта при вращении спирали вокруг других осей.Интересно то, что когда я использую 1000 точек вместо 100 точек для определения спирали, для которой рассчитываются SVD, результирующий вектор эффективно (0,0, -1), что является ожидаемым результатом.

Мои два вопроса:

1) Почему numpy.linalg.svd выдает разные значения SVD для разного количества точек, принадлежащих одной и той же параметрической функции?

2)Если есть логическое объяснение 1, какой другой метод я могу использовать, чтобы устранить это смещение?Я работаю с короткими спиралями, и мне нужен метод, чтобы точно рассчитать ось винтов моих спиралей.

...