线性回归-一元线性回归

理论推导

预测值:a*x+b x:样本值 a,b:待确定 损失函数(最小二乘法),一个样本为: 1 2 1 over 2 21 ( y − a ∗ x − b ) 2 (y-a*x-b)^2 (y−a∗x−b)2 代价函数(对于所有样本):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)−a∗x(i)−b)2 梯度下降公式: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)−a∗x(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)−a∗x(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()
经验分享 程序员 微信小程序 职场和发展