线性回归,二维

# -*- coding: utf-8 -*-
"""
Created on Wed Aug 30 15:27:51 2017

@author: liuxy
"""

import numpy as np
import matplotlib.pyplot as plt

def gen_data(size):
    x1 = np.arange(0, size, 1)
    x2 = np.arange(0, size, 1)
    e = np.random.normal(0, 3, size)
    y = 2*x1 + x2 + e
    return np.array([x1, x2, y])


def compute_gradient_full(data,  w):
    X1 = data[0]
    X2 = data[1]
    Y = data[2]
    N = len(Y)
    g1 = np.sum(2*X1*2*(X1*w[0] - Y))/N 
    g2 = np.sum(2*X2*(X2*w[1] - Y))/N      
    return np.array([g1, g2])
    
def compute_gradient_sgd(data,  w):
    X1 = data[0]
    X2 = data[1]
    Y = data[2]
    idx = np.random.randint(0, len(Y)-1);
    x1 = X1[idx]
    x2 = X2[idx]
    y = Y[idx]
    g1 = 2
    g1 = 2*x1*2*(x1*w[0] - y) 
    g2 = 2*x2*(x2*w[1] - y)      
    return np.array([g1, g2])

def Optimizer(data, learning_rate, num_iterator, Wts, method):
    w = Wts[0]
    for i in range(num_iterator):    
        if ('full' == method):
            g = compute_gradient_full(data, w)
        if ('sgd' == method):
            g = compute_gradient_sgd(data, w)    
        w = w - learning_rate * g
        Wts.append(w)
   
        
data = gen_data(100)


lr = 0.00005
w = [80,59]
num = 100

Weights_full = []
Weights_full.append(w)
Optimizer(data, lr, num, Weights_full, 'sgd')


w1 = np.arange(0, 100, 0.2)
w2 = np.arange(0, 100, 0.2)
W1, W2 = np.meshgrid(w1, w2)

X1 = data[0]
X2 = data[1]
Y = data[2]
Z = []
for i in range(len(w1)):
    ls = []
    for j in range(len(w2)):
        L = (np.sum((X1*w1[i] + X2*w2[j] - Y)**2))/len(Y)
        ls.append(L)
    Z.append(ls)
    
Zs = np.array(Z)
plt.contour(W1, W2, Zs)

WWW = np.array(Weights_full)
plt.scatter(WWW[:,0], WWW[:,1])    
plt.plot(WWW[:,0], WWW[:,1]) 

上图分别为 full batch 与 sgd 的效果图


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值