欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Task1 线性回归

程序员文章站 2024-02-10 20:14:58
...

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()

Task1 线性回归

"""调用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]