Обходные пути для большой ошибки с плавающей запятой в массивах NumPy, возведенных в степеньPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Обходные пути для большой ошибки с плавающей запятой в массивах NumPy, возведенных в степень

Сообщение Anonymous »

У меня есть данные, которые представляют собой ответы 24(?)-битного аналого-цифрового преобразователя. Я настраиваю данные для полиномиальной регрессии в приведенной ниже функции, но получаю огромное количество ошибок с плавающей запятой, настолько большое, что коэффициенты моей регрессии становятся совершенно непригодными для дальнейшего использования.
Данные после нормализации находятся в диапазоне от -1 до 1. Я получаю ошибки с плавающей запятой примерно ~ 0,15 в терминах, доходящих до четвертой степени. По внешним причинам я не могу понизить степень членов регрессии, но спасибо @Robert Dodier за указание на то, что этот метод, как правило, становится довольно нестабильным при добавлении более высоких степеней.
Есть ли способ уменьшить ошибку с плавающей запятой? Скорость и память здесь не являются главной целью: точность должна быть близка к точной, если это возможно. Набор данных довольно небольшой (~ 400 строк).
Я также пробовал использовать класс «mpfr» библиотеки gmpy2, но, похоже, это не имело никакого значения. Для полноты я включил и эту версию.
После этой функции я просто передаю данные в регрессию, разложенную по QR (см. ниже).
После обработки данных я также проверил, можно ли отнести ошибку с плавающей запятой на счет регрессии, но когда я запускаю регрессию в стиле SVD, я получаю почти такие же коэффициенты, как и в стиле QR, так что это не проблема.
Вот эти функции:
import numpy as np
def load_data(path):
data = np.loadtxt(path, delimiter=',')

# Features
A = data[:, 1:3]

# Normalize the data
A /= (2 ** 24)

# Extract columns P and T
P = A[:, 0]
T = A[:, 1]

# Compute new columns based on P and T
col_ones = np.ones_like(P, dtype=float)
T2 = T ** 2
T3 = T ** 3
PT = P * T
PT2 = P * (T ** 2)

# ... continue making features

# Combine the new columns into a new array
A = np.column_stack((col_ones, T, T2, T3, P, PT, PT2)) # ... add higher degree features
b = data[:, 0] # ref

return A, b

import gmpy2
from gmpy2 import mpfr
def load_data_gmpy(path):
data = np.loadtxt(path, delimiter=',', skiprows=15)

# Features
b = data[:, 0] # ref
P = data[:, 1]
T = data[:, 2]

gmpy2.set_context(gmpy2.context())
with gmpy2.local_context() as ctx:
ctx.precision = 2000

# Normalize the data
P = [mpfr(p) / (2 ** 24) for p in P]
T = [mpfr(t) / (2 ** 24) for t in T]

# Compute new columns based on P and T
col1 = np.ones_like(P, dtype=float)
T2 = np.array([float(t ** 2) for t in T])
T3 = np.array([float(t ** 3) for t in T])
PT = np.array([float(p * t) for p, t in zip(P, T)])
PT2 = np.array([float(p * (t ** 2)) for p, t in zip(P, T)])
# ... continue making features

# Convert the results back to numpy arrays
# add higher-degree features here...
A = np.column_stack((col1, np.array(T, dtype=float), T2, T3, np.array(P, dtype=float), PT, PT2))

return A, b

РЕДАКТИРОВАТЬ:
Вот другой код, который я использую:
def do_qr_regression(X, y):
# QR decomposition
Q, R = np.linalg.qr(X)
beta = np.linalg.inv(R).dot(Q.T).dot(y)

# predict using coefficients
yhat = X.dot(beta)

return beta, yhat

def do_svd_regression(X, y):
# calculate coefficients

beta = np.linalg.pinv(X).dot(y)
# predict using coefficients
yhat = X.dot(beta)

return beta, yhat

if __name__ == '__main__':
data, ref = load_data("path\to\file.txt")

coefs_qr, values = do_qr_regression(data, ref)
residuals_qr: np.array = values - ref

coefs_svd, values = do_svd_regression(data, ref)
residuals_svd: np.array = values - ref

plt.plot(residuals_qr, 'r-', label='QR')
plt.plot(residuals_svd, 'g-', label='SVD')

plt.xlabel('Index')
plt.ylabel('Residuals')
plt.title('Comparison of Residuals')

plt.legend()
plt.grid()
plt.show()

coefs_qr = np.array(coefs_qr)
coefs_svd = np.array(coefs_svd)

# Combine the coefficients into a single array for easier handling
coefficients = np.column_stack((coefs_qr, coefs_svd))

fig, ax = plt.subplots()

# Hide the axes
ax.axis('tight')
ax.axis('off')

table = ax.table(cellText=coefficients, colLabels=['QR', 'SVD'], loc='center')

plt.show()


Подробнее здесь: https://stackoverflow.com/questions/774 ... -to-powers
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»