二十行代码构造多元线性回归的通用解法(手动加精!)

代码实例(线性回归的定义?百度百科不香么)

引入模块

import numpy as np

定义判别函数(假设的)

def hyFunction(X,W):
    '''
    :param X:行向量(需要扩维,常量位置为1在最后)
    :param W: 列向量
    :return:
    '''
    return X.dot(W)
    pass

定义梯度函数

def gradientFunction(X, W, y):
    return (X.dot(W) - y).dot(X)
    pass

定义梯度下降函数

def gradientDescent(X, w, y, hyFunc, gFunc, lamb = 0.001 , tolance = 1.0e-8, times = 2000000):
	'''
    :param X: 样本
    :param W: 猜的数据
    :param y: 实际结果
    :param hyFunc:判别函数
    :param gFunc:梯度函数
    :param lamb: 步进系数,与次数负相关,一般为0.1到0.001
    :param tolance: 收敛条件,一般为10的负6次到10的负8次之间
    :param times: 次数
    :return:
    '''
    #计算次数,用来与times比较
    t = 0
    # 上一次结算结果
    result = hyFunc(X, w)
    # 上一次的梯度
    g = gFunc(X, w, y)
    # 根据梯度和步进系数计算的新的点
    newW = w - lamb*g
    # 代入判别函数计算新的结果值
    newResult = hyFunc(X, newW)
    # 如果两次的结算结果的差值没有达到收敛条件,继续迭代
    while np.sum(np.abs(result - newResult))/X.shape[0] > tolance:
        # 把点移动到新的点
        w = newW
        result = newResult
        g = gFunc(X, w, y)
        newW = w - lamb * g
        newResult = hyFunc(X, newW)
        t += 1
        # 避免无法收敛的情况
        if t > times:
            break
            pass
        pass
    print(t)    #检验次数,观察最佳的步进系数和次数
    return w
    pass

样本及结果

# f(x1, x2) = w0 + w1*x1 + w2*x2     其中w1 = 2  w2 = 1  w0=3
X = np.array([[3, 0],[4, 1], [5,2], [7,3]])
y = np.array([9, 12,15, 20])
row = X.shape[0]  #获取第一列
one = np.ones(row)   #将同样式的数变为全1
print(one)
one = one[:,np.newaxis] #扩维成行
print(one)
X = np.hstack((X, one)) #将列添加到最后,对应常量
print(X)

w = gradientDescent(X, np.array([100, 200, 20]), y, hyFunction, gradientFunction)  #调用梯度下降函数
print(w)

结果截图

在这里插入图片描述
与猜测结果(2,1,3)接近,成功!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值