我需要修改代码,以便可以查看不同批次大小的成本。将每个批次的大小分开绘制,以得出平均成本(y轴)与训练样本数(x轴)的关系。
这是练习
#library
from numpy.random import seed
class AdalineSGD(object):
def __init__(self, eta=0.01, n_iter=10, shuffle=True, random_state=None):
self.eta = eta
self.n_iter = n_iter
self.w_initialized = False
self.shuffle = shuffle
if random_state:
seed(random_state)
def fit(self, X, y):
self._initialize_weights(X.shape[1])
self.cost_ = []
for i in range(self.n_iter):
if self.shuffle:
X, y = self._shuffle(X, y)
cost = []
for xi, target in zip(X, y):
cost.append(self._update_weights(xi, target))
avg_cost = sum(cost) / len(y)
self.cost_.append(avg_cost)
return self
def partial_fit(self, X, y):
#Fit training data without reinitializing the weights
if not self.w_initialized:
self._initialize_weights(X.shape[1])
if y.ravel().shape[0] > 1:
for xi, target in zip(X, y):
self._update_weights(xi, target)
else:
self._update_weights(X, y)
return self
def _shuffle(self, X, y):
#Shuffle training data
r = np.random.permutation(len(y))
return X[r], y[r]
def _initialize_weights(self, m):
"""Initialize weights to zeros"""
self.w_ = np.zeros(1 + m)
self.w_initialized = True
def _update_weights(self, xi, target):
"""Apply Adaline learning rule to update the weights"""
output = self.net_input(xi)
error = (target - output)
self.w_[1:] += self.eta * xi.dot(error)
self.w_[0] += self.eta * error
cost = 0.5 * error**2
return cost
def net_input(self, X):
"""Calculate net input"""
return np.dot(X, self.w_[1:]) + self.w_[0]
def activation(self, X):
"""Compute linear activation"""
return self.net_input(X)
def predict(self, X):
"""Return class label after unit step"""
return np.where(self.activation(X) >= 0.0, 1, -1)
X_std = np.copy(X)
X_std[:, 0] = (X[:, 0] - X[:, 0].mean()) / X[:, 0].std()
X_std[:, 1] = (X[:, 1] - X[:, 1].mean()) / X[:, 1].std()
iterations = 15 # i.e. epochs
batch_sizes = [1, 5, 10, 20, 50, 100]
for batch_size in batch_sizes:
ada = AdalineSGD(n_iter=0, eta=0.01, random_state=1)
for iteration in range(iterations):
num_batches = np.ceil(y.ravel().shape[0]/batch_size).astype(int)
for batch_index in range(num_batches):
start_index = batch_index*batch_size
end_index = start_index + batch_size
ada.partial_fit(X_std[start_index:end_index, :], y[start_index:end_index])
plt.plot([batch_size * x for x in range(1, len(ada.cost_) + 1)], ada.cost_, label=str(batch_size))
if len(batch_sizes) > 0:
plt.xlabel('# trained samples')
plt.ylabel('Average Cost')
plt.legend(loc='best')
plt.tight_layout()
plt.show()
的代码