梯度上升


import numpy as np
import matplotlib.pyplot as plt

X = np.empty((100,2))
X[:,0] = np.random.uniform(0,100,size=100)

X[:,1] = 0.75 * X[:,0] + 3. + np.random.normal(0,10.,size=100)

plt.scatter(X[:,0],X[:,1])
plt.show()

def demean(X):
return X - np.mean(X,axis=0)

x_demean = demean(X)
plt.scatter(x_demean[:,0],x_demean[:,1])
plt.show()


def direction(w):
return w / np.linalg.norm(w)

def f(w,X):
return np.sum((X.dot(w)**2)) / len(X)

def df_math(w,X):
return X.T.dot(X.dot(w)) * 2. /len(X)


def gradient_ascent(df,X, initial_w, eta=0.01, n_iters=1e4, epsilon=1e-8):
w = direction(initial_w)
cur_iter = 0

while cur_iter < n_iters:
gradient = df(w, X)
last_w = w
w = w + eta * gradient
w = direction(w)
if (abs(f(w, X) - f(last_w, X)) < epsilon):
break
cur_iter += 1

return w


initial_w = np.random.random(X.shape[1])

print(initial_w)

w1 = gradient_ascent(df_math,x_demean,initial_w)

print(w1)

plt.scatter(x_demean[:,0],x_demean[:,1])
plt.plot([0,w1[0]*30],[0,w1[1]*30],color ='r')
plt.show()
posted @ 2018-12-18 10:29  何国秀_xue  阅读(416)  评论(0编辑  收藏  举报