在这份代码的基础上重新生成上面问题# -*- coding: utf-8 -*- """ Created on Mon Mar 10 21:11:48 2025 @author: zhenh """ import numpy as np from scipy.optimize import minimize, LinearConstraint, Bounds import matplotlib.pyplot as plt def svm_optimization(X, y, c_values): # 参数初始化 K = np.array(X.shape) m = K[1] n = K[0] # 样本数 x_dim = m + 1 + n # 变量总维度: w (m) + b (1) + xi (n) # 目标函数 (含L2正则化和松弛变量惩罚) def objective(x, c): w = x[:m] xi = x[m+1:] return 0.5 * np.linalg.norm(w, ord=2)**2 + c * np.sum(xi) # 约束条件: y_i(w·x_i + b) >= 1 - xi_i (每个样本对应一个约束) A = np.zeros((n, x_dim)) for i in range(n): A[i, :m] = y[i] * X[i] # w项 A[i, m] = y[i] # b项 A[i, m+1+i] = 1 # xi_i项 linear_constraint = LinearConstraint(A, lb=1, ub=np.inf) # 变量边界: w和b无界, xi非负 bounds = Bounds( [-np.inf]*(m+1) + [0]*n, [np.inf]*(m+1) + [np.inf]*n ) # 优化求解 results = [] for c in c_values: x0 = np.random.randn(x_dim) # 随机初始值 res = minimize( objective, x0, args=(c,), method='SLSQP', constraints=linear_constraint, bounds=bounds, options={'maxiter': 1000} ) results.append(res.x)
时间: 2025-03-24 12:22:38 浏览: 39
感谢您提供的代码示例!以下是对您的问题的回答以及进一步的说明。
---
### SVM 优化原理概述
从代码来看,这是一个硬边距支持向量机(SVM)结合松弛变量的实现。通过引入松弛变量 \( \xi_i \) 和惩罚因子 \( C \),允许一定程度的数据误分类。同时,目标是最小化权重向量 \( w \) 的 L2 范数平方加上所有松弛变量的加权和,这有助于提高泛化能力。
#### 主要组成部分解析:
1. **目标函数**
公式为:\( f(w, b, \xi) = \frac{1}{2}\|w\|^2 + C \sum_{i=1}^{n} \xi_i \)
目的是在最大化间隔的同时尽量减少错误分类点的影响。
2. **约束条件**
对于每一个训练样本 \( (x_i, y_i) \),需要满足如下约束:
\( y_i (\mathbf{w}^\top \mathbf{x}_i + b) \geq 1 - \xi_i,\quad \forall i \in [1, n] \)
同时要求 \( \xi_i \geq 0 \) (即松弛变量非负)。
3. **求解过程**
使用 `scipy.optimize.minimize` 函数并通过指定方法 "SLSQP" 来寻找最优解。此方法适合处理包含等式及不等式约束的问题。
---
### 改进版代码及其解释
下面是基于原代码改进后的完整版本,并补充了如何计算决策边界和支持向量等内容:
```python
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 10 21:11:48 2025
@author: zhenh
"""
import numpy as np
from scipy.optimize import minimize, LinearConstraint, Bounds
import matplotlib.pyplot as plt
class SoftMarginSVM:
def __init__(self):
pass
def fit(self, X, y, c_values=[1]):
"""
训练软边距SVM模型
Parameters:
----------
X : array-like of shape (n_samples, n_features)
输入特征数据.
y : array-like of shape (n_samples,)
标签 (-1 或者 +1).
c_values : list or ndarray
不同C值用于测试最佳参数.
Returns:
-------
NoneType object with attributes 'w', 'b'.
"""
self.X = X
self.y = y
self.c_values = c_values
K = np.array(X.shape)
m = K[1] # 特征数
n = K[0] # 样本数
x_dim = m + 1 + n # 总维度: w(m), b(1), ξ(n)
# 创建A矩阵
A = np.zeros((n, x_dim))
for i in range(n):
A[i, :m] = y[i] * X[i] # Xi乘以yi填充到前半段
A[i, m] = y[i] # yi放到中间位置(b处)
A[i, m+1+i] = 1 # 单位阵填充到最后(xi处)
# 线性约束 Ax >= 1 -> lb设置成1-vector; ub无穷大即可.
linear_constraint = LinearConstraint(A=A, lb=np.ones(n), ub=None)
# 变量上下界: w,b无限制;ξ>=0
bounds = Bounds([-np.inf] * (m + 1) + [0] * n,
[+np.inf] * (m + 1) + [np.inf] * n)
best_c_index = None
min_obj_val = float('inf')
solutions = []
# 循环遍历多个C尝试找到最佳配置
for idx, c_value in enumerate(c_values):
obj_func = lambda x: 0.5 * np.linalg.norm(x[:m], ord=2)**2 \
+ c_value * sum(x[m+1:]) if len(x) == x_dim else None
initial_guess = np.random.normal(loc=0., scale=1e-6, size=x_dim)
sol = minimize(
fun=obj_func,
x0=initial_guess,
method="SLSQP",
constraints=[linear_constraint],
bounds=bounds,
tol=1e-7,
options={"disp": False}
)
current_val = sol.fun
print(f"C={c_value}, Optimization Result:{current_val}")
if current_val < min_obj_val and sol.success is True:
min_obj_val = current_val
best_c_index = idx
solutions.append(sol.x)
optimal_x_star = solutions[best_c_index]
self.w = optimal_x_star[:m]
self.b = optimal_x_star[m]
self.support_vectors = [(X[i], y[i])
for i in range(len(y))
if abs(optimal_x_star[m+1:] - 0.) <= 1.e-5]
svm_model = SoftMarginSVM()
```
---
### §:
1. 我们为什么要在SVM中加入松弛变量?它起到什么作用?
2. SLSQP算法适用于哪些场景下的优化问题?
3. 如果改变输入数据分布或添加更多噪音会对SVM的支持向量数量产生怎样的影响?
阅读全文
相关推荐

















