import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
alpha = 0.01
a0 = np.random.uniform(0, 1)
a1 = np.random.uniform(0, 1)
a2 = np.random.uniform(0, 1)
a = np.array([a1, a2])
eps = 1e-4
e0 = 1
e1 = 1
e2 = 1
x = np.array([[2, 3], [4, 6], [7, 8], [12, 15]])
t = np.array([5, 8, 14, 17])
cnt = 0
while (abs(e0) >= eps or abs(e1) >= eps or abs(e2) >= eps):
cnt += 1
i = np.random.randint(0,4)
e0 = (np.sum((x[i] * a)) + a0 * 1 - t[i])
e1 = (np.sum((x[i] * a)) + a0 * 1 - t[i]) * x[i][0]
e2 = (np.sum((x[i] * a)) + a0 * 1 - t[i]) * x[i][1]
i = np.random.randint(0,4)
e0 += (np.sum((x[i] * a)) + a0 * 1 - t[i])
e1 += (np.sum((x[i] * a)) + a0 * 1 - t[i]) * x[i][0]
e2 += (np.sum((x[i] * a)) + a0 * 1 - t[i]) * x[i][1]
e0 /= 5
e1 /= 5
e2 /= 5
a0 = a0 - alpha * e0
a1 = a1 - alpha * e1
a2 = a2 - alpha * e2
a = np.array([a1, a2])
print(cnt)
print(a0, a1, a2)
fig = plt.figure()
ax = Axes3D(fig)
a = np.arange(0, 20)
b = np.arange(0, 20)
A, B = np.meshgrid(a, b)
Z = a0 + a1 * A + a2 * B
plt.xlabel('x1')
plt.ylabel('x2')
ax.plot_surface(A, B, Z, rstride=3, cstride=3, cmap='rainbow')
plt.show()
193320
4.7166585579851406 3.3440500715117722 -1.7656272392230077