机器学习知识总结 —— 16.如何实现一个简单的SVM算法

news/2023/6/7 23:05:51

文章目录

  • 创建具有特征的二维数据
  • 实现SVM算法
    • 线性核函数
    • 梯度下降和损失函数
    • 训练
    • 实验效果
  • 总结

在前面的章节里,已经简要的介绍了SVM算法的工作原理,现在在这篇文章里,我们来看看SVM算法的一些简单实现。

创建具有特征的二维数据

一般来说,要实现SVM算法对数据的分类任务,我们需要数据至少具备二维的属性(properties)或者标签(attributes)。这里,我们使用numpy中可生成正态分布的随机数生成工具 np.random.normal 大致具体用法如下:

import numpy as np# 生成随机数据
np.random.seed(0)# 特征数据1
upper_x = np.random.normal(3, 1.5, (1000, 1))
upper_y = np.random.normal(3, 1.5, (1000, 1))# 特征数据2
lower_x = np.random.normal(-3, 1.5, (1000, 1))
lower_y = np.random.normal(-3, 1.5, (1000, 1))# 生成数据集
X = np.concatenate((upper_x, lower_x), axis=0)
y = np.concatenate((upper_y, lower_y), axis=0)

我们把数据PLOT出来看看这些数据生成后是什么样

在这里插入图片描述
这种样子可以看到大多数数据聚集在两个部分,少部分个别数据可能会有点重合而不是那么明显可以判断出它属于哪一类,这种形态的数据在我们日常数据分析中也是非常常见的一种样子。

实现SVM算法

Python可以使用 scikit-learn 这个库来做大量传统机器学习的任务,但是既然我的系列一直秉承知其然更要知其所以然,所以我们还是一如既往使用最基础的 numpy 工具库来实现我们所有的机器学习算法。

大致上来说,一个SVM算法,主要由以下几部分组成

线性核函数

def linear_kernel(x1, x2):return np.dot(x1, x2.T)

在前面介绍了SVM分类算法,其中最关键的不是使用什么曲线或者更复杂的方程来实现分类任务,而是十分干脆简单的在不同数据集中找到分类平面。因此对于二维数据,它的分类平面就是线性方程。

梯度下降和损失函数

# 梯度下降与损失函数
def svm_loss(W, X, y, C=1.0):n_samples, n_features = X.shapemargins = np.maximum(0, 1 - y * np.dot(X, W))loss = (np.sum(margins) + 0.5 * C * np.dot(W, W)) / n_samplesreturn lossdef svm_grad(W, X, y, C=1.0):n_samples, n_features = X.shapemargins = np.maximum(0, 1 - y * np.dot(X, W))grad = -(np.dot(X.T, y * (margins > 0))) / n_samples + C * Wreturn grad

这个对于我们非常重要,如果你看过我其他博文,就能知道在较为高等的算法中,为了找到数据最合适的解,我们一般会引入梯度下降算法。

训练

然后就是对实验数据的训练函数

def train(X, y, C=1.0, max_iter=1000, tol=1e-5):n_samples, n_features = X.shapeW = np.zeros((n_features,))for i in range(max_iter):loss = svm_loss(W, X, y, C)grad = svm_grad(W, X, y, C)W -= gradif np.linalg.norm(grad) < tol:breakreturn W

然后有了这些重要的组成部分后,我们可以来看看实验效果了

实验效果

首先依然生成一堆随机数据

# 预测
test_x = np.random.normal(0, 1, (100, 1))
test_y = np.random.normal(0, 1, (100, 1))

然后我们实现一个预测函数,其实主要是把上述数据与生成的模型进行乘积,然后结果用正负号进行区分

def predict(X, W):return np.sign(np.dot(X, W))pred = predict(test_x, W)

然后把结果绘制出来

# 可视化
import matplotlib.pyplot as plt
plt.scatter(test_x[pred == 1], test_y[pred == 1], c='red')
plt.scatter(test_x[pred == -1], test_y[pred == -1], c='green')
plt.show()

输出图像如下

在这里插入图片描述

还不错,大致上和我们希望的差不多。当然上述实现方法简单而粗糙,但对于深入理解SVM是怎么工作能有一定的帮助。

总结

此外,如果需要对不平衡的数据进行分类,那么可能需要使用更高级的方法来调整损失函数。例如,对于少数类别,可以使用不同的权重来调整损失函数。

如果需要对高维数据进行分类,那么可能需要使用核技巧来解决该问题。在这种情况下,可以使用高斯核函数代替线性核函数。

如果需要对大规模的数据进行分类,那么可能需要使用分布式计算来解决该问题。在这种情况下,可以使用类似于Apache Spark或Hadoop之类的工具来处理数据。

还有一些其他的因素需要考虑,例如模型的正则化,模型的结构等等,在实际应用中需要根据具体情况来调整参数和数据的处理方式。

此外,如果你希望使用更高级的优化算法来训练模型,例如拉格朗日乘数法或者共轭梯度法,也不是不可以,但是吧到这种情况自己实现起来特别复杂,所以最好还是直接使用工具库比较好点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4555198.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

计算机科学与微电子,毕业半年月收入专业排行榜,前五名都属于IT行业!

原标题&#xff1a;毕业半年月收入专业排行榜&#xff0c;前五名都属于IT行业&#xff01;最近&#xff0c;麦可思官网公布了2016届毕业半年后月收入较高的主要本科专业&#xff0c;(前50位)&#xff0c;这些专业大多属于IT&#xff0c;金融、工科类&#xff0c;月收入排行榜首…

IT类研究生入行最高25万 一年干两年活

网传IT类人才待遇高 记者调查发现除了人才缺口外 高工资下还有高压力 高薪背后是一年干了两年的活 转播到腾讯微博百度、阿里、腾讯、网易等大型互联网公司的入行工资&#xff0c;恐怕是大家最想知道的一个“秘密”。近日&#xff0c;这个秘密在互联网上被公开了。 北京邮电大学…

济南python工资一般多少-济南在线学Python

导语概要 济南Python开发培训选择哪家机构,小编在这里为您推荐济南中公优就业教育&#xff0c;济南中公优就业是知名教育培训品牌&#xff0c;名师执教、通俗易懂、深受广大学员欢迎。下面是小编整理的一些资料&#xff0c;济南在线学Python仅供参考。济南中公优就业 Python培训…

西安电子科技大学计算机考研本校多,这个省名校多,考研压力小,考研择校之陕西省!...

突然间他们说了这句话之后&#xff0c;想了想这一期到底是说山东省还是街是湖北省还是说陕西省的最后方&#xff0c;原来发现这三个省份的985和211大学都是要比河南省多地多的。心疼我大河南几分钟太难了&#xff0c;河南考研人们。那这样咱们就从西边开始来&#xff0c;先介绍…

pcl——VoxelGrid滤波器

点云入门第六章——入门使用VoxelGrid滤波器对点云进行下采样&#xff1a; 原理&#xff1a; pcl的VoxelGrid在输入点云数据上创建一个3D 体素网格&#xff08;将体素网格视为空间中的一组微小的 空间三维立方体的集合&#xff09;。然后&#xff0c;在每个体素&#xff08;即立…

将点云转化为voxel

将点云转化为voxel一般流程&#xff1a; 1、确定点云的范围 2、划分网格 3、将点云投影到网格 一个例子&#xff1a; https://github.com/hardyqr/PointcloudVoxelizer def __get_3D_matrix__(self, full_list, list_matrix, xyz_range, mag_coeff,_format):lx,ly,lz,hx,hy,hz …

【PCL】VoxelGrid滤波器下采样

VoxelGrid滤波器是用体素化网格方法实现下采样的一种常用滤波方法&#xff0c;这里重点学习。 下采样是在保持点云形状的同时减少点云中点的数量&#xff1b;VoxelGrid是通过创建三维体素栅格&#xff0c;用每个体素中所有点的重心来近似表示体素中的其他点&#xff0c;来实现…

PCL voxelgrid实现

体素滤波器可以达到向下采样同时不破坏点云本身几何结构的功能&#xff0c;但是会移动点的位置。 此外体素滤波器可以去除一定程度的噪音点及离群点。主要功能是用来进行降采样。 &#xff08;1&#xff09;它的原理是根据输入的点云&#xff0c;首先计算一个能够刚好包裹住该…