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