zoukankan      html  css  js  c++  java
  • [机器学习]回归--Polinomial Regression 多项式回归

    首先我们需要明确一个概念,我们讨论的线性或者非线性针对的是自变量的系数,而非自变量本身,所以这样的话不管自变量如何变化,自变量的系数如果符合线性我们就说这是线性的。所以这里我们也就可以描述一下多项式线性回归。

    figure 2.14

    由此公式我们可以看出,自变量只有一个,就是x,只不过x的级数(degree)不同而已。

    我们这次用的数据是公司内部不同的promotion level所对应的薪资


    下面我们来看一下在Python中是如何实现的

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    
    dataset = pd.read_csv('Position_Salaries.csv')
    X = dataset.iloc[:, 1:2].values
    # 这里注意:1:2其实只有第一列,与1 的区别是这表示的是一个matrix矩阵,而非单一向量。
    y = dataset.iloc[:, 2].values

    接下来,进入正题,开始多项式线性回归:

    from sklearn.preprocessing import PolynomialFeatures
    poly_reg = PolynomialFeatures(degree = 1) #degree 就是自变量需要的维度
    X_poly = poly_reg.fit_transform(X)
    lin_reg_2 = LinearRegression()
    lin_reg_2.fit(X_poly, y)

    这个过程我们设置了一元一次的自变量:degree=1 意思是自变量只有一次,相当于简单线性回归
    我们在图像中表示一下:

    # 图像中显示
    plt.scatter(X, y, color = 'red')
    plt.plot(X, lin_reg_2.predict(poly_reg.fit_transform(X)), color = 'blue')
    plt.title('Truth or Bluff (Polynomial Regression)')
    plt.xlabel('Position level')
    plt.ylabel('Salary')
    plt.show()

    figure 2.17

    此图像与用简单线性回归表示的图像是一样的

    # 简单线性回归 图像中显示
    plt.scatter(X, y, color = 'red')
    plt.plot(X, lin_reg.predict(X), color = 'blue')
    plt.title('Truth or Bluff (Linear Regression)')
    plt.xlabel('Position level')
    plt.ylabel('Salary')
    plt.show()

    figure 2.18

    下面我们试着改变一下维度,将degree设置成2,其他不改变,执行一下代码看看图像:

    figure 2.19

    我们可以发现整个趋势符合数据的分布。

    我们将degree改成3 和 4 看看结果

    figure 2.20

    figure 2.21

    我们可以发现,当degree=4的时候,基本上已经符合所有点的分布了

    我们通过拆分横坐标将图像变得平滑一些:

    X_grid = np.arange(min(X), max(X), 0.1)
    X_grid = X_grid.reshape((len(X_grid), 1))
    plt.scatter(X, y, color = 'red')
    plt.plot(X_grid, lin_reg_2.predict(poly_reg.fit_transform(X_grid)), color = 'blue')
    plt.title('Truth or Bluff (Polynomial Regression)')
    plt.xlabel('Position level')
    plt.ylabel('Salary')
    plt.show()

    figure 2.22

    下面我们给出一个测试值来试试结果 (6,10)

    lin_reg_2.predict(poly_reg.fit_transform(6))   
    lin_reg_2.predict(poly_reg.fit_transform(10))

    figure 2.23

    与实际值还是比较接近的。

  • 相关阅读:
    JVM
    事务
    Spring中AutowireMode(自动装配模型)
    ImportAware应用
    spring中几个比较重要的扩展点
    动态代理在Spring中的应用
    基于ImportSelector模拟简单的Aop
    正则表达式分组(Grouping)
    正则表达式断言(Assertions)
    一个JSON解析器
  • 原文地址:https://www.cnblogs.com/WayneZeng/p/9290699.html
Copyright © 2011-2022 走看看