线性回归-一元线性回归

理论推导

预测值:a*x+b
x:样本值
a,b:待确定
损失函数(最小二乘法),一个样本为: 1 2 1 \over 2 21 ( y − a ∗ x − b ) 2 (y-a*x-b)^2 yaxb2
代价函数(对于所有样本):J(a,b)= 1 2 m 1 \over 2m 2m1 ∑ i = 1 m \sum_{i=1}^{m} i=1m ( y ( i ) − a ∗ x ( i ) − b ) 2 (y^{(i)}-a*x^{(i)}-b)^2 y(i)ax(i)b2
梯度下降公式:a=a- 1 m 1 \over m m1 ∑ i = 1 m \sum_{i=1}^{m} i=1m ( y ( i ) − a ∗ x ( i ) − b ) (y^{(i)}-a*x^{(i)}-b) y(i)ax(i)b×(- x ( i ) x^{(i)} x(i)
b=b- 1 m 1 \over m m1 ∑ i = 1 m \sum_{i=1}^{m} i=1m ( y ( i ) − a ∗ x ( i ) − b ) (y^{(i)}-a*x^{(i)}-b) y(i)ax(i)b

代码

梯度下降

import numpy as np
import matplotlib.pyplot as plt
#载入数据
data=np.genfromtxt("data.csv",delimiter=",")
#样本值
x=data[:,0]
#真实值
y=data[:,1]
#绘制散点图
plt.scatter(x,y,color='b')
plt.show()

在这里插入图片描述

#一元线性回归 预测值:ax+b
a=0
b=0
#学习率
learning_rate=0.0001
#循环次数
loop=50
#梯度下降计算
def gradient_descent(x,y,a,b,learning_rate,loop):
    #长度
    m=float(len(x))
    for i in range(loop):
        #两个临时变量,存放加和
        a_temp=0
        b_temp=0
        for j in range(0,len(x)):
            a_temp+=-(1/m)*(y[j]-a*x[j]-b)*x[j]
            b_temp+=(1/m)*(y[j]-a*x[j]-b)
        #更新参数
        a=a-a_temp*learning_rate
        b=b-b_temp*learning_rate
        """
        if i % 5==0:
            plt.plot(x,y,'b.')
            plt.plot(x,a*x+b,'r')
            plt.show()
        """
    return a,b
#计算损失值,最小二乘法
def error(a,b,x,y):
    totalError=0
    for i in range(len(x)):
        totalError+=(y[i]-a*x[i]-b)**2
    return totalError/(2*float(len(x)))
a,b=gradient_descent(x,y,a,b,learning_rate,loop)
plt.plot(x,y,'b.')
plt.plot(x,a*x+b,'r')
plt.show()
print(error(a,b,x,y))

在这里插入图片描述

sklearn

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
#载入数据
data=np.genfromtxt("E:\\研究生\\资料\\程序\\回归\\data.csv",delimiter=',')
#样本值
x=data[:,0]
y=data[:,1]
plt.scatter(x,y,color='b')
plt.show()

在这里插入图片描述

#取某列数据后,再加一个维度,变成矩阵。
x=data[:,0,np.newaxis]
y=data[:,1,np.newaxis]
#创建并拟合模型
model=LinearRegression()
#要求数据为矩阵
model.fit(x,y)

在这里插入图片描述

plt.plot(x,y,'b.')
plt.plot(x,model.predict(x),'r')
plt.show()

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@玉面小蛟龙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值