线性回归

1.假设函数 或者 预测函数:

在一维特征空间,线性回归是通过学习一条直线 h_{\theta}(x)=\theta_{0}+\theta_{1} x ,使得这条直线尽可能拟合所有已有的看到的点y,并且希望看到的(数据)也尽可能落落在这条线上(泛化能力),h_{\theta}是预测值,y是实际值。

                                                              h_{\theta}(x)=\theta_{0}+\theta_{1} x

其中参数w0称为“偏置”,w1称为“权重”,x表示输入变量X的一个“特征变量”,这里先假设只有一个特征变量。

Note:我这里用w代表theta,他的实际含义都是“weight”

 

2.成本函数(cost function)或者 损失函数

我们要知道,拟合的函数h(x)有一定的误差,我们用成本函数J来表示“预测输出”h(x)与实际输出y之间的误差。这里使用最简单的“最小均方”(Least mean square)来描述:

                         J\left(\theta_{0}, \theta_{1}\right)=\frac{1}{2 m} \sum_{i=1}^{m}\left(\hat{y}_{i}-y_{i}\right)^{2}=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x_{i}\right)-y_{i}\right)^{2}

所以现在变成了一个优化问题,即找到令损失函数J(theta_)最小的theta,定义均方误差有着非常好的几何含义,对应常用的欧式距离,均方误差最小化进行模型求解的方法称为‘最小二乘法’

 

3.参数学习 (梯度下降)或者(最小二乘法)

最小二乘法:

最小二乘法是一种完全数学描述的方法,用矩阵表示J(\theta)=\frac{1}{2}(X \theta-Y)^{2}

,然后展开对其求偏导,令偏导数 \frac{\partial}{\partial \theta} J(\theta)=0,即可得到所求的theta,

                                                        \theta=\left(X^{T} X\right)^{-1} X^{T} Y\theta=\left(X^{T} X\right)^{-1} X^{T} Y

然而用最小二乘法有很多缺陷:例如当特征数大于样本数时,这时候的theta会产生很多解,而且当数据量很大时候,矩阵求逆很费时间,所以用到下面的梯度下降法。

梯度下降法:

所以我们现在的目标是,找出怎么样的参数,使得假设函数预测得到的误差最小,也就是最小化成本函数J。

                                                                       \begin{array}{c}{\text { Hypothesis: }} \\ {h_{\theta}(x)=\theta_{0}+\theta_{1} x}\end{array}

                                                                           \begin{array}{c}{\text { Parameters: }} \\ {\theta_{0}, \theta_{1}}\end{array}

                                                         \begin{array}{c}{\text { cost Function: }} \\ {J\left(\theta_{0}, \theta_{1}\right)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}}\end{array}

                                                                            目标:min J\left(\theta_{0}, \theta_{1}\right)

 

所以按照一般的思路,就是对权重参数求导,使得倒数为0的参数的值,就是成本函数J取得最小值的地方。但是大多时候,求得的偏导的数学表达式很复杂,所以我们采用一种叫做“梯度下降(gradient descent)”的方法:

                                                                                  \theta_{j} :=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} J\left(\theta_{0}, \theta_{1}\right)

             即:

                                                                \theta_{j} :=\theta_{j}-\frac{\alpha}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}

 

 

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                                                                          

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值