# -*- 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)