• 大小: 3KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-06-11
  • 语言: Python
  • 标签: Python  线性回归  

资源简介

用Python自己写的线性回归。其方法包括用最小二乘法直接求解和梯度下降法求解。理解代码能让你更好东其原理

资源截图

代码片段和文件信息

“““直接法和梯度法求解线性回归“““

import numpy as np
import matplotlib.pyplot as plt
import time
from numpy.linalg import linalg as la
data =  np.array([[ 0.35291809  0.16468428  0.35774628]

       [-0.55106013 -0.10981663  0.25468008]

       [-0.65439632 -0.71406955  0.1061582 ]

       [-0.19790689  0.61536205  0.43122894]

       [-0.00171825  0.66827656  0.44198075]

       [-0.2739687  -1.16342739  0.01195186]

       [ 0.11592071 -0.18320789  0.29397728]

       [-0.02707248 -0.53269863  0.21784183]

       [ 0.7321352   0.27868019  0.42643361]

       [-0.76680149 -0.89838545  0.06411818]])

X = data[::2]
y = data[:-1]

“““直接求解“““
b = np.array([1])#偏移量 b shape=(101)
b=b.repeat(10)

“““将偏移量与2个特征值组合 shape = (103)“““
X = np.column_stack((bX))

xtx = X.transpose().dot(X)
xtx = la.inv(xtx)
theta = xtx.dot(X.transpose()).dot(y)

“““梯度求解“““
#model
def model(thetaX):
    theta = np.array(theta)
    return X.dot(theta)

#cost
def cost(mthetaXy):
    #print(theta)
    ele = y - model(thetaX)
    item = ele**2
    item_sum = np.sum(item)
    return item_sum/2/m

#gradient
def gradient(mthetaXycols):
    grad_theta = []
    for j in range(cols):
        grad = (y-model(thetaX)).dot(X[:j])
        grad_sum = np.sum(grad)    
        grad_theta.append(-grad_sum/m)
    return np.array(grad_theta)

#theta update
def theta_update(grad_thetathetasigma):
    return theta - sigma * grad_theta

‘stop stratege‘
def stop_stratege(costcost_updatethreshold):
    return cost-cost_update < threshold

# OLS algorithm
def OLS(Xythreshold):
    start = time.clock()
    # 样本个数
    m=10
    # 设置权重参数的初始值
    theta = [000]
    # 迭代步数
    iters = 0
    # 记录代价函数的值
    cost_record=[]
    # 学习率
    sigma = 0.0001
    cost_val = cost(mthetaXy)#代价函数
    cost_record.append(cost_val)
    while True:
        grad = gradient(mthetaXy3)#求梯度
        # 参数更新
        theta = theta_update(gradthetasigma)
        cost_update = cost(mthetaXy)
        if stop_stratege(cost_valcost_updatethreshold):
            break
        iters=iters+1
        cost_val = cost_update
        cost_record.append(cost_val)
    end = time.clock()
    print(“OLS convergence duration: %f s“ % (end - start))
    return cost_record iterstheta
if __name__==“__main__“:
    cost_record iterstheta=OLS(Xy1e-10)
##    x = range(iters)
    x = np.arange(0iters+11)
    plt.figure()
    plt.plot(xcost_record)
    plt.show()

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        2710  2020-03-14 22:09  线性回归的最小二乘法与梯度下降法代码.py

评论

共有 条评论