Как реализовать наименьшее абсолютное восстановление как задачу линейной оптимизации - PullRequest
0 голосов
/ 08 января 2019

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

a lineal formulation

КОД ОБНОВЛЕНИЯ Пока это мой код, но я уверен, что он бесполезен, потому что я получаю следующую ошибку:

ОШИБКА: не выполнено правило при создании выражения для ограничения neg_Constraint с индексом 1: AttributeError: объект 'NoneType' не имеет атрибута 'getname'

#Settings my variables
nsample = 100
nvariables = 2
beta=np.random.randint(-5,5,size=([nvariables+1,1]));
x0 = np.ones([nsample,1])
x1 = np.random.uniform(0,5,([nsample,nvariables]))
X = np.concatenate([x0,x1], axis = 1)
error = np.random.normal(0,1, (nsample,1))
Y = np.dot(X, beta) + error

#Defining my model
from pyomo.environ import *
opt = SolverFactory("glpk")
from pyomo.environ import SolverFactory

def la_reg_opt(n,m,x,y):

    model =  AbstractModel()
    model.n = n
    model.m = m

    model.I = RangeSet(1, model.n)
    model.J = RangeSet(1, model.m)

    model.y = y
    model.x = x
    model.b = Var(model.J, domain = NonNegativeReals)
    model.t = Var(model.I, domain = NonNegativeReals) #Tercera restriccion

    def obj_funct(model):
        return summation(model.t)
    model.OBJ = Objective(rule = obj_funct)

    def lower_bound(model,i):
        return   model.y[i] - sum(model.x[i,j]*model.b[j] for j in model.J) >= -model.t[i]
    model.neg_Constraint = Constraint (model.I, rule = lower_bound) 

    def upper_bound(model,i):
        return  model.y[i] - sum(model.x[i,j]*model.b[j] for j in model.J) >= model.t[i] 
    model.pos_Constraint = Constraint (model.I, rule = upper_bound) 

    instance = model.create_instance()
    instance.dual = Suffix(direction=Suffix.IMPORT)
    results = opt.solve(instance)

    return results


#calling my model
res=la_reg_opt(nsample, nvariables, X, Y)
print (res)

Что я делаю не так?

Чем тебе столько.

...