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()
posted @ 2020-04-20 22:56  sj!  阅读(277)  评论(0编辑  收藏  举报