端基法和最小二乘法计算线性度

本文介绍了使用Python的numpy库实现的两种数据拟合方法:端基法和最小二乘法,通过实例展示了如何计算线性回归的斜率和截距,并计算残差的最大绝对值。
import numpy as np


def end_group_method(data1, data2):
    print("端基法")
    dict1 = {key: value for key, value in zip(data1, data2)}
    dict1 = dict(sorted(dict1.items(), key=lambda i: i[1], reverse=False))
    data1 = list(dict1.keys())
    data2 = list(dict1.values())
    m_k = (data2[len(y) - 1] - data2[0]) / (data1[len(data1) - 1] - data1[0])
    m_b = (data2[0] * data1[len(x) - 1] - data2[len(data2) - 1] * data1[0]) / (data1[len(data1) - 1] - data1[0])
    print("y=%.4fx+%.4f" % (m_k, m_b))
    m_L = np.subtract(data2, (np.multiply(m_k, data1) + m_b))
    L_max = max(np.abs(m_L))
    print(f"L_max={L_max}")
    print(f"e_L = +-{L_max / data2[len(data2) - 1] * 100}%")
    return None


def least_square_method(data1, data2):
    print("最小二乘法")
    dict1 = {key: value for key, value in zip(data1, data2)}
    dict1 = dict(sorted(dict1.items(), key=lambda i: i[1], reverse=False))
    data1 = list(dict1.keys())
    data2 = list(dict1.values())
    m_k = (len(data1) * sum(np.multiply(data1, data2)) - sum(data1)*sum(data2)) / (len(data1)*sum(np.power(data1, 2)) - sum(data1)**2)
    m_b = (sum(np.power(data1, 2)) * sum(data2) - sum(data1) * sum(np.multiply(data1, data2))) / (len(data1)*sum(np.power(data1, 2)) - sum(data1)**2)
    print("y=%.4fx+%.4f" % (m_k, m_b))
    m_L = np.subtract(data2, (np.multiply(m_k, data1) + m_b))
    L_max = max(np.abs(m_L))
    print(f"L_max={L_max}")
    print(f"e_L = +-{L_max / data2[len(data2) - 1] * 100}%")
    return None


x = [0.9, 2.5, 3.3, 4.5, 6.7, 5.7]
y = [1.1, 1.6, 2.6, 3.2, 5.0, 4.0]

end_group_method(x, y)
print("")
least_square_method(x, y)

### 最小二乘法计算线性公式及代码实现 最小二乘法是一种常用的技术,用于通过一组数据点拟合一条直线。这种方法的目标是最小化实际值与预测值之间的误差平方。以下是详细的公式推导及其在C语言中的实现。 #### 数学基础 假设我们有 $ n $ 个数据点 $(x_i, y_i)$,目标是找到最佳拟合直线 $ f(x) = ax + b $。这里的 $ a $ 表示斜率(灵敏),$ b $ 是截距。为了使误差平方最小,我们需要解决以下优化问题: \[ S(a,b) = \sum_{i=1}^{n}(y_i - (ax_i + b))^2. \] 通过对 $ S(a,b) $ 分别关于 $ a $ $ b $ 求偏导数,并令其等于零,我们可以得到两个正规方程[^4]: \[ a = \frac{n\sum{x_iy_i} - \sum{x_i}\sum{y_i}}{n\sum{x_i^2} - (\sum{x_i})^2}, \] \[ b = \frac{\sum{x_i^2}\sum{y_i} - \sum{x_i}\sum{x_iy_i}}{n\sum{x_i^2} - (\sum{x_i})^2}. \] 这些公式可以直接用来计算斜率截距。 #### 实现代码 下面是基于上述公式的C语言实现: ```c #include <stdio.h> // 函数声明 double compute_slope(int n, double x[], double y[]); double compute_intercept(int n, double x[], double y[], double slope); int main() { int n = 5; // 数据点的数量 double x[] = {1.0, 2.0, 3.0, 4.0, 5.0}; // 自变量数组 double y[] = {1.1, 1.9, 3.2, 4.0, 4.8}; // 因变量数组 // 计算斜率截距 double slope = compute_slope(n, x, y); double intercept = compute_intercept(n, x, y, slope); // 输出结果 printf("Slope (Linearity/Sensitivity): %.6f\n", slope); printf("Intercept: %.6f\n", intercept); return 0; } // 计算斜率 double compute_slope(int n, double x[], double y[]) { double sum_x = 0.0, sum_y = 0.0, sum_xx = 0.0, sum_xy = 0.0; for (int i = 0; i < n; ++i) { sum_x += x[i]; sum_y += y[i]; sum_xx += x[i] * x[i]; sum_xy += x[i] * y[i]; } return (n * sum_xy - sum_x * sum_y) / (n * sum_xx - sum_x * sum_x); } // 计算截距 double compute_intercept(int n, double x[], double y[], double slope) { double sum_x = 0.0, sum_y = 0.0, sum_xx = 0.0; for (int i = 0; i < n; ++i) { sum_x += x[i]; sum_y += y[i]; sum_xx += x[i] * x[i]; } return (sum_xx * sum_y - sum_x * (slope * sum_x)) / (n * sum_xx - sum_x * sum_x); } ``` 这段代码实现了以下功能: - 输入两组对应的数据点 $ x $ $ y $。 - 使用最小二乘法公式分别计算斜率截距。 - 将结果打印到控制台。 --- ### 解释 1. **斜率计算**:利用公式 $ a = \frac{n\sum{x_iy_i} - \sum{x_i}\sum{y_i}}{n\sum{x_i^2} - (\sum{x_i})^2} $ 来获得斜率。 2. **截距计算**:利用公式 $ b = \frac{\sum{x_i^2}\sum{y_i} - \sum{x_i}\sum{x_iy_i}}{n\sum{x_i^2} - (\sum{x_i})^2} $ 来获取截距[^4]。 3. **适用场景**:适用于任何需要评估线性关系的情况,例如传感器校准、数据分析等领域。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值