Задача
Код выполняет геостатистическую интерполяцию с применением кригинга.Для небольшого размера данных это прекрасно работает.Однако когда данные большие, время вычислений резко увеличивается.
Константы
c1, c2, c3, c4
- это константы
matrx
- это набор данныхразмером 6000 x 6000
Переменные
data
- это массив 6000 x 3
gdata
- это массив 10000 x 2
Код
Ниже приведен фрагмент кода, в котором у меня возникла проблема:
prediction = []
for i, dummy_val in range(10000):
semivariance = []
for j in range(len(data[:, 2])):
distance = np.sqrt((gdata[i, 0]-data[j, 0])**2 + (gdata[i, 1]-data[j, 1])**2)
semivariance.append((c1 + c2*(1-np.exp(-(distance/c3)**c4))))
semivariance.append(1)
iweights = np.linalg.lstsq(matrx, semivariance, rcond=None)
weights = iweights[:-3][0][:-1]
prediction.append(np.sum(data[:, 2]*weights))
Когда я отлаживаю код, я понимаю, чтопроблема связана с
iweights = np.linalg.lstsq(matrx, semivariance, rcond=None)
, который работает очень медленно для большого массива matrx
и semivariance
, который я использую.
Есть ли питонский способ помочь улучшить скорость вычислений или способ, которым я мог бы переписать весь блок кода для повышения скорости?