线性回归-一元线性回归
理论推导
预测值: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()
上一篇:
通过多线程提高代码的执行效率例子
