第1关:OvO多分类策略
import numpy as np
class tiny_logistic_regression(object):
def __init__(self):
self.coef_ = None
self.intercept_ = None
self._theta = None
self.label_map = {
}
def _sigmoid(self, x):
return 1. / (1. + np.exp(-x))
def fit(self, train_datas, train_labels, learning_rate=1e-4, n_iters=1e3):
def J(theta, X_b, y):
y_hat = self._sigmoid(X_b.dot(theta))
try:
return -np.sum(y*np.log(y_hat)+(1-y)*np.log(1-y_hat)) / len(y)
except:
return float('inf')
def dJ(theta, X_b, y):
return X_b.T.dot(self._sigmoid(X_b.dot(theta)) - y) / len(y)
def gradient_descent(X_b, y, initial_theta, leraning_rate, n_iters=1e2, epsilon=1e-6):
theta = initial_theta
cur_iter = 0
while cur_iter < n_iters:
gradient = dJ(theta, X_b, y)
last_theta = theta
theta = theta - leraning_rate * gradient
if (abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon):
break
cur_iter += 1
return theta
unique_labels = list(set(train_labels))
labels = train_labels.copy()
self.label_map[0] = unique_labels[0]
labels[train_labels == unique_labels[