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()