• 机器学习-多变量线性回归


      (1)说明:需要预测房屋的价格,除了房屋面积还有其他的特征量,比如层数,年龄,卧室数目等等,如下图。因为有多个特征值,所以称为多变量线性回归。

        

      (2)假设函数:单变量只有一个特征值,所以之前的假设函数将不再适用,下面是多变量的假设函数。其中x0设置为1

        

       (3)特征缩放:在所有特征值中,size的范围大概在0~2000,而卧室数目的范围在0~5。如果多个参数之间范围跨度相差太大,将导致梯度下降的速度很缓慢。下面是关于这两个特征值的等高线。如图中左图案,红线表示梯度下降的大概路线,最理想的图像应该趋近于一个圆,范围跨度相差越大,图形越扁,梯度下降越慢。所以要进行特征缩放。特征缩放的公式不仅有一个,但目的都是将不同特征值缩放到一个相近的范围。右图是进行特征缩放之后的等高线。他的缩放方式就是将每个特征值除以该特征值的范围

            

        下面是特征缩放公式:u表示平均值,s表示该特征值的范围(max-min),s也可以替换为标准差。在根据特征缩放之后的数据计算出公式之后,用该公式对数据进行预测,数据不能直接适用,需要按照之前特征缩放的方式就行下处理才可以进行预测。或者根据特征缩放的方式对参数就行化简,之后数据可以直接拿来使用。就是下面的build函数

          

      (4)代价函数:因为假设函数不同,代价函数变化如下图:上面是代价函数,下面是求偏导之后。

        

       

      (5)梯度下降代码:

    #coding=utf-8
    import numpy as np
    np.set_printoptions(suppress=True)
    
    #特征缩放
    def scale(arr):
        param = []
        for i in range(0, arr.shape[1]):
            col = arr[:,i]
            mean = np.mean(col)
            std = np.std(col)
            param.insert(i, {'mean':mean, 'std':std})
            for j in range(0, len(col)):
                arr[j][i] = (col[j] - mean) / std
        return arr, param
    
    #代价函数
    def J():
        global p, x_data, y_data, m, a
        deviation = np.dot(x_data, p).T - y_data
        return (np.dot(deviation, x_data) / m * a)
    
    
    #整理函数  demo:[(x1 - 10250) / 3269.17] * 13274.7755 + [(x2 - 69.5) / 14.22] * 10568.71 + 55438.25
    def build(p, param):
        f = 0       #常数项
        for i in range(1, len(p)):
            f -= param[i - 1]['mean'] / param[i - 1]['std'] * p[i][0]
            p[i] = format(p[i][0] / param[i - 1]['std'], '0.2f')
    
        p[0] = format(f + p[0][0], '0.2f')
        return p
    
    
    
    x_data = np.array([
        [6000, 58],
        [9000, 77],
        [11000, 89],
        [15000, 54],
    ])
    y_data =  np.array([[30000, 55010, 73542, 63201]])
    
    x_data = x_data.astype(np.float)
    x_data, param = scale(x_data)
    
    #学习率
    a = 0.1
    
    #x新增一列全为1
    m = len(x_data)
    x_data = np.c_[np.ones(m), x_data]
    p = np.ones([3, 1])
    
    
    #梯度下降
    step = 300
    for i in range(1, step):
        j = J()
        p -= j.T
    
    p = build(p, param)

      (6)直接使用python函数库

    #coding=utf-8
    from sklearn.linear_model import LinearRegression
    
    x_data = [
        [6000, 58],
        [9000, 77],
        [11000, 89],
        [15000, 54]
    ]
    y_data = [
        30000, 55010, 73542, 63201
    ]
    
    lr = LinearRegression()
    lr.fit(x_data, y_data)
    p = [round(lr.intercept_, 2), round(lr.coef_[0], 2), round(lr.coef_[1], 2)]

      (7)正规方程:相比于梯度下降,正规方程是个更简单的方法,直接套用公式就行。

        

      (8)正规方程与梯度下降的优缺点:①正规方程不需要设置学习率

                        ②正规方程不需要反复迭代

                        ③梯度下降可以在特征量很多的情况下还可以正常工作,但正规方程不可以。大致边界在10000个特征量。

        

      (9)正规方程代码:

    #coding=utf-8
    import numpy as np
    np.set_printoptions(suppress=True)
    
    x_data = np.array([
        [6000, 58],
        [9000, 77],
        [11000, 89],
        [15000, 54],
    ])
    y_data =  np.array([[30000, 55010, 73542, 63201]])
    
    m = len(x_data)
    x_data = np.c_[np.ones(m), x_data]
    x_data = x_data.astype(np.float)
    
    
    #
    p = np.linalg.pinv(np.dot(x_data.T, x_data))
    p = np.dot(p, x_data.T)
    p = np.dot(p, y_data.T)

      (10)多元多变量线性回归:比如预测一个房屋的价格,有两个特征量为房屋的长和宽。如果假设函数选为y=p0 + p1*x1 + p2*x2就不是很合适。正确的假设函数应为y=p0 + p1 * x1 * x2,实现方式是和特征缩放一样的,根据一定的规则讲原数据集处理下就好了,然后和多变量线性回归是一样的。根据场景不同也可以将x1的2次方或3次方当做新的特征量,或者x1的平方*x2的3次方等等。。。。花式搭配。

        

  • 相关阅读:
    解决eclipse中egit中的cannot open git-upload-pack问题
    局部更新listview的问题(只更新某个item)
    漂亮的自制java验证码
    Myeclipse:No projects are available for deployment to this server!
    Java获取时间与系统时间相差8小时终极解决方案
    [转]SpringMVC日期类型转换问题三大处理方法归纳
    utf8乱码解决方案[适合tomcat部署的jsp应用]
    我的AndroidStudio设置
    清空session的方法
    JavaScript和JQuery获取DIV的值
  • 原文地址:https://www.cnblogs.com/wangjianheng/p/12664721.html
Copyright © 2020-2023  润新知