当前位置: 首页 > 知识库问答 >
问题:

如何创建手动执行线性回归的类

荀裕
2023-03-14

我是一名学生,开始学习线性回归。我们得到了一个手动回归公式:(X.T*X)**-1*X.T*y还有一个简单数组的例子:

from numpy.linalg import inv
import numpy as np
from matplotlib import pyplot as plt

X = np.array([[1, 50], [1, 60], [1, 70], [1, 100]]) # it MUST have this 1... a trivial variable... i don't understand for what
y = np.array([[10], [30], [40], [50]])

w = inv((X.T).dot(X)).dot(X.T).dot(y)
print(f'w_1 = {round(w[0][0], 2)},\nw_2 = {round(w[1][0], 3)}')

X_min = X[:, 1].min()
X_max = X[:, 1].max()

X_support = np.linspace(X_min, X_max, num=100)
Y_model = w[0][0] + w[1][0] * X_support

plt.scatter(x=X[:, 1], y=Y, color='g', alpha=0.8)
plt.plot(X_support, Y_model)

plt.show()

现在我想用Boston数据集对多个变量做同样的处理。我需要创建一个类,该类的功能与LinearRegression()相同。一定有。fit()方法和。预测方法。当数组有超过1列时,如何操作没有任何解释。。。所以我很困惑。

以下是我最初所做的:

from numpy.linalg import inv
import numpy as np
from matplotlib import pyplot as plt
from sklearn.datasets import load_boston

    class CustomLinearReg:
        def __init__(self):
            pass
        
        def fit(X, y):
            return inv((X.T).dot(X)).dot(X.T).dot(y)
    
        def predict(X):
            pass
        
    boston_dataset = load_boston()
    
    X = boston_dataset.data
    y = boston_dataset.target
    
    reg = CustomLinearReg.fit(X, y)
    reg

但它只返回1个系数,我不确定它是否正确。。。我也不知道从哪里可以得到第二个。在那之后,我认为我需要“1”-一个微不足道的变量,并这样做:

boston_dataset = load_boston()

X = boston_dataset.data.tolist()

for n1, x in enumerate(X):
    for n2, y in enumerate(x):
        X[n1][n2] = [1, y]

X = np.array(X)
y = boston_dataset.target

reg = CustomLinearReg.fit(X, y)
reg

但它又回来了

ValueError: shapes (2,13,506) and (506,13,2) not aligned: 506 (dim 2) != 13 (dim 1)

我尝试了更多,比如在一个循环中一个接一个地计算每个系数。。。但失败了。

请帮我解决这个问题。

我需要一个类,它用于. fi(X, y)返回成对的系数,然后.预测()方法,它在. fi()之后创建模型。

共有2个答案

靳祺然
2023-03-14

如果列车数据为1列-列车和2列-测试,则代码为:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

class CustomLinearReg:
    def __init__(self):
        pass
    
    def fit(X, y):
        return inv((X.T).dot(X)).dot(X.T).dot(y)

    def predict(w):
        X_min = X[:, 1].min() - X[:, 1].max() / 10
        X_max = X[:, 1].max() + X[:, 1].max() / 10
        X_support = np.linspace(X_min, X_max, num=20)
        prediction = w[0] + w[1] * X_support
        return prediction, X_support

data = pd.read_csv('..//..//Materials//3.10_non_linear.csv', sep=',')

X = np.array(data.x_train.apply(lambda x: [1, x]).tolist())
y = data.y_train

w = CustomLinearReg.fit(X, y)
y_model, X_support = CustomLinearReg.predict(w)


plt.scatter(x=X[:, 1], y=y, color='g', alpha=0.8)
plt.plot(X_support, y_model)

plt.show()

但是它有多重列(特征)。所以......

data:
     x_train     y_train
0   0.138368    0.838812
1   0.157237    0.889313
2   0.188684    1.430040
3   0.685553    1.717309
4   0.874237    2.032588
5   1.182421    1.860341
6   1.251605    1.878928
7   1.270474    2.430015
8   1.402553    2.327856
9   1.427711    2.203649
10  1.471737    2.207708
11  1.534632    1.388039
12  1.553500    1.718544
13  1.842816    2.103264
14  2.018921    2.295177
15  2.289369    1.965152
16  2.641579    0.745949
17  2.685606    1.160798
18  2.798816    0.847264
19  2.823974    0.755585
20  2.912027    1.304593
21  2.924606    1.066442
22  3.270527    0.676944
23  3.314553    0.579166
24  3.528395    0.133375
25  3.597580    0.171235
26  3.761106    0.196110
27  3.773685    -0.072016
28  3.918343    0.118110
29  4.107027    0.466673
30  4.107027    0.315611
31  4.125895    0.214945
32  4.188790    0.050313
33  4.333448    0.106148
34  4.541001    0.057132
35  4.572448    -0.057252
36  4.622764    0.449234
37  4.641632    -0.336120
38  4.937238    -0.038237
39  5.125922    0.095250
40  5.157369    0.313029
41  5.258001    -0.231257
42  5.308317    0.024936
43  5.415238    0.418719
44  5.446685    0.165727
45  5.509580    0.266092
46  5.610212    0.669440
47  5.949843    0.892383
48  5.968712    1.265869
49  5.968712    0.664839
左丘繁
2023-03-14

我想你把一些事情弄混了。让我们从公式开始:(X.T*X)**-1*X.T*y。这来自最小二乘法。让我们通过原点取一条简单直线的方程式:y(x)=a*x

如果您想知道将最适合您的数据点的a值,您确实可以使用公式进行回归X将是X值的向量,例如:X=[1,2,3,4]Y将成为Y值的向量,例如Y=[2,4,6,8]。这个方程的结果,我们称之为P,是参数向量。在这种情况下,方程将给出P=2,因此只需一个标量,然后就是a的值。

如果您有多个要查找的参数,例如,让我们取一行y(x)=a*x b,向量将成为矩阵。首先注意,a*x b[a, b]*[x,1]^T相同。这就是你的X矩阵中的那些的来源。

在这个组成的例子中,X=[[1,1],[2,1],[3,1],[4,1]和Y保持不变。使用您的等式现在将导致P=[2,0],这意味着a=2b=0

修改类会产生如下结果:

from numpy.linalg import inv
import numpy as np


class CustomLinearReg:
    def __init__(self):
        self.a=0
        self.b=0
        
        
    def fit(self, X, y):
        R=inv(X.T@X)@X.T@y
        self.a=R[0]
        self.b=R[1]
    
    def predict(self, X):
        return X@np.array([self.a,self.b])


X = np.array([[1, 50], [1, 60], [1, 70], [1, 100]])
y = np.array([10, 30, 40, 50])

clr = CustomLinearReg()
clr.fit(X,y)

# checking on training data. 
print(clr.predict(X))

# predicting on new data
print(clr.predict(np.array([[1,20],[1,35],[1,60]])))


输出:

[18.21428571 25.35714286 32.5        53.92857143]
[-3.21428571  7.5        25.35714286]
 类似资料:
  • 本文向大家介绍如何用Python徒手写线性回归,包括了如何用Python徒手写线性回归的使用技巧和注意事项,需要的朋友参考一下 对于大多数数据科学家而言,线性回归方法是他们进行统计学建模和预测分析任务的起点。这种方法已经存在了 200 多年,并得到了广泛研究,但仍然是一个积极的研究领域。由于良好的可解释性,线性回归在商业数据上的用途十分广泛。当然,在生物数据、工业数据等领域也不乏关于回归分析的应用

  • 线性回归是最简单的回归方法,它的目标是使用超平面拟合数据集,即学习一个线性模型以尽可能准确的预测实值输出标记。 单变量模型 模型 $$f(x)=w^Tx+b$$ 在线性回归问题中,一般使用最小二乘参数估计($$L_2$$损失),定义目标函数为 $$J={\arg min}{(w,b)}\sum{i=1}^{m}(y_i-wx_i-b)^2$$ 均方误差(MSE) $$MSE = \frac{1}{

  • 线性回归输出是一个连续值,因此适用于回归问题。回归问题在实际中很常见,如预测房屋价格、气温、销售额等连续值的问题。与回归问题不同,分类问题中模型的最终输出是一个离散值。我们所说的图像分类、垃圾邮件识别、疾病检测等输出为离散值的问题都属于分类问题的范畴。softmax回归则适用于分类问题。 由于线性回归和softmax回归都是单层神经网络,它们涉及的概念和技术同样适用于大多数的深度学习模型。我们首先

  • 本例仅使用糖尿病数据集的第一个特征,来展示线性回归在二维空间上的表现。下图中的直线, 即是线性回归所确定的一个界限,其目标是使得数据集中的实际值与线性回归所得的预测值之间的残差平方和最小。 同时也计算了回归系数、残差平方和以及解释方差得分,来判断该线性回归模型的质量。 原文解释和代码不符合: 实际上计算了回归系数, 均方误差(MSE),判定系数(r2_score) 判定系数和解释方差得分并不绝对相

  •   回归问题的条件或者说前提是 1) 收集的数据 2) 假设的模型,即一个函数,这个函数里含有未知的参数,通过学习,可以估计出参数。然后利用这个模型去预测/分类新的数据。 1 线性回归的概念   线性回归假设特征和结果都满足线性。即不大于一次方。收集的数据中,每一个分量,就可以看做一个特征数据。每个特征至少对应一个未知的参数。这样就形成了一个线性模型函数,向量表示形式:   这个就是一个组合问题,

  • 在本章中,将重点介绍使用TensorFlow进行线性回归实现的基本示例。逻辑回归或线性回归是用于对离散类别进行分类的监督机器学习方法。在本章中的目标是构建一个模型,用户可以通过该模型预测预测变量与一个或多个自变量之间的关系。 这两个变量之间的关系是线性的。如果是因变量的变化而变化,那么可将认为是自变量,那么两个变量的线性回归关系将如下式所示: 接下来将设计一种线性回归算法。需要了解以下两个重要概念