Task1 线性回归

Task1 线性回归


线性回归在所有机器学习的所有模型中是最容易理解的,可以用来处理的简单回归问题,按照定义,线性回归就是用一条直线(这是在二维层面上来说)对数据集进行线性拟合,使得大多数样本能够被准确的预测。

https://www.jianshu.com/p/68d553d4b1a4

这篇blog已经对线性模型的概念做了详细的描述,简单的总结下就是线性模型主要有线性回归、感知机和逻辑斯谛回归,线性回归用来预测回归问题,在线性回归的基础上加上一个信号函数sign叫做感知机,用来预测二分类问题,逻辑斯谛回归看名字是用来解决回归问题,实际上是预测二分类问题,就是一层神经网络。
学习模型的目的就是为了使模型能够对未知的数据有很好的预测能力,判断一个模型的好坏,需要引入损失函数、代价函数和目标函数的概念:

损失函数(Loss Function):度量单样本预测的错误程度,损失函数值越小,模型就越好。
代价函数(CostFunction):度量全部样本集的平均误差。
目标函数(Object Function):代价函数和正则化函数,最终要优化的函数。

一个好的模型,目标函数的值要尽可能的小,这是我们训练模型的重要指标。
线性回归有许多优化算法,包括梯度下降、最小二乘法、牛顿法、拟牛顿法等等,而回归的指标也有很多,比如均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)、R^2指标等等。
简单实践一下吧

np.random.seed(1234) 
# 随机生成数据
x = np.random.rand(500, 3)
y = x.dot([4.2,5.7,10.8])
# y = np.dot(x, [4.2,5.7,10.8])

简单看一下数据分布

plt.figure(figsize=(5, 5))
plt.hist(y, bins=20)
plt.show()

在这里插入图片描述

"""调用API函数"""
# 使用的是最小二乘法
from sklearn.linear_model import LinearRegression

# lr = LinearRegression(fit_intercept=True)
# lr.fit(x, y)
print('训练得出的参数是{}'.format(lr.coef_))

x_test = np.array([2, 3, 4]).reshape(1, 3)
y_pred = lr.predict(x_test)
print('测试结果是{}'.format(y_pred))

训练得出的参数是[ 4.2 5.7 10.8]
测试结果是[68.7]

"""最小二乘法"""
class my_ls():
    def __init__(self):
        self.w = None
    def fit(self, x, y):
        # 用最小二乘法推导出损失函数的参数
        self.w = np.dot(np.dot(np.linalg.inv(np.dot(x.T, x)), x.T) ,y)
#         self.w = np.linalg.inv(x.T.dot(x)).dot(x.T).dot(y)
    def predict(self, x_test):
        y_pred = np.dot(x_test, self.w)
        
        return y_pred

ls = my_ls()
ls.fit(x, y)
print('最小二乘法的模型参数为{}'.format(ls.w))
x_test = np.array([2, 3, 4]).reshape(1, 3)
y_pred = ls.predict(x_test)
print('预测结果是{}'.format(y_pred))

最小二乘法的模型参数为[ 4.2 5.7 10.8]
预测结果是[68.7]

"""梯度下降法"""

class my_gd():
    def __init__(self):
        self.w = None
    def gradient(self, x, y):
        dw = x.T.dot(x).dot(self.w) - x.T.dot(y)
        return dw
    def fit(self, x, y, learning_rate=0.001, num_iter=100):
        m = x.shape[1]
        self.w = np.zeros((m))
        for i in range(num_iter):
            dw = self.gradient(x, y)
            if np.linalg.norm(dw) < 0.001:
                print('the iteration stop at {}'.format(i))
                break
            self.w = self.w - learning_rate * dw
    def predict(self, x_test):
        y_pred = np.dot(x_test, self.w)
        
        return y_pred


if __name__ == '__main__':
    gd = my_gd()
    gd.fit(x, y, num_iter=1000)
    print('梯度下降模型参数为{}'.format(gd.w))
    x_test = np.array([2, 3, 4]).reshape(1, 3)
    y_pred = gd.predict(x_test)
    print('预测结果是{}'.format(y_pred))

the iteration stop at 307
梯度下降模型参数为[ 4.20000392 5.70001566 10.79997986]
预测结果是[68.69997427]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值