损失函数——求模型权重W
随机搜索
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
digits = datasets.load_digits()
X = digits.data
y = digits.target
y_binary = (y == 0).astype(int)
X_train, X_test, y_train, y_test = train_test_split(X, y_binary, test_size=0.2, random_state=42)
def hinge_loss(W, X, y):
scores = np.dot(X, W)
loss = np.maximum(0, 1 - scores * y)
return np.mean(loss)
def random_search(train_data, train_labels, num_iterations=100):
best_loss = float('inf')
best_W = None
for i in range(num_iterations):
W = np.random.randn(train_data.shape[1])
loss = hinge_loss(W, train_data, train_labels)
if loss < best_loss:
best_loss = loss
best_W = W
print(f"第{i}次,当前损失值为{loss},最小损失值为{best_loss}")
return best_W
W_best = random_search(X_train, y_train)
train_loss = hinge_loss(W_best, X_train, y_train)
test_loss = hinge_loss(W_best, X_test, y_test)
print("最优权重的训练损失:", train_loss)
print("最优权重的测试损失:", test_loss)
随机本地搜索
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
digits = datasets.load_digits()
X = digits.data
y = digits.target
y_binary = (y == 0).astype(int) * 2 - 1
X_train, X_test, y_train, y_test = train_test_split(
X, y_binary, test_size=0.2, random_state=42
)
def hinge_loss(W, X, y):
scores = np.dot(X, W)
loss = np.maximum(0, 1 - scores * y)
return np.mean(loss)
def random_local_search(train_data, train_labels, num_iterations=1000, lr=0.1):
best_W = np.random.randn(train_data.shape[1])
best_loss = hinge_loss(best_W, train_data, train_labels)
for i in range(num_iterations):
new_W = best_W + np.random.randn(train_data.shape[1]) * lr
loss_new = hinge_loss(new_W, train_data, train_labels)
if loss_new < best_loss:
best_loss = loss_new
best_W = new_W
print(f"第{i}次,当前损失值为{loss_new},最小损失值为{best_loss}")
return best_W
W_best = random_local_search(X_train, y_train)
train_loss = hinge_loss(W_best, X_train, y_train)
test_loss = hinge_loss(W_best, X_test, y_test)
print("最优权重的训练损失:", train_loss)
print("最优权重的测试损失:", test_loss)
梯度下降法(解析梯度)
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
digits = datasets.load_digits()
X = digits.data
y = digits.target
y_binary = (y == 0).astype(int) * 2 - 1
X_train, X_test, y_train, y_test = train_test_split(
X, y_binary, test_size=0.2, random_state=42
)
def hinge_loss(W, X, y):
scores = np.dot(X, W)
loss = np.maximum(0, 1 - scores * y)
return np.mean(loss)
def random_local_search(train_data, train_labels, num_iterations=1000, lr=0.1):
best_W = np.random.randn(train_data.shape[1])
best_loss = hinge_loss(best_W, train_data, train_labels)
for i in range(num_iterations):
new_W = best_W + np.random.randn(train_data.shape[1]) * lr
loss_new = hinge_loss(new_W, train_data, train_labels)
if loss_new < best_loss:
best_loss = loss_new
best_W = new_W
print(f"第{i}次,当前损失值为{loss_new},最小损失值为{best_loss}")
return best_W
W_best = random_local_search(X_train, y_train)
train_loss = hinge_loss(W_best, X_train, y_train)
test_loss = hinge_loss(W_best, X_test, y_test)
print("最优权重的训练损失:", train_loss)
print("最优权重的测试损失:", test_loss)