<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Программирование на Python
Дзен Python
Step1:  Красивое лучше, чем уродливое.<br>
Явное лучше, чем неявное.<br>
Простое лучше, чем сложное.<br>
Сложное лучше, чем запутанное.<br>
Плоское лучше, чем вложенное.<br>
Разреженное лучше, чем плотное.<br>
Читаемость имеет значение.<br>
Особые случаи не настолько особые, чтобы нарушать правила.<br>
При этом практичность важнее безупречности.<br>
Ошибки никогда не должны замалчиваться.<br>
Если не замалчиваются явно.<br>
Встретив двусмысленность, отбрось искушение угадать.<br>
Должен существовать один — и, желательно, только один — очевидный способ сделать это.<br>
Хотя он поначалу может быть и не очевиден, если вы не голландец.<br>
Сейчас лучше, чем никогда.<br>
Хотя никогда зачастую лучше, чем прямо сейчас.<br>
Если реализацию сложно объяснить — идея плоха.<br>
Если реализацию легко объяснить — идея, возможно, хороша.<br>
Пространства имён — отличная штука! Будем делать их побольше!
Step2:  Типы данных в np.array
Целые знаковые
* np.int8
* np.int16
* np.int32
* np.int64
Целые беззнаковые
* np.uint8
* np.uint16
* np.uint32
* np.uint64
С плавающей точкой
* np.float16
* np.float32
* np.float64
Step3:  Создание массивов в numpy
Диапозон значений
Step4:  Заполнение массива
Step5:  Случайные значения
Step6:  $$f(x) = kx+b$$
$$f(x) = X*W$$
Step7:  $$MSE(X,\omega, y) = \frac{1}{N} \sum_i (f(x_i, \omega) - y_i)^2$$
$$\frac{dMSE}{dk} = \frac{2}{N} \sum_i (f(x_i, \omega) - y_i)*x_i$$
$$\frac{dMSE}{db} = \frac{2}{N} \sum_i (f(x_i, \omega) - y_i)$$
$$MSE(X,\omega, y) = \frac{1}{N}(XW - y)(XW - y)$$
$$\frac{dMSE}{dk} = \frac{2}{N}(XW - y)x$$
$$\frac{dMSE}{db} = \frac{2}{N} \sum (XW - y)$$
$$dMSE = \frac{2}{N} * (X * W-y)*X$$
$$W_{i+1} = W_{i}-\alpha*dMSE(X, W_i, y)$$
<ASSISTANT_TASK:>
Python Code:
%pylab inline
import this
Explanation: Программирование на Python
Дзен Python
End of explanation
import numpy as np
np.array([1,2,3])
a = np.array([[1,2,3], [4,5,6]])
a = np.array([1,2,3])
b = np.array([4,5,6])
a+b
a*b
a/b
a**b
Explanation: Красивое лучше, чем уродливое.<br>
Явное лучше, чем неявное.<br>
Простое лучше, чем сложное.<br>
Сложное лучше, чем запутанное.<br>
Плоское лучше, чем вложенное.<br>
Разреженное лучше, чем плотное.<br>
Читаемость имеет значение.<br>
Особые случаи не настолько особые, чтобы нарушать правила.<br>
При этом практичность важнее безупречности.<br>
Ошибки никогда не должны замалчиваться.<br>
Если не замалчиваются явно.<br>
Встретив двусмысленность, отбрось искушение угадать.<br>
Должен существовать один — и, желательно, только один — очевидный способ сделать это.<br>
Хотя он поначалу может быть и не очевиден, если вы не голландец.<br>
Сейчас лучше, чем никогда.<br>
Хотя никогда зачастую лучше, чем прямо сейчас.<br>
Если реализацию сложно объяснить — идея плоха.<br>
Если реализацию легко объяснить — идея, возможно, хороша.<br>
Пространства имён — отличная штука! Будем делать их побольше!
End of explanation
np.array([1, 2, 4], dtype=np.float32)
a = np.array([1,2,3])
print(a.dtype)
print(a.astype(np.float64).dtype)
Explanation: Типы данных в np.array
Целые знаковые
* np.int8
* np.int16
* np.int32
* np.int64
Целые беззнаковые
* np.uint8
* np.uint16
* np.uint32
* np.uint64
С плавающей точкой
* np.float16
* np.float32
* np.float64
End of explanation
np.arange(2, 10, 3, dtype=np.float32)
np.linspace(1,10,10000)
Explanation: Создание массивов в numpy
Диапозон значений
End of explanation
np.zeros((3,1),dtype=np.float16)
np.ones((5,3),dtype=np.float16)
Explanation: Заполнение массива
End of explanation
np.random.random((4,2,3))
np.random.randint(1,10,(5,3))
np.random.normal(5, 6, (4,2))
np.random.seed(42)
a = np.zeros((3,2))
b = np.ones((3,2))
np.hstack([a,b])
np.vstack([a, b])
a
a.shape
b = np.array([[1,2],[3,4],[5,6]])
b.T
a.dot(b)
X = np.arange(1,11).reshape((-1,1))
y = np.arange(2,12)+np.random.normal(size=(10))
y = y.reshape((-1,1))
W = np.random.random((2,1))
Explanation: Случайные значения
End of explanation
X = np.hstack([X, np.ones((10,1))])
f(X)
Explanation: $$f(x) = kx+b$$
$$f(x) = X*W$$
End of explanation
def f(X, W):
    return X.dot(W)
def MSE(X, W, y):
    return (X.dot(W)-y).T.dot(X.dot(W)-y)/X.shape[0]
def dMSE(X, W, y):
    return 2/X.shape[0]*X.T.dot((X.dot(W)-y))
def optimize(W,X,y,a):
    for i in range(1000):
        W = W - a*dMSE(X,W,y)
MSE(X, W, y)
dMSE(X,W,y)
def optimize(W,X,y,a):
    global coef, mses
    coef = []
    mses = []
    for i in range(1000):
        coef.append(W)
        mses.append(MSE(X,W,y)[0,0])
        W = W - a*dMSE(X,W,y)
#         print(MSE(X,W,y))
    return W
W = np.random.random((2,1))
P = optimize(W, X, y, 0.02)
coef = np.array(coef)
ylabel("k")
xlabel("b")
plot(coef[:,0,0], coef[:,1,0]);
ylabel("MSE")
xlabel("iteration")
plot(mses);
scatter(X[:,0],y.reshape(-1))
plot(X[:,0], f(X, W))
plot(X[:,0], f(X, P))
Explanation: $$MSE(X,\omega, y) = \frac{1}{N} \sum_i (f(x_i, \omega) - y_i)^2$$
$$\frac{dMSE}{dk} = \frac{2}{N} \sum_i (f(x_i, \omega) - y_i)*x_i$$
$$\frac{dMSE}{db} = \frac{2}{N} \sum_i (f(x_i, \omega) - y_i)$$
$$MSE(X,\omega, y) = \frac{1}{N}(XW - y)(XW - y)$$
$$\frac{dMSE}{dk} = \frac{2}{N}(XW - y)x$$
$$\frac{dMSE}{db} = \frac{2}{N} \sum (XW - y)$$
$$dMSE = \frac{2}{N} * (X * W-y)*X$$
$$W_{i+1} = W_{i}-\alpha*dMSE(X, W_i, y)$$
End of explanation
<END_TASK>