Регрессия с небольшим набором данных

#python #regression #non-linear-regression

#python #регрессия #нелинейная регрессия

Вопрос:

Мы исследовали программное обеспечение, которое предположительно использовалось для взлома. Мы обнаружили, что время работы существенно зависит от длины ввода N, особенно когда N больше 10-15. Во время наших тестов мы исправили следующие рабочие времена.

 N = 2 - 16.38 seconds 
N = 5 - 16.38 seconds 
N = 10 - 16.44 seconds 
N = 15 - 18.39 seconds 
N = 20 - 64.22 seconds 
N = 30 - 65774.62 seconds
 

Задачи:
найдите время работы программы для следующих трех случаев —
N = 25, N = 40 и N = 50.

Я пытался выполнить полиномиальную регрессию, но прогнозы варьировались от степени 2,3, …

 # Importing the libraries 
import numpy as np 
import matplotlib.pyplot as plt 

# Importing the dataset 
X = np.array([[2],[5],[10],[15],[20],[30]])
X_predict = np.array([[25], [40], [50]])
y = np.array([[16.38],[16.38],[16.44],[18.39],[64.22],[65774.62]])
#y = np.array([[16.38/60],[16.38/60],[16.44/60],[18.39/60],[64.22/60],[65774.62/60]])


# Fitting Polynomial Regression to the dataset 
from sklearn.preprocessing import PolynomialFeatures 

poly = PolynomialFeatures(degree = 11) 
X_poly = poly.fit_transform(X) 

poly.fit(X_poly, y) 
lin2 = LinearRegression() 
lin2.fit(X_poly, y) 

# Visualising the Polynomial Regression results 
plt.scatter(X, y, color = 'blue') 

plt.plot(X, lin2.predict(poly.fit_transform(X)), color = 'red') 
plt.title('Polynomial Regression') 


plt.show() 

# Predicting a new result with Polynomial Regression 
lin2.predict(poly.fit_transform(X_predict))
 

Для степени 2 результаты были

 array([[ 32067.76147835],
       [150765.87808383],
       [274174.84800471]])
 

Для степени 5 результаты были

 array([[  10934.83739791],
       [ 621503.86217946],
       [2821409.3915933 ]])
 

Комментарии:

1. В чем вопрос?

2. какую модель регрессии я должен использовать

Ответ №1:

После поиска по уравнению я смог подогнать данные к уравнению «секунды = a * exp (b * N) смещение» с установленными параметрами a = 2.5066753490350954E-05, b = 7.2292352155213369E-01 и смещение = 1.6562196782144639E 01, что дает RMSE = 0.2542 и R-квадрат =0,99999. Эта комбинация данных и уравнений чрезвычайно чувствительна к начальным оценкам параметров. Как вы можете видеть, он должен интерполироваться с высокой точностью в пределах диапазона данных. Поскольку уравнение простое, оно, вероятно, будет экстраполироваться далеко за пределы диапазона данных. Насколько я понимаю ваше описание, если используется другое компьютерное оборудование или если алгоритм взлома распараллелен, то это решение не будет соответствовать этим изменениям.

введите описание изображения здесь

Комментарии:

1. Именно то, что я ищу. Я пробовал экспериментировать, но я всегда получаю «Количество вызовов функции достигло maxfev = 800» Не могли бы вы объяснить, как вы получили свои результаты?

2. Я использовал свой веб-сайт с открытым исходным кодом для подгонки кривой Python zunzun.com чтобы выполнить поиск уравнения, он использует генетический алгоритм дифференциальной эволюции для определения начальных оценок параметров для нелинейных уравнений, подобных этому. Из лучших кандидатов из результатов поиска equation этот показался наиболее вероятным. Затем я вставил ваши данные в подходящий интерфейс веб-сайта для этого уравнения по адресу zunzun.com/Equation/2/Exponential/Exponential With Offset и нажмите кнопку Отправки.

Ответ №2:

Поскольку эта программа используется для взлома, она может использовать какую-то грубую силу, что приводит к экспоненциальному времени выполнения, поэтому гораздо лучше найти решение как

y = a b * c ^ n

например:

16.38 2.01 ^ n / 20000

Вы можете попробовать прогнозировать log(time) вместо time в LinearRegression

Комментарии:

1. ваша интуиция и советы превосходны, поэтому я поддержал. Пожалуйста, посмотрите мой ответ на этот вопрос.