zoukankan      html  css  js  c++  java
  • 5.线性回归算法 4/20

    1.本节重点知识点用自己的话总结出来,可以配上图片,以及说明该知识点的重要性

     · 我们先了解回归算法:

          

     · 课上老师举了线性回归的应用:①房价预测;②销售额预测;③贷款额度预测;

       我们可以发现做线性回归,需要的数据都应该为连续型,最终要预测的因素成为目标值,把影响的因素成为特征;如果影响的因素只有一个,那么这就是一个单线性回归,如果有多个影响因素,那就是一个多线性回归。

      我认为这里有一个重要的知识点就是:线性回归的数据应该是连续型的,如果拿到的数据如下图红色标点,那便不符合线性回归模型。

           

       · 线性回归模型:

          

       (1)如果是一个变量,那就是二维空间;多个变量就是三维空间。

      (2)线性回归问题可以转换为矩阵乘积问题,矩阵在线性回归中扮演一个重要的角色。矩阵的计算正好满足线性回归的要求,所以矩阵的计算也是一个重点知识:

         ①数组与矩阵的特性与区别:

         

         ②用代码比较数据和矩阵相乘的结果:

          

      ·  机器学习需要迭代算法来减少误差,这里引入一个 损失函数(误差的大小);学习的目的,就是将损失函数最小化:

          

        减少误差的方法(优化线性回归的策略):

          ①正规方程:

              

         ②梯度下降法:

              

        ∂为学习速率,学习速率的取值取决于数据样本。机器进行学习,多次迭代,如果损失函数在变小,说明结果越准确,取值准确。

        关于梯度下降的具体概念可以参考:https://www.cnblogs.com/jwwzone/p/12684355.html的第二题。

     梯度下降代码:

    # 梯度下降
    import random
    import time
    import matplotlib.pyplot as plt
    
    # 产生数据
    _xs = [0.1 * x for x in range(0, 10)]
    _ys = [12 * i + 4 for i in _xs]
    print(_xs)
    print(_ys)
    
    w = random.random()
    b = random.random()
    
    a1 = []
    b1 = []
    for i in range(100):
        for x, y in zip(_xs, _ys):
            o = w * x + b  # 预测值
            e = (o - y)  # 误差
            loss = e ** 2  # 损失
            dw = 2 * e * x  # 对w求导
            db = 2 * e * 1  # 对d求导
            # 梯度下降,0.1为学习率
            w = w - 0.1 * dw
            b = b - 0.1 * db
            # 最终结果:loss越小越好,w接近12,b接近4
            print('loss={0},w={1},b={2}'.format(loss, w, b))
        a1.append(i)
        b1.append(loss)
        plt.plot(a1, b1)
        plt.pause(0.1)
    
    plt.show()

    2.思考线性回归算法可以用来做什么?(大家尽量不要写重复)

      可以用于:

      (1)家庭家电的预测:①时间与功率之间的关系;②时间与电压之间的多项式关系。

      (2)医学上可以预测年龄和血压的关系。

      (3)预测一个发展的电信市场的网络容量。

    3.自主编写线性回归算法 ,数据可以自己造,或者从网上获取。(加分题)

       数据是我以前爬虫的广州市二手房数据,前几天爬了一次被抓到了哈哈。

       数据如下(获取单价和总价作为数据样本):    

           

       用单价来预测总价,可视化结果如下:

          

       我们可以看到预测值和真实值还是比较接近的,这说明用单价来预测总价还是比较靠谱的。从模型的权值也可以看出,预测结果相对准确:

                       

    import pandas as pd
    import matplotlib.pyplot as plt
    
    data = pd.read_csv('house.csv', index_col=0)  # 读取数据
    
    # 线型回归
    from sklearn.linear_model import LinearRegression
    
    regr = LinearRegression()  # 构建模型
    regr.fit(data[['单价']].values, data['总价'])
    print('权值:', regr.coef_, '截距:', regr.intercept_)
    plt.plot(regr.predict(data[['单价']].values), linewidth=1.7, linestyle='-', color='#A6CEE3')  # 预测结果
    plt.plot(data[['总价']].values, linewidth=1.7, linestyle='-', c='#FDBF6F')
    
    # 可视化处理
    plt.rcParams['font.sans-serif'] = 'SimHei'
    plt.rcParams['axes.unicode_minus'] = False
    plt.legend(['真实值', '预测值'])
    plt.title('广州市二手房价格线型回归模型预测结果')
    plt.show()

      我们也可以画出单价和总价呈线性关系的可视化视图:

          

    plt.scatter(data['单价'].values, data['总价'].values)
    plt.plot(data[['单价']].values, regr.predict(data[['单价']].values), c='r')
    plt.title('广州市二手房价格与单价散点图')
    plt.xlabel('单价')
    plt.ylabel('总价')
    plt.show()
  • 相关阅读:
    1.Mybatis的全局配置mybatis-config.xml
    01淘淘商城项目:项目Maven工程搭建
    Connection timed out: connect; Communications link failure
    启动maven项目的配置
    PLSQL 触发器概念
    Git 概念&常用命令
    Git与svn的区别 & Git的工作流程
    Redis 是如何存储的
    Redis 概念,常用命令
    idea 快捷键
  • 原文地址:https://www.cnblogs.com/jwwzone/p/12740070.html
Copyright © 2011-2022 走看看