python的numpy,plt,模块实现线性回归,详细分析

布丁出击

第一步:安装相应模块

如果你的Python还没有安装相关模块的话,那就建议看看我的小白教程哦!Python的Anaconda,Spyder的安装
安装好了之后,我们就可以开始啦!

第二步:模块导入

import numpy as np
import matplotlib.pyplot as plt

第三步:定义生成data函数

def get_data(a, b, n): #以线性函数为模型,ax+b,n为生成多少个数据
    np.random.seed(0) #设置随机种子
    X = np.array([i for i in range(1, n)]) #生成x坐标
    y = X * a + b + np.random.normal(0.0, 1.0, n-1) #y=ax+b+c(c为一个随机波动,np.random.normal(0.0, 1.0, n)的意思为均值为0,方差为1的随机数n个)
    return X,y

第四步:定义代价函数

我们定义代价函数为 F ( a , b ) = 1 2 n ∑ 0 n   ( a x i + b − y i ) 2 . F(a,b) =\frac{1}{2n} \sum_0^n\ (ax_i +b-y_i)^2. F(a,b)=2n10n (axi+byi)2.

def cost(X, y, alpha):
    d = 0
    for i in range(0, len(X)):
        a = alpha[0] * X[i] + alpha[1] - y[i]# 即求出$(ax_i +b-y_i)$的值
        d =d + a * a # 求出平方后累加
    return d/(2 * len(X))

第五步:梯度下降

我们使用梯度下降的方法完成代价函数的收敛 η i = η i − α ∂ F ( a , b ) ∂ η \eta _i =\eta _i-\alpha \frac{\partial F(a,b) }{\partial \eta} ηi=ηiαηF(a,b)
其中 α \alpha α为步长。

def get_alpha(alpha, n):
    c,d = 0, 0
    for i in range(0, len(X)):
        a = alpha[0] * X[i] + alpha[1] - y[i]
        d = d + a * X[i]
        c = c + a
    e = alpha - n * np.array([d/(len(X)), c/(len(X))])
    return e

这里得出了梯度下降的函数,就可以下一步了。

第六步:拟合

def count(X, y, alpha, n, s): # s为迭代次数,n为学习步长
    Cost = [] #定义一个代价列表,用于后期绘图
    i = []  #定义次数列表
    j = 1 #用于学习次数
    cost1 = cost(X, y, alpha)
    while j < s:
        Cost.append(cost1)
        alpha = get_alpha(alpha, n)
        cost1 = cost(X, y, alpha)
        j += 1
        i.append(j)
    plt.plot(i, Cost) #画出迭代过程代价函数值的下降过程
    plt.show()
    return alpha

第七步:函数使用

X, y = get_data(2, 3, 100)#生成y=2x+3的模型数据
alpha = np.array([3,13])#设置初始的$\eta$的值
alpha = count(X, y, alpha, 0.0001, 1000000)#传入$\alpha$=0.0001,迭代次数1000000
print(alpha) #打印最后学习出的$\alpha$
plt.plot(X, y)#绘画原始数据图
plt.plot(X, alpha[0] * X + alpha[1])#绘画拟合数据图
plt.show()

第八步:完整代码展示

import numpy as np
import matplotlib.pyplot as plt

# 生成数据
def get_data(a, b, n):
    np.random.seed(0)
    X = np.array([i for i in range(1, n)])
    y = X * a + b + np.random.normal(0.0, 1.0, n-1)
    return X,y

# 代价函数
def cost(X, y, alpha):
    d = 0
    for i in range(0, len(X)):
        a = alpha[0] * X[i] + alpha[1] - y[i]
        d =d + a * a
    return d/(2 * len(X))

# 梯度下降策略
def get_alpha(alpha, n):
    c,d = 0, 0
    for i in range(0, len(X)):
        a = alpha[0] * X[i] + alpha[1] - y[i]
        d = d + a * X[i]
        c = c + a
    e = alpha - n * np.array([d/(len(X)), c/(len(X))])
    return e

# 拟合求解
def count(X, y, alpha, n, s):
    Cost = []
    i = []
    j = 1
    cost1 = cost(X, y, alpha)
    while j < s:
        Cost.append(cost1)
        alpha = get_alpha(alpha, n)
        cost1 = cost(X, y, alpha)
        j += 1
        i.append(j)
    plt.plot(i, Cost)
    plt.show()
    return alpha

X, y = get_data(2, 3, 100)
alpha = np.array([3,13])
alpha = count(X, y, alpha, 0.0001, 1000000)
print(alpha)
plt.plot(X, y)
plt.plot(X, alpha[0] * X + alpha[1])
plt.show()

第九步:效果展示

在这里插入图片描述
代价函数值得下降过程
在这里插入图片描述
原始数据图
在这里插入图片描述
拟合的数据图与原始数据图的对比

我是布丁,记录学习瞬间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布丁出击

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值