23、线性回归(python,lasso采用坐标下降)

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 27 18:17:15 2019

@author: zhangchaoyu
"""
import random
import matplotlib.pyplot as plt
import numpy as np
from numpy import *
import itertools
def sample_generate(K, n, x_max, noise):
    X = [[int(x_max*random.random()) for j in range(len(K)-1)]+[1] for i in range(n)]
    Y = [[sum([K[j]*X[i][j] for j in range(len(K))])+int(noise*random.random())] for i in range(n)]
    return [X,Y]

#L2正则(岭回归)
def w_ridge(X,Y):
    XTX = np.dot(X.T, X)
    c = 1e-5
    if np.linalg.det(XTX) == 0:
        XTX = XTX + c*np.eye(len*(XTX))
    #逆
    #w = np.dot(np.linalg.inv(XTX), np.dot(X.T, Y))
    #广义逆
    w = np.dot(np.linalg.pinv(XTX), np.dot(X.T, Y))
    return w

def show(K,w):
    print("原始参数:"+str(K))
    w = w.tolist()
    for i in range(len(w)):
        w[i] = w[i][0]
    print("回归参数:"+str(w))

def lost_lasso(X, Y, w, lambd):
    return ((Y-X*w).T*(Y-X*w))[0,0] + lambd*sum([abs(w[i,0]) for i in range(w.shape[0])])

#L1正则(lasson)   
def w_lasson(X, Y, lambd=0.2, threshould=0.1):
    
    m,n = X.shape
    w = np.matrix(np.zeros((n,1)))
    lost = lost_lasso(X, Y, w, lambd)
    
    while True:
        for i in range(n):
            a = (X[:,i].T*X[:,i])[0,0]
            dw = np.matrix(np.zeros((n,1)))
            dw[i,0] = w[i,0]
            b0 = -2*(X.T*(Y-X*(w-dw)))[i,0]
            if b0 <= -lambd:
                w[i,0] = (-lambd-b0)/a/2
            elif b0 >= lambd:
                w[i,0] = (lambd-b0)/a/2
            else:
                w[i,0] = 0
        lost1 = lost_lasso(X, Y, w, lambd)
        if abs(lost-lost1) <= threshould:
            break
        lost = lost1
    return w
    
K = [3,4,5,6,7,8,9,0]
sample =  sample_generate(K, 100, 100, 2)
X = np.matrix(sample[0])
Y = np.matrix(sample[1])
#岭回归
w = w_ridge(X,Y)
show(K,w)
w1 = w_lasson(X, Y)
show(K,w1)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值