20python行代码能做哪些事? 菜鸟教你用20行代码搞定所有通用线性回归问题!!

算法函数 使用numpy 库来写出梯度下降的通用方法:

import numpy as np

def hyFunction(X, W):  # 定义假设函数:X是一个行向量  W是一个列向量
    return X.dot(W)
def costFunction(X, W, y):  # 成本函数:X是矩阵,W是向量,y也是向量
    return ((X.dot(W) - y).dot(X))*2  #一次计算所有的W的梯度值
def gradientFunction(X, W, y):# 梯度函数:
    return (X.dot(W) - y).dot(X) # 行向量
def gradientDescent(X, w, y, hyFunc, gFunc, lamb = 0.001 , tolance = 1.0e-8, times = 2000000):
    # 定义梯度下降算法
    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
    print(t)
    return w

把下列数据放到上面的函数中进行结果验证:


# 构造数据:验证算的有效性
# 下列x和y是使用函数:y=0.5*x*x*x+1.2*x*x-2.3*x+10 大致计算出来的
'''
x = np.array([-3, -2.3, -1.6, -1, -0.3, 0.3, 1, 1.6, 2.3, 3])
y = np.array([14.2, 15.5, 14.8, 13., 10.8, 9.4, 9.4, 11.8, 17.5, 27.4])

def make_x_ext(X):
    x_ext = np.c_[X[:,np.newaxis], np.ones(len(X))]         # 追加全1列
    x_ext = np.insert(x_ext, 0, np.power(X, 2), axis=1)     # 插入x*x数据列
    x_ext = np.insert(x_ext, 0, np.power(X, 3), axis=1)     # 插入x*x*x数据列
    return x_ext

w_init = np.array([2.5, 3.0, 1.2, 0.7]) # 猜测这就是最优的系数
x_ext = make_x_ext(x)
w = gradientDescent(x_ext, w_init, y, hyFunction, gradientFunction)
print(w)
'''
'''

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

运行次数与结果

111

 

                                                                              end!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值