In [159]:
%pylab inline
In [1]:
import this
Красивое лучше, чем уродливое.
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Сложное лучше, чем запутанное.
Плоское лучше, чем вложенное.
Разреженное лучше, чем плотное.
Читаемость имеет значение.
Особые случаи не настолько особые, чтобы нарушать правила.
При этом практичность важнее безупречности.
Ошибки никогда не должны замалчиваться.
Если не замалчиваются явно.
Встретив двусмысленность, отбрось искушение угадать.
Должен существовать один — и, желательно, только один — очевидный способ сделать это.
Хотя он поначалу может быть и не очевиден, если вы не голландец.
Сейчас лучше, чем никогда.
Хотя никогда зачастую лучше, чем прямо сейчас.
Если реализацию сложно объяснить — идея плоха.
Если реализацию легко объяснить — идея, возможно, хороша.
Пространства имён — отличная штука! Будем делать их побольше!
In [1]:
import numpy as np
In [2]:
np.array([1,2,3])
Out[2]:
In [114]:
a = np.array([[1,2,3], [4,5,6]])
In [8]:
a = np.array([1,2,3])
b = np.array([4,5,6])
In [9]:
a+b
Out[9]:
In [10]:
a*b
Out[10]:
In [11]:
a/b
Out[11]:
In [12]:
a**b
Out[12]:
In [4]:
np.array([1, 2, 4], dtype=np.float32)
Out[4]:
In [7]:
a = np.array([1,2,3])
print(a.dtype)
print(a.astype(np.float64).dtype)
In [16]:
np.arange(2, 10, 3, dtype=np.float32)
Out[16]:
In [22]:
np.linspace(1,10,10000)
Out[22]:
In [32]:
np.zeros((3,1),dtype=np.float16)
Out[32]:
In [26]:
np.ones((5,3),dtype=np.float16)
Out[26]:
In [45]:
np.random.random((4,2,3))
Out[45]:
In [49]:
np.random.randint(1,10,(5,3))
Out[49]:
In [101]:
np.random.normal(5, 6, (4,2))
Out[101]:
In [99]:
np.random.seed(42)
In [ ]:
In [102]:
a = np.zeros((3,2))
b = np.ones((3,2))
In [108]:
np.hstack([a,b])
Out[108]:
In [109]:
np.vstack([a, b])
Out[109]:
In [119]:
a
Out[119]:
In [142]:
a.shape
Out[142]:
In [120]:
b = np.array([[1,2],[3,4],[5,6]])
In [124]:
b.T
Out[124]:
In [121]:
a.dot(b)
Out[121]:
In [ ]:
In [140]:
X = np.arange(1,11).reshape((-1,1))
y = np.arange(2,12)+np.random.normal(size=(10))
y = y.reshape((-1,1))
In [168]:
W = np.random.random((2,1))
In [146]:
X = np.hstack([X, np.ones((10,1))])
In [150]:
f(X)
Out[150]:
In [314]:
def f(X, W):
return X.dot(W)
In [154]:
def MSE(X, W, y):
return (X.dot(W)-y).T.dot(X.dot(W)-y)/X.shape[0]
In [156]:
def dMSE(X, W, y):
return 2/X.shape[0]*X.T.dot((X.dot(W)-y))
In [183]:
def optimize(W,X,y,a):
for i in range(1000):
W = W - a*dMSE(X,W,y)
In [155]:
MSE(X, W, y)
Out[155]:
In [157]:
dMSE(X,W,y)
Out[157]:
In [289]:
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
In [309]:
W = np.random.random((2,1))
P = optimize(W, X, y, 0.02)
In [310]:
coef = np.array(coef)
In [311]:
ylabel("k")
xlabel("b")
plot(coef[:,0,0], coef[:,1,0]);
In [312]:
ylabel("MSE")
xlabel("iteration")
plot(mses);
In [315]:
scatter(X[:,0],y.reshape(-1))
plot(X[:,0], f(X, W))
plot(X[:,0], f(X, P))
Out[315]:
In [ ]: