Обычно в нелинейных методах наименьших квадратов обратное значение y берется в качестве веса, что практически исключает выбросы. Вы можете расширить эту идею, добавив функцию для вычисления веса на основе положения x.
def xWeightA(x):
container=[]
for k in range(len(x)):
if k<int(0.9*len(x)):
container.append(1)
else:
container.append(1.2)
return container
def approximate_log_function(x, y):
C = np.arange(0.01, 1, step = 0.01)
a = np.arange(0.01, 1, step = 0.01)
b = np.arange(0.01, 1, step = 0.01)
min_mse = 9999999999
parameters = [0, 0, 0]
LocalWeight=xWeightA(x)
for i in np.array(np.meshgrid(C, a, b)).T.reshape(-1, 3):
y_estimation = LocalWeight*i[0] * np.log(i[1] * np.array(x) + i[2])
mse = mean_squared_error(y, y_estimation)
if mse < min_mse:
min_mse = mse
parameters = [i[0], i[1], i[2]]
return (min_mse, parameters)
Кроме того, похоже, что вы выполняете оценку через целевую функцию, которая заставляет код занимать много времени, чтобы найти минимум (по крайней мере, на моей машине).Вы можете использовать кривую или полифит, как предложено, но если целью является создание оптимизатора, попробуйте добавить ранний разрыв или случайный поиск по сетке.Надеюсь, это поможет