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

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

    (一)回归的分类和定义

     

    定义:线性回归通过一个或多个自变量与因变量之间进行建模的回归方法,其中可以为一个或多个自变量之间的线性组合。

    (二)线性回归的公式

    当为一个变量时:

     

    给定一些数据d,并且认为自变量x和因变量y直接存在一定的关系

    可以得到很多的函数集f,其中当a是合适的斜率b是合适截距时

    这个函数f是最合适用来描述给定数据d中自变量与因变量关系的。

    (三)损失函数和最小二乘法

    但是y这条线不一定都经过给定的数据点,与实际的数据有偏差,因此会造成一定的损失,引入了损失函数,目的是将损失值减到最小。

    损失函数:

     

        

    m是数据点的个数

    y是真实值,(ax+b)是预测值,其相减的值再平方是最小二乘法。

    目标是找到系数a,b,使得损失函数尽可能的小。

    当所有误差的平方和相加,得到的最小值,则损失最少,这个时候的a和b就是最合适的斜率和截距。

    (四)梯度下降法

    不断下降,得到全局最小值的一个近似值。所以对a(theta1),b(theta0)求最小的偏导数时:

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

    在自动驾驶碰到障碍物的时候,根据障碍物的大小,障碍物的位置等等特征,预测轮子需要转动的角度是多少。

    当电影上映后,可以根据其演员,评分等等对电影票房的预测。

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

    (一)编码实现线性回归算法

    # 核心公式:y=wx+b
    import numpy as np
    import matplotlib.pyplot as plt
    #创建一个矩阵
    data=np.array([
        [0.067732,3.176513],[0.427810,3.816464],[0.995731,4.550095],[0.738336,4.256571],[0.981083,4.560815],
        [0.526171,3.929515],[0.378887,3.526170],[0.033859,3.156393],[0.132791,3.110301],[0.138306,3.149813],
        [0.247809,3.476346],[0.648270,4.119688],[0.731209,4.282233],[0.236833,3.486582],[0.969788,4.655492],
        [0.607492,3.965162],[0.358622,3.514900],[0.147846,3.125947],[0.637820,4.094115],[0.230372,3.476039],
        [0.070237,3.210610],[0.067154,3.190612],[0.925577,4.631504],[0.717733,4.295890],[0.015371,3.085028],
        [0.335070,3.448080],[0.040486,3.167440],[0.212575,3.364266],[0.617218,3.993482],[0.541196,3.891471]
    ])
    x1=data[:,0]  #取第一列数据作为x
    y1=data[:,1]  #取第二列数据作为y
    plt.scatter(x1,y1,marker="o",color="red")
    plt.show()
    # 上面是载入数据并且画出数据的散点图
    k=0 #斜率
    b=0 #截距
    iterations=500#迭代多少次
    lr=0.05 #学习率
    # 最小二乘法
    def mincf(b,k,x_data,y_data):
        total=0
        for i in range(len(x_data)):
            total=total+(y_data[i]-(k*x_data[i]+b))**2  #(y-(kx+b))**2
        return total
    #线性回归算法
    def linearhuigui(x_data,y_data,b,k,lr,iterations):
        m=float(len(x_data)) #数据个数
        for i in range(iterations): #数据训练迭代次数
            k_grad=0
            b_grad=0
            # 计算梯度总和再求平均 y=kx+b
            for j in range(len(x_data)):
                k_grad+=(1/m)*x_data[j]*(((k*x_data[j])+b)-y_data[j]) #(预测值-实际值)*x的实际值
                b_grad+=-(1/m)*(y_data[j]-(k*x_data[j]+b))  #实际值-预测值
            #更新b和k
            b=b-(lr*b_grad)
            k=k-(lr*k_grad)
        return b,k
    
    print("b={0},k={1},error={2}".format(b,k,mincf(b,k,x1,y1)))
    b,k=linearhuigui(x1,y1,b,k,lr,iterations)
    print("经过{0}次迭代后,b={1},k={2},error={3}".format(iterations,b,k,mincf(b,k,x1,y1)))  #error是损失值
    #画图
    plt.scatter(x1,y1)
    plt.plot(x1,k*x1+b,'r')
    plt.show()

    (二)直接使用sklearn的线性回归模

    from sklearn.linear_model import LinearRegression
    features=data[:,0].reshape(-1,1)
    target=data[:,1].reshape(-1,1)
    regression=LinearRegression() #构建模型
    model=regression.fit(features,target)  #模型训练
    predicted = model.predict(features)  #预测模型
    print('系数:
    ',model.coef_)
    print('截距:
    ',model.intercept_)
    from sklearn.metrics import mean_squared_error
    #线性回归模型计算均方误差
    print('数据线性回归模型的均方误差为:',mean_squared_error(features,target))
    # 画图
    plt.scatter(features, target, marker='x')
    plt.plot(features, predicted,c='r')

     

  • 相关阅读:
    iOS常用框架总结
    【Java】使用@Value @Reource或@Autowire依赖 (值) 注入时出现NPE的排查方法
    【Java】事件驱动模型和观察者模式
    新人训练营心得 - 道路阻且长
    【Java】Spring Web MVC注意事项
    【Linux】OpenWRT的无线设置注意事项——从2.4G到5G,hwmode不简单
    【Java】 Spring依赖注入小试牛刀:编写第一个Spring ApplicationContext Demo
    【Linux】 awk应用
    【C/C++】高亮C++中函数的重写——函数名相同?参数列表相同?返回值相同?
    【设计模式】C++单例模式的几种写法——Java自动加载内部类对象,C++怎么破?
  • 原文地址:https://www.cnblogs.com/cyxxixi/p/12746448.html
Copyright © 2011-2022 走看看