import numpy as np
import matplotlib.pyplot as pltpoints = np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4, 1.1]])points2 = np.array([[3.2, 3.2],[3.7, 2.9],[3.2, 2.6],[1.7, 3.3],[3.4, 2.6],[4.1, 2.3],[3.0, 2.9]])# 合并为一个数据集
x1_data = np.concatenate((points[:, 0], points2[:, 0])) # 所有的 x1 坐标
x2_data = np.concatenate((points[:, 1], points2[:, 1])) # 所有的 x2 坐标# 创建标签
y = np.concatenate((np.ones(points.shape[0]), -np.ones(points2.shape[0])))# 初始化超平面的参数 w1, w2 和偏置 b
w1 = 0.1
w2 = 0.1
b = 0# 学习率
learning_rate = 0.05# 数据集的大小
l_data = x1_data.size# 创建图形和子图
fig, (ax1, ax2) = plt.subplots(2, 1)# 初始化存储每一步的损失值和迭代步数
step_list = np.array([])
loss_values = np.array([])# 设定迭代次数,控制模型训练的周期
num_iterations = 1000
for n in range(1, num_iterations + 1):# 计算超平面预测值:z = w1 * x1 + w2 * x2 + bz = w1 * x1_data + w2 * x2_data + b# 计算每个点的损失:Hinge lossyz = y * z # 预测值与真实标签的乘积loss = 1 - yz # hinge loss 为 1 - yz,当 yz > 1 时,损失为 0loss[loss < 0] = 0 # 如果损失小于 0,置为 0hinge_loss = np.mean(loss) # 计算平均损失(取所有数据点的损失均值)loss_values = np.append(loss_values, hinge_loss) # 保存当前步的损失值step_list = np.append(step_list, n) # 保存当前迭代步数# 初始化梯度gradient_w1 = 0gradient_w2 = 0gradient_b = 0# 梯度下降法计算梯度for i in range(len(y)):if loss[i] > 0: # 仅考虑损失大于 0 的点gradient_w1 += -y[i] * x1_data[i]gradient_w2 += -y[i] * x2_data[i]gradient_b += -y[i]# 平均化梯度gradient_w1 /= len(y)gradient_w2 /= len(y)gradient_b /= len(y)# 更新超平面参数:w1, w2, bw1 -= learning_rate * gradient_w1w2 -= learning_rate * gradient_w2b -= learning_rate * gradient_b# 每 50 步或第一次迭代时,绘制一次更新图frequence_display = 50if n % frequence_display == 0 or n == 1:if np.abs(w2) < 1e-5: # 避免 w2 太小导致无法计算continue# 计算超平面的直线方程,用于绘制超平面x1_min, x1_max = 0, 6 # x1 的范围x2_min, x2_max = -(w1 * x1_min + b) / w2, -(w1 * x1_max + b) / w2 # x2 的值,基于超平面方程计算# 清除上一轮绘制的图像,绘制新的图ax1.clear()ax1.scatter(x1_data[:len(points)], x2_data[:len(points)], c='red', label='Class 1') # class1 红色ax1.scatter(x1_data[len(points):], x2_data[len(points):], c='blue', label='Class 2') # class2 蓝色ax1.plot([x1_min, x1_max], [x2_min, x2_max], 'r-') # 绘制超平面ax1.set_title(f"SVM: w1={round(w1.item(), 3)}, w2={round(w2.item(), 3)}, b={round(b.item(), 3)}")# 绘制损失函数的变化图ax2.clear()ax2.plot(step_list, loss_values, 'g-') # 损失图ax2.set_xlabel("Step")ax2.set_ylabel("Loss")# 每次绘图后暂停 1 秒,展示图像plt.pause(1)# 显示最终图形
plt.show()
自定义数据集 使用scikit-learn中svm的包实现svm分类
2025/2/5 20:27:02
来源:https://blog.csdn.net/qwe352/article/details/145440081
浏览:
次
关键词:自定义数据集 使用scikit-learn中svm的包实现svm分类
版权声明:
本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。
我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com
热文排行
最新新闻
- vscode script 中间的function import等关键字 先高亮,然后又灰了,并且按ctrl+/ 注释以html的形式,导致报错处理
- 【Redis】主从模式,哨兵,集群
- 迁移学习-详解
- 从零开始学习安时积分法(STM32实现程序)
- 第二篇:多模态技术突破——DeepSeek如何重构AI的感知与认知边界
- ordinaryroad-barrage-fly wsl部署记录
- 前端开发中的最新技术——CSS Container Queries: 自适应布局的新纪元
- 网络分层模型( OSI、TCP/IP、五层协议)
- Android 深入探究 JSONObject 与 JSONArray:Android 中的数据解析与数组操作全解析
- 新到手路由器宽带上网设置八步法
推荐新闻
- vscode script 中间的function import等关键字 先高亮,然后又灰了,并且按ctrl+/ 注释以html的形式,导致报错处理
- 【Redis】主从模式,哨兵,集群
- 迁移学习-详解
- 从零开始学习安时积分法(STM32实现程序)
- 第二篇:多模态技术突破——DeepSeek如何重构AI的感知与认知边界
- ordinaryroad-barrage-fly wsl部署记录
- 前端开发中的最新技术——CSS Container Queries: 自适应布局的新纪元
- 网络分层模型( OSI、TCP/IP、五层协议)
- Android 深入探究 JSONObject 与 JSONArray:Android 中的数据解析与数组操作全解析
- 新到手路由器宽带上网设置八步法