Como executar regressão não negativa da crista? Laço não negativo está disponível em scikit-learn
, mas para cume, não posso impor a não-negatividade de betas e, de fato, estou obtendo coeficientes negativos. Alguém sabe por que isso é?
Além disso, posso implementar cume em termos de mínimos quadrados regulares? Movi isso para outra pergunta: Posso implementar a regressão de cume em termos de regressão de OLS?
Respostas:
A resposta bastante anticlimática a " Alguém sabe por que isso acontece? " É que simplesmente ninguém se importa o suficiente para implementar uma rotina de regressão não negativa da crista. Um dos principais motivos é que as pessoas já começaram a implementar rotinas líquidas elásticas não negativas (por exemplo, aqui e aqui ). A rede elástica inclui a regressão da crista como um caso especial (essencialmente, a parte do LASSO define uma ponderação zero). Esses trabalhos são relativamente novos e ainda não foram incorporados ao scikit-learn ou a um pacote de uso geral semelhante. Você pode consultar os autores desses documentos para obter código.
EDITAR:
Como @amoeba e eu discutimos nos comentários, a implementação real disso é relativamente simples. Digamos que um tenha o seguinte problema de regressão para:
onde e são normais normais, como: . Observe que eu uso variáveis preditoras padronizadas para não precisar normalizar posteriormente. Para simplificar, também não incluo uma interceptação. Podemos resolver imediatamente esse problema de regressão usando regressão linear padrão. Portanto, em R, deve ser algo como isto:x 2 x p ∼ N ( 0 , 1 )x1 x2 xp∼N(0,1)
Observe a última linha. Quase toda rotina de regressão linear usa a decomposição QR para estimar . Gostaríamos de usar o mesmo para o nosso problema de regressão de crista. Neste ponto, leia este post por @whuber; estaremos implementando exatamente esse procedimento. Em resumo, aumentaremos nossa matriz de projeto original com uma matriz diagonal e nosso vetor de resposta com zeros de . Dessa maneira, poderemos reexprimir o problema original de regressão da crista como queX √β X yp(XTX+λI) - 1 XTy( ˉ X T ˉ X ) - 1 ˉ X T ˉ y ¯λ−−√Ip y p (XTX+λI)−1XTy (X¯TX¯)−1X¯Ty¯ ¯ simboliza a versão aumentada. Verifique os slides 18-19 dessas anotações também para verificar se estão completos, eu os achei bastante diretos. Assim, em R, gostaríamos do seguinte:
e funciona. OK, então obtivemos a parte da regressão da crista. Poderíamos resolver de outra maneira, porém, poderíamos formulá-lo como um problema de otimização, em que a soma residual dos quadrados é a função de custo e, então, otimizar em relação a ela, ou seja. . Com certeza, podemos fazer isso:minβ||y¯−X¯β||22
que, como esperado, novamente funciona. Então agora queremos apenas: que . O que é simplesmente o mesmo problema de otimização, mas restrito para que a solução não seja negativa. β≥0minβ||y¯−X¯β||22 β≥0
que mostra que a tarefa original de regressão não negativa da crista pode ser resolvida reformulando-a como um simples problema de otimização restrita. Algumas advertências:
optim
o argumento L-BFGS-B . É o resolvedor de baunilha mais R que aceita limites. Estou certo de que você encontrará dezenas de melhores solucionadores.Código para o ponto 5:
fonte
O pacote R glmnet que implementa rede elástica e, portanto, laço e cume permite isso. Com os parâmetros
lower.limits
eupper.limits
, você pode definir um valor mínimo ou máximo para cada peso separadamente, portanto, se você definir limites inferiores para 0, ele executará uma rede elástica não-negativa (laço / cume).Há também um wrapper python https://pypi.python.org/pypi/glmnet/2.0.0
fonte
Lembre-se de que estamos tentando resolver:
é equivalente a:
com um pouco mais de álgebra:
A solução em pseudo-python é simplesmente:
veja: Como se faz os mínimos quadrados não negativos escassos usando regularizadores da forma ?x ⊤ R k xK x⊤Rkx
para uma resposta um pouco mais geral.
fonte