sk-learn 最小二乘法-练习

LinearRegression 用系数拟合线性模型
尽量减少数据集中观察到的目标与线性近似预测的目标之间的平方余数
hat{y}(w, x) = w_0 + w_1 x_1 + … + w_p x_p

实例讲解:有一组数据(1,6),(3,5),(5,7),(6,12),要找出一条与这几个点最为匹配的直线 : y = A + Bx
有如下方程:
6 = A + B
5 = A + 3B
7 = A + 5B
12 = A + 6B
很明显上面方程是超定线性方程组,要使左边和右边尽可能相等;采用最小二乘法:
L(A,B)=[6-(A + B)]^2 + [5-(A + 3B)]^2 + [7-(A + 5B)]^2 +[12-(A + 6B)]^2使得L的值最小:
这里L是关于A,B的函数;那么我们可以利用对A,B求偏导,进而求出A,B的值使得Lmin

"""
L(A,B) = [Y-(A+BX)]^2 + ...
d/dA = 2(Y-(A+BX)) + ...
d/dB = -2X(Y-(A+BX)) + ...
"""
import matplotlib.pyplot as plt


class LinearModel:
    def __init__(self, list1):
        self.list1 = list1
        self.x_n = len(self.list1[0])
        self.x_m = len(self.list1)

    def DA(self):
        A = 0
        B = 0
        C = 0
        for i in range(self.x_m):
            A += 2
            B += self.list1[i][0] * 2
            C -= 2 * self.list1[i][1]
        return A, B, C

    def DB(self):
        A = 0
        B = 0
        C = 0
        for i in range(self.x_m):
            A += 2 * self.list1[i][0]
            B += 2 * pow(self.list1[i][0], 2)
            C -= 2 * self.list1[i][1] * self.list1[i][0]
        return A, B, C

    def test(self, A, B, X):
        return A + B * X

    def run(self):
        A1, B1, C1 = self.DA()
        A2, B2, C2 = self.DB()
        print(A1, B1, C1)
        print(A2, B2, C2)
        P_x = A1 / A2
        P_b_index = B2 * P_x - B1
        P_c_index = C2 * P_x - C1
        B = P_c_index / P_b_index
        A = (0 - (B * B1 + C1)) / A1
        print(A, B)
        return A, B


if __name__ == "__main__":
    _list = [[1, 6], [3, 5], [5, 7], [6, 12]]  # 训练
    LM = LinearModel(_list)
    A, B = LM.run()
    test_list = [[1,6], [3,5], [5,7], [6,12]]  # 测试
    X = [i[0] for i in test_list]
    Y = [i[1] for i in test_list]
    plt.plot(X, [LM.test(A,B,i) for i in X])
    plt.plot(X, Y, 'ro')
    plt.show()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值