python-使用LinearRegression进行简单线性拟合(线性回归)

一元线性拟合

现有两组数据,求y=a*x+c的系数

X =[12.46, 0.25, 5.22, 11.3, 6.81, 4.59, 0.66, 14.53, 15.49, 14.43,
    2.19, 1.35, 10.02, 12.93, 5.93, 2.92, 12.81, 4.88, 13.11, 5.8]
Y =[29.01, 4.7, 22.33, 24.99, 18.85, 14.89, 10.58, 36.84, 42.36, 39.73,
    11.92, 7.45, 22.9, 36.62, 16.04, 16.56, 31.55, 20.04, 35.26, 23.59]
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import numpy as np

if __name__ == '__main__':
    X =[12.46, 0.25, 5.22, 11.3, 6.81, 4.59, 0.66, 14.53, 15.49, 14.43,
        2.19, 1.35, 10.02, 12.93, 5.93, 2.92, 12.81, 4.88, 13.11, 5.8]
    Y =[29.01, 4.7, 22.33, 24.99, 18.85, 14.89, 10.58, 36.84, 42.36, 39.73,
        11.92, 7.45, 22.9, 36.62, 16.04, 16.56, 31.55, 20.04, 35.26, 23.59]

    #转换成numpy的ndarray数据格式,n行1列,LinearRegression需要列格式数据,如下:
    X_train = np.array(X).reshape((len(X), 1))
    Y_train = np.array(Y).reshape((len(Y), 1))
    # 转换后数据格式如下
    # X_train = [[12.46], [0.25], [5.22], [11.3], [6.81], [4.59], [0.66], [14.53], [15.49], [14.43], [2.19], [1.35],
    #            [10.02], [12.93], [5.93], [2.92], [12.81], [4.88], [13.11], [5.8]]
    # Y_train = [[29.01], [4.7], [22.33], [24.99], [18.85], [14.89], [10.58], [36.84], [42.36], [39.73], [11.92], [7.45],
    #            [22.9], [36.62], [16.04], [16.56], [31.55], [20.04], [35.26], [23.59]]


    #新建一个线性回归模型,并把数据放进去对模型进行训练
    lineModel = LinearRegression()
    lineModel.fit(X_train, Y_train)

    #用训练后的模型,进行预测
    Y_predict = lineModel.predict(X_train)

    #coef_是系数,intercept_是截距
    a1 = lineModel.coef_[0][0]
    b = lineModel.intercept_[0]
    print("y=%.4f*x+%.4f" % (a1,b))

    #对回归模型进行评分,这里简单使用训练集进行评分,实际很多时候用其他的测试集进行评分
    print("得分", lineModel.score(X_train, Y_train))

    #简单画图显示
    plt.scatter(X, Y, c="blue")
    plt.plot(X_train,Y_predict, c="red")
    plt.show()

结果:

y=2.0532*x+7.1234
得分 0.9149096589144883

 

多元线性回归

这里随机创建X1,X2,X3,Y四个数组,使Y=2*X1-3*X2+X3+8。然后加入一些干扰噪声,再尝试做线性回归。

from sklearn.linear_model import LinearRegression
import numpy as np
import random

if __name__ == '__main__':
    # 随机创建X1,X2,X3,Y。使Y=2*X1-3*X2+X3+8
    X1 = [random.randint(0,100) for i in range(0, 50)]
    X2 = [random.randint(0,50) for i in range(0, 50)]
    X3 = [random.randint(0, 25) for i in range(0, 50)]
    Y =[2*x1-3*x2+x3+8 for x1,x2,x3 in zip(X1,X2,X3)]

    # 组合X1,X2成n行2列数据
    X_train = np.array(X1+X2+X3).reshape((len(X1), 3), order="F")
    Y_train = np.array(Y).reshape((len(Y), 1))

    # 加入噪声干扰
    noise = np.random.randn(50, 1)
    noise = noise - np.mean(noise)

    Y_train = Y_train+noise

    #新建一个线性回归模型,并把数据放进去对模型进行训练
    lineModel = LinearRegression()
    lineModel.fit(X_train, Y_train)

    #用训练后的模型,进行预测
    Y_predict = lineModel.predict(X_train)

    #coef_是系数,intercept_是截距
    a_arr = lineModel.coef_[0]
    b = lineModel.intercept_[0]
    f=""
    for i in range(0,len(a_arr)):
        ai=a_arr[i]
        if ai>=0:
            ai = "+%.4f" %(ai)
        else:
            ai = "%.4f" % (ai)
        f = f+"%s*x%s"%(ai, str(i+1))
    f="y=%s+%.4f" % (f[1:],b)

    print("拟合方程",f)
    #对回归模型进行评分,这里简单使用训练集进行评分,实际很多时候用其他的测试集进行评分
    print("得分", lineModel.score(X_train, Y_train))

结果:

拟合方程 y=1.9972*x1-3.0115*x2+1.0597*x3+7.7271
得分 0.9997880910740103

结果与预先设定的Y=2*X1-3*X2+X3+8相近,这里采用随机产生样本,每次运行结果不尽相同。

由于是多维,不方便画图展示。

 

 

author:蓝何忠

email:lanhezhong@163.com

  • 25
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 首先,我们需要准备两列数据,可以使用NumPy库来存储和处理数据。接下来,我们可以使用SciPy库中的 `curve_fit` 函数来进行线性回归。下面是一个简单的例子: ```python import numpy as np from scipy.optimize import curve_fit # 假设我们有两列数据: x 和 y x = np.array([1, 2, 3, 4, 5]) y = np.array([1, 4, 9, 16, 25]) # 定义线性拟合函数 def linear_fit(x, a, b): return a * x + b # 进行线性回归 params, _ = curve_fit(linear_fit, x, y) a, b = params # 输出回归系数 print(f"a={a}, b={b}") # 使用回归系数来预测新数据 x_new = 6 y_predicted = linear_fit(x_new, a, b) print(f"预测值: {y_predicted}") ``` 上面的代码中, `linear_fit` 函数定义了线性回归模型的公式: y = a * x + b。`curve_fit` 函数使用最小二乘法来估计回归系数 a 和 b, 并将它们作为参数返回。最后, 我们可以使用这些回归系数来预测新数据的值。 注意: 这只是一个简单的例子, 线性回归可能并不适用于所有数据。在实际应用中, 你可能需要选择更复杂的回归模型, 或者使用其他工具来评估模型的质量。 ### 回答2: 在Python中,我们可以使用scikit-learn库来建立线性回归模型。首先,我们需要导入所需要的库: ```python import numpy as np from sklearn.linear_model import LinearRegression ``` 假设我们有两列数据`x`和`y`,分别表示自变量和因变量。我们需要将数据转换为Numpy数组的形式: ```python x = np.array([1, 2, 3, 4, 5]) # 自变量数据 y = np.array([2, 3.5, 4.8, 6.2, 7.8]) # 因变量数据 ``` 然后,我们可以通过创建一个线性回归模型,并使用`fit`方法对数据进行拟合: ```python lr = LinearRegression() # 创建线性回归模型 lr.fit(x.reshape(-1, 1), y) # 对数据进行拟合 ``` 在拟合完成后,我们可以使用回归模型进行预测。例如,我们可以使用`predict`方法来预测一个新的自变量值对应的因变量值: ```python new_x = np.array([6]) # 新的自变量值 predicted_y = lr.predict(new_x.reshape(-1, 1)) # 预测的因变量值 ``` 最后,我们可以打印出回归模型的系数和截距: ```python print("系数:", lr.coef_) print("截距:", lr.intercept_) ``` 这样,我们就成功用Python使用两列数据进行线性拟合,并建立了一个回归模型。请注意,这里的例子是针对只有一个自变量和一个因变量的简单线性回归模型,如果有多个自变量,需要使用多元线性回归模型。 ### 回答3: 使用Python进行线性拟合建立回归模型可以通过使用的库来实现,如NumPy和Scikit-learn。 首先,我们需要导入所需的库和数据。对于这个例子,我们假设我们有两列数据X和Y,保存在两个数组中。 ```python import numpy as np from sklearn.linear_model import LinearRegression # 假设我们有两列数据X和Y X = np.array([1, 2, 3, 4, 5]) Y = np.array([2, 4, 6, 8, 10]) ``` 然后,我们使用线性回归模型训练我们的数据。我们可以使用NumPy的reshape函数来更改输入数据的形状。我们将X和Y变换为二维数组,其中X为(n, 1)的形状,Y为(n, )的形状。 ```python # 更改输入数据的形状 X = X.reshape(-1, 1) Y = Y.reshape(-1, ) # 创建并拟合线性回归模型 regression_model = LinearRegression() regression_model.fit(X, Y) ``` 现在,我们的回归模型已经训练完成,我们可以使用它来进行预测。我们可以使用predict函数,通过提供输入数据X,来预测对应的输出数据Y。 ```python # 预测 Y_pred = regression_model.predict(X) ``` 最后,我们可以通过绘制原始数据点和回归线来可视化我们的线性拟合模型。 ```python import matplotlib.pyplot as plt # 绘制原始数据点和回归线 plt.scatter(X, Y, color='blue', label='Actual') plt.plot(X, Y_pred, color='red', label='Predicted') plt.xlabel('X') plt.ylabel('Y') plt.legend() plt.show() ``` 以上就是使用Python进行线性拟合建立回归模型的简单步骤。通过使用合适的库和函数,我们可以更轻松地进行回归分析并得到准确的预测结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值