Как добавить ограничение «больше 0 и суммы в 1» к регрессии в Python? - PullRequest
0 голосов
/ 27 февраля 2019

Я использую statsmodels (открытые для других опций Python) для запуска некоторой линейной регрессии.Моя проблема в том, что мне нужно, чтобы регрессия не имела перехвата и не ограничивала коэффициенты в диапазоне (0,1), а также суммировала до 1.

Я пробовал что-то подобное (по крайней мере, для суммы 1):

from statsmodels.formula.api import glm
import pandas as pd

df = pd.DataFrame({'revised_guess':[0.6], "self":[0.55], "alter_1":[0.45], "alter_2":[0.2],"alter_3":[0.8]})
mod = glm("revised_guess ~ self + alter_1 + alter_2 + alter_3 - 1", data=df)
res = mod.fit_constrained(["self + alter_1 + alter_2 + alter_3  = 1"],
                          start_params=[0.25,0.25,0.25,0.25])
res.summary()

, но все еще борется за соблюдение ограничения «неотрицательных» коэффициентов.

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Вы могли бы NNLS (неотрицательные наименьшие квадраты) , что определено под scipy.Он основан на FORTRAN неотрицательном наименьших квадратов.Вы не можете добавить ограничения к нему.Поэтому добавьте другое уравнение, такое что x1 + x2 + x3 = 1 к входным уравнениям.

import numpy as np
from scipy.optimize import nnls 
##Define the input vectors
A = np.array([[1., 2., 5.], 
              [5., 6., 4.],
              [1.,  1.,   1. ]])

b = np.array([4., 7., 2.])

##Caluculate nnls
x, resdiual_norm = nnls(A,b)


##Find the difference
print(np.sum(A*x,1)-b)

Теперь выполните NNLS над этой матрицей, она вернет значения x и остатки.

0 голосов
/ 11 марта 2019

Просто выполните регуляризованную регрессию L1:

import statsmodels.api as sm
from statsmodels.regression.linear_model import OLS
model = sm.OLS(Y,X)
model2=model.fit_regularized(method='elastic_net', alpha=0.0, L1_wt=1.0, start_params=None, profile_scale=False, refit=False)
model2.params

... и настройте гиперпараметры.

...