1.假设函数 或者 预测函数:
在一维特征空间,线性回归是通过学习一条直线 ,使得这条直线尽可能拟合所有已有的看到的点y,并且希望看到的(数据)也尽可能落落在这条线上(泛化能力),是预测值,y是实际值。
其中参数w0称为“偏置”,w1称为“权重”,x表示输入变量X的一个“特征变量”,这里先假设只有一个特征变量。
Note:我这里用w代表theta,他的实际含义都是“weight”
2.成本函数(cost function)或者 损失函数
我们要知道,拟合的函数h(x)有一定的误差,我们用成本函数J来表示“预测输出”h(x)与实际输出y之间的误差。这里使用最简单的“最小均方”(Least mean square)来描述:
所以现在变成了一个优化问题,即找到令损失函数J()最小的theta,定义均方误差有着非常好的几何含义,对应常用的欧式距离,均方误差最小化进行模型求解的方法称为‘最小二乘法’
3.参数学习 (梯度下降)或者(最小二乘法)
最小二乘法:
最小二乘法是一种完全数学描述的方法,用矩阵表示
,然后展开对其求偏导,令偏导数 ,即可得到所求的theta,
然而用最小二乘法有很多缺陷:例如当特征数大于样本数时,这时候的theta会产生很多解,而且当数据量很大时候,矩阵求逆很费时间,所以用到下面的梯度下降法。
梯度下降法:
所以我们现在的目标是,找出怎么样的参数,使得假设函数预测得到的误差最小,也就是最小化成本函数J。
目标:min
所以按照一般的思路,就是对权重参数求导,使得倒数为0的参数的值,就是成本函数J取得最小值的地方。但是大多时候,求得的偏导的数学表达式很复杂,所以我们采用一种叫做“梯度下降(gradient descent)”的方法:
即:
4.代码实现(用到梯度下降法):
#导入数据
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
print(diabetes.keys())
data = diabetes.data
target = diabetes.target
print(data[:5])
print(target[:5])
import numpy as np
X = data[:,:1]
y = target
X_train = X[:-20]#训练集是除了最后20个
X_test = X[-20:]#测试集是最20个
y_train = y[:-20].reshape((-1,1))
y_test = y[-20:].reshape((-1,1))
#定义线性回归到类
class linear():
def __init__(self):
self.W = None
self.b = None
#定义损失函数
def loss(self,X,y):
#num_feature = X.shape(1)#特征数
num_train = X.shape[0]#样本数
h = X.dot(self.W) +self.b
loss = (0.5/num_train)*np.sum(np.square(h-y))
dW = X.T.dot(h-y)/num_train
db = np.sum((h-y))/num_train
return loss,dW,db
#定义训练函数
def train(self,X,y,learn_rate = 0.001,iter = 10000):
num_feature = X.shape[1]
self.W = np.zeros((num_feature,1))#这里如果要成矩阵形状就需要两个括号,这里是看多少特征就有多少个W
self.b = 0
loss_list = []
for i in range(iter):
loss,dW,db = self.loss(X,y)
loss_list.append(loss)
self.W-=learn_rate*dW
self.b-=learn_rate*db
if i%500 == 0:
print('迭代次数已经有%d,损失函数为%f'%(i,loss))
return loss_list
#定义测试
def predict(self,X_test):
y_pred = X_test.dot(self.W) + self.b
return y_pred
#开始训练
classify = linear()
print('start')
loss_list = classify.train(X_train,y_train)
print('end')
print(classify.W,classify.b)
#可视化训练的结果
import matplotlib.pyplot as plt
f = X_train.dot(classify.W) + classify.b
fig = plt.figure()
plt.subplot(211)
plt.scatter(X_train,y_train,color = 'black')
plt.scatter(X_test,y_test,color = 'blue')
plt.plot(X_train,f,color = 'red')
plt.xlabel('X')
plt.ylabel('y')
#查看损失函数
plt.subplot(212)
plt.plot(loss_list,color = 'blue')
plt.xlabel('epochs')
plt.ylabel('errors')
plt.show()
参考: https://blog.csdn.net/huakai16/article/details/78123376
参考: https://blog.csdn.net/jk123vip/article/details/80591619