简单线性回归(Simple Linear Regression)

博客介绍了简单线性回归,其有一个自变量x和一个连续型因变量y,二者呈线性关系。给出假设方程y=b0+b1x,阐述算法步骤,包括求xx、yy、b1、b0等,最后展示了Python实现代码。

简单线性回归:
有且仅有一个自变量x,一个因变量y,x、y之间有线性关系,并且y是连续型变量。
假设方程为:
y=b0+b1xy=b_0+b_1xy=b0+b1x
假设有n个样本(即有n个x,n个y)
算法步骤:

  1. 求出x‾\overline{x}xx‾=1n∑i=1nxi\overline{x}=\dfrac{1}{n}\sum_{i=1}^nx_ix=n1i=1nxi
  2. 求出y‾\overline{y}yy‾=1n∑i=1nyi\overline{y}=\dfrac{1}{n}\sum_{i=1}^ny_iy=n1i=1nyi
  3. 求出b1b_1b1b1=∑i=1n(xi−x‾)(yi−y‾)∑i=1n(xi−x‾)2b_1=\dfrac{\sum_{i=1}^n(x_i-\overline{x})(y_i-\overline{y})}{\sum_{i=1}^n(x_i-\overline{x})^2}b1=i=1n(xix)2i=1n(xix)(yiy)
  4. 求出b0b_0b0b0=y‾−kx‾b_0=\overline{y}-k\overline{x}b0=ykx

代码(python)

import numpy as np
def fitSLR(x,y):
    n = len(x)
    numerator = 0
    denominator = 0
    for i in range(0,n):
        numerator +=(x[i]-np.mean(x))*(y[i]-np.mean(y))#np.mean()用于求均值
        denominator +=(x[i]-np.mean(x))**2
    b1 = numerator/float(denominator)
    b0 = np.mean(y)-b1*np.mean(x)
    return b0,b1
def predit(x,b0,b1):
    return b0+b1*x
x = [1,3,2,1,3]
y = [14,24,18,17,27]
b0,b1 = fitSLR(x, y)
x_test = 6
y_test = predit(x_test, b0, b1)
print(y_test)
<think> 我们正在讨论简单线性回归问题。用户询问如何执行简单线性回归,方程形式为 Y = a + bX。根据引用[1],方程是Y=a+bx,并且当x增加1时,y的增量是b。引用[2]指出,数据点通常不会完全落在回归线上,而是散布在周围。引用[3]则提到非线性回归的情况,但这里我们关注的是线性回归简单线性回归的目标是找到最佳拟合直线,使得所有数据点到这条直线的垂直距离(残差)的平方和最小(最小二乘法)。方程中的a是截距,b是斜率。 执行步骤: 1. 数据准备:收集一组自变量X和因变量Y的观测数据,假设有n个样本点,即(X_i, Y_i), i=1,...,n。 2. 计算斜率b:使用最小二乘法,公式为: $$ b = \frac{\sum_{i=1}^{n}(X_i - \bar{X})(Y_i - \bar{Y})}{\sum_{i=1}^{n}(X_i - \bar{X})^2} $$ 其中,$\bar{X}$是X的样本均值,$\bar{Y}$是Y的样本均值。 3. 计算截距a:公式为: $$ a = \bar{Y} - b\bar{X} $$ 4. 得到回归方程:Y = a + bX 注意:使用该方法得到的是最佳拟合直线,但实际数据点可能散布在直线周围(如引用[2]所述)。 下面我们可以通过一个具体例子来演示计算过程。 例如,有以下数据点: X: [1, 2, 3, 4, 5] Y: [1, 3, 2, 3, 5] 计算步骤: 1. 计算均值: $\bar{X} = (1+2+3+4+5)/5 = 3$ $\bar{Y} = (1+3+2+3+5)/5 = 2.8$ 2. 计算b的分子和分母: 分子 = (1-3)*(1-2.8) + (2-3)*(3-2.8) + (3-3)*(2-2.8) + (4-3)*(3-2.8) + (5-3)*(5-2.8) = (-2)*(-1.8) + (-1)*(0.2) + (0)*(-0.8) + (1)*(0.2) + (2)*(2.2) = 3.6 - 0.2 + 0 + 0.2 + 4.4 = 8.0 分母 = (1-3)^2 + (2-3)^2 + (3-3)^2 + (4-3)^2 + (5-3)^2 = 4 + 1 + 0 + 1 + 4 = 10 因此,b = 8.0 / 10 = 0.8 3. 计算a: a = 2.8 - 0.8 * 3 = 2.8 - 2.4 = 0.4 4. 回归方程为:Y = 0.4 + 0.8X 我们可以使用这个方程进行预测。例如,当X=6时,Y=0.4+0.8*6=5.2。 此外,在编程实现时,我们可以使用统计库(如Python的`scikit-learn`或`statsmodels`)来计算,也可以自己编写代码。 这里提供一个简单的Python函数来计算简单线性回归的参数: ```python def simple_linear_regression(x, y): n = len(x) if n != len(y) or n == 0: return None # 计算均值 mean_x = sum(x) / n mean_y = sum(y) / n # 计算斜率的分子和分母 numerator = 0.0 denominator = 0.0 for i in range(n): numerator += (x[i] - mean_x) * (y[i] - mean_y) denominator += (x[i] - mean_x) ** 2 # 计算斜率和截距 slope = numerator / denominator intercept = mean_y - slope * mean_x return intercept, slope ``` 然后我们可以这样使用: ```python x = [1, 2, 3, 4, 5] y = [1, 3, 2, 3, 5] a, b = simple_linear_regression(x, y) print(f"回归方程: Y = {a:.2f} + {b:.2f}X") ``` 输出应该是:回归方程: Y = 0.40 + 0.80X 注意:在实际应用中,我们还需要评估模型的拟合优度(如R²)等,但用户问题只要求执行回归得到方程。 根据引用[1]可知,斜率b表示当自变量X增加一个单位时,因变量Y的增量。 因此,我们通过最小二乘法计算得到了简单线性回归的方程。 </think> ### 简单线性回归执行步骤(方程:$Y = a + bX$) #### 1. **数据准备** - 收集自变量 $X$ 和因变量 $Y$ 的**配对观测数据**($n$ 个样本点) 例如: - $X$:$[1, 2, 3, 4, 5]$ - $Y$:$[2, 4, 5, 4, 5]$ - 确保数据满足线性趋势(可通过散点图初步检验) #### 2. **公式计算**(最小二乘法) 使用以下公式计算斜率 $b$ 和截距 $a$: | 参数 | 公式 | |------|------| | **斜率 ($b$)** | $$ b = \frac{\sum{(X_i - \bar{X})(Y_i - \bar{Y})}}{\sum{(X_i - \bar{X})^2}} $$ | | **截距 ($a$)** | $$ a = \bar{Y} - b \bar{X} $$ | | 其中 | $\bar{X}$ 是 $X$ 的均值,$\bar{Y}$ 是 $Y$ 的均值 | #### 3. **计算示例 假设数据: - $X = [1, 2, 3, 4, 5]$ - $Y = [2, 4, 5, 4, 5]$ **Step 1:计算均值** - $\bar{X} = (1+2+3+4+5)/5 = 3$ - $\bar{Y} = (2+4+5+4+5)/5 = 4$ **Step 2:计算斜率 $b$** | $X_i$ | $Y_i$ | $(X_i - \bar{X})$ | $(Y_i - \bar{Y})$ | 分子项 $(X_i - \bar{X})(Y_i - \bar{Y})$ | 分母项 $(X_i - \bar{X})^2$ | |-------|-------|-------------------|-------------------|----------------------------------------|----------------------------| | 1 | 2 | -2 | -2 | 4 | 4 | | 2 | 4 | -1 | 0 | 0 | 1 | | 3 | 5 | 0 | 1 | 0 | 0 | | 4 | 4 | 1 | 0 | 0 | 1 | | 5 | 5 | 2 | 1 | 2 | 4 | | **总和** | | | | **6** | **10** | $$ b = \frac{6}{10} = 0.6 $$ **Step 3:计算截距 $a$** $$ a = \bar{Y} - b \bar{X} = 4 - (0.6 \times 3) = 2.2 $$ **最终方程**: $$ Y = 2.2 + 0.6X $$ #### 4. **结果解读** - **斜率 $b=0.6$**:$X$ 每增加 1 单位,$Y$ 平均增加 0.6 单位(见引用[^1]) - **拟合效果**:数据点不会完全落在直线上(见引用[^2]),可通过 $R^2$ 评估拟合优度 - **预测示例**:当 $X=6$ 时,$Y = 2.2 + 0.6 \times 6 = 5.8$ #### 5. **代码实现(Python)** ```python import numpy as np # 输入数据 X = np.array([1, 2, 3, 4, 5]) Y = np.array([2, 4, 5, 4, 5]) # 计算斜率b和截距a b = np.sum((X - np.mean(X)) * (Y - np.mean(Y))) / np.sum((X - np.mean(X)) ** 2) a = np.mean(Y) - b * np.mean(X) print(f"回归方程: Y = {a:.2f} + {b:.2f}X") # 输出: Y = 2.20 + 0.60X ``` #### 关键注意事项 1. 线性假设:仅适用于 $X$ 和 $Y$ 呈**线性关系**的数据(非线性数据需其他方法,见引用[^3]) 2. 异常值影响:离群点会显著扭曲回归结果 3. 统计检验:建议计算 $p$ 值验证显著性 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值