关于tensorflow:支持向量机

反对向量机(SVM)是一种将按监督学习的形式对数据进行二元分类的线性分类器。其决策边界是对学习样本求解的最大超平面。 SVM根本型式反对向量机的根本思维就是,在样本空间中找到一个线性可分的直线或是超平面(n维欧式空间中其余维度等于1的线性子空间,即必须是n-1维度,是二维空间中直线、三维空间中立体的延长),将不同类别的样本离开。 在数学上,认为在样本空间中,对不同类别的样本进行离开的直线或是超平面的方程为: 例如下图,实线将'+'和'-'进行分类: 对于样本空间中的任意一点到超平面的间隔为: 反对向量机的根本型式就是找到满足条件的、且具备最大间距的划分超平面。 SVM的核函数之前探讨的是原始样本线性可分的状况,然而理论状况是,一些工作的原始样本并不一定存在一种能正确分为两类的超平面。 然而对于这种非线性的状况,SVM思考应用将原始样本映射到更高维的空间,而后在高维空间中结构出最优超平面,从而解决原始线性空间不可分的问题。 如下图,右边在二维立体上并不能进行线性分类,然而将映射到左边的三维空间上,求解出一个拆散超平面: 数学上的示意为: 拟合线性回归应用svm形式,就是拟合的直线使得其SVM的最大间距可能尽可能多的蕴含已知点,且咱们认为被蕴含的已知点的损失为0。 应用Tensorflow进行编程的次要步骤次要分为四步: 1.生成训练数据 对于训练数据,通过模仿生成: 2.定义训练模型 在SVM模型中,咱们抉择间距最小的损失函数: curry_y = x * a + bepsilon = tf.constant([0.25]) # 创立常量,示意间距为0.25loss = tf.reduce_sum(tf.maximum(0, tf.subtract(tf.abs(tf.subtract(curr_y, y)), epsilon)))其中,reduce_sum()为求和函数;maximum(x, y, name=None)为计算元素x,y中的最大值;subtract(x, y, name=None)计算x-y;abs(x)计算x的绝对值。 3.数据训练 4.运行总结 随着训练的进行,拟合的值与指标一直靠近: 将拟定的间距宽度值调小,再次进行训练。能够看到,将间距调小后,拟合直线的误差更小。 拟合逻辑回归对于拟合线性回归,咱们须要找到一条直线来示意样本的大抵散布;而对于逻辑回归,同样是须要找到一条直线,但目标是将样本点进行分类。 SVM算法的提出,次要是为了解决‘是’与‘否’这样的二值分类的问题。 进行拟合逻辑回归次要须要以下几步: 1.筹备样本数据2.定义训练模型3.训练样本数据4.抉择优化器在SVM模型中,选取的损失函数为: classification_term = tf.reduce_mean(tf.maximum(0., tf.subtract(1., tf.multiply(y, y_))))cross_entropy = tf.add(classification_term, tf.multiply(alpha, 12_norm))

March 15, 2021 · 1 min · jiezi

一个简单的案例带你了解支持向量机算法Python代码

介绍掌握机器学习算法并不是一个不可能完成的事情。大多数的初学者都是从学习回归开始的。是因为回归易于学习和使用,但这能够解决我们全部的问题吗?当然不行!因为,你要学习的机器学习算法不仅仅只有回归! 把机器学习算法想象成一个装有斧头,剑,刀,弓箭,匕首等等武器的军械库。你有各种各样的工具,但你应该学会在正确的时间和场合使用它们。作为一个类比,我们可以将“回归”想象成一把能够有效切割数据的剑,但它无法处理高度复杂的数据。相反,“支持向量机”就像一把锋利的刀—它适用于较小的数据集,但它可以再这些小的数据集上面构建更加强大的模型。 现在,我希望你现在已经掌握了随机森林,朴素贝叶斯算法和模型融合的算法基础。如果没有,我希望你先抽出一部分时间来了解一下他们,因为在本文中,我将指导你了解认识机器学习算法中关键的高级算法,也就是支持向量机的基础知识。 如果你是初学者,并且希望开始你的数据科学之旅,那么我希望你先去了解一些基础的机器学习算法, 支持向量机相对来说对于数据科学的初学者来讲的确有一点难了。 0.什么是分类分析让我们用一个例子来理解这个概念。假如我们的人口是按照50%-50%分布的男性和女性。那么使用这个群体的样本,就需要创建一些规则,这些规则将指导我们将其他人的性别进行分类。如果使用这种算法,我们打算建立一个机器人,可以识别一个人是男性还是女性。这是分类分析的样本问题。我们将尝试使用一些规则来划分性别之间的不同。为简单起见,我们假设使用的两个区别因素是:个体的身高和头发长度。以下是样本的散点图。 图中的蓝色圆圈表示女性,绿色方块表示男性。图中的一些预期见解是: 我们人口中的男性的平均身高较高。 我们人口中的女性的头发较长。 如果我们看到一个身高180厘米,头发长度为4厘米的人,我们最好的分类是将这个人归类为男性。这就是我们进行分类分析的方法。 1.什么是支持向量机“支持向量机”(SVM)是一种有监督的机器学习算法,可用于分类任务或回归任务。但是,它主要适用于分类问题。在这个算法中,我们将每个数据项绘制为n维空间中的一个点(其中n是你拥有的是特征的数量),每个特征的值是特定坐标的值。然后,我们通过找到很好地区分这两个类的超平面来执行分类的任务(请看下面的演示图片)。 支持向量只是个体观测的坐标。支持向量机是一个最好地隔离两个类(超平面或者说分类线)的前沿算法。 在我第一次听到“支持向量机”这个名字,我觉得这个名字听起来好复杂,如果连名字都这么复杂的话,那么这个名字的概念将超出我的理解。幸运的是,在我看了一些大学的讲座视频,才意识到这个算法其实也没有那么复杂。接下来,我们将讨论支持向量机如何工作。我们将详细探讨该技术,并分析这些技术为什么比其他技术更强。 2.它是如何工作的?上面,我们已经习惯了用超平面来隔离两种类别的过程,但是现在最迫切的问题是“我们如何识别正确的超平面?”。关于这个问题不用急躁,因为它并不像你想象的那么难! 让我们一个个的来理解如何识别正确的超平面: 选择正确的超平面(场景1):这里,我们有三个超平面(A、B、C)。现在,让我们用正确的超平面对星形和圆形进行分类。 你需要记住一个经验的法则来识别正确的超平面:“选择更好的可以隔离两个类别的超平面”。在这种情况下,超平面“B”就非常完美的完成了这项工作。 选择正确的超平面(场景2):在这里,我们有三个超平面(A,B,C),并且所有这些超平面都很好地隔离了类。现在,我们如何选择正确的超平面? 在这里,在这里,将最近的数据点(任一类)和超平面之间的距离最大化将有助于我们选择正确的超平面。该距离称为边距。让我们看一下下面的图片: 上面,你可以看到超平面C的边距与A和B相比都很高。因此,我们将正确的超平面选择为C。选择边距较高的超平面的另一个决定性因素是稳健性。如果我们选择一个低边距的超平面,那么很有可能进行错误分类。 选择正确的超平面(场景3):提示: 使用我们前面讨论的规则来选择正确的超平面 你们中的一些人可能选择了超平面B,因为它与A相比具有更高的边距。但是SVM选择超平面是需要在最大化边距之前准确地对类别进行分类。这里,超平面B有一个分类的错误,而且A进行了正确的分类。因此,正确的超平面应该是A. 我们可以对这个两个类进行分类吗?(场景4):下面这张图片中,我们无法使用直线来分隔这两个类,因为其中一个星星位于圆形类别的区域中作为一个异常值。 正如我刚刚已经提到的,另一端的那一颗星星就像是一个异常值。SVM具有忽略异常值并找到具有最大边距的超平面的功能。因此,我们可以说,SVM对异常值有很强的稳健性 找到一个超平面用来隔离两个类别(场景5):在下面的场景中,我们不能在两个类之间有线性的超平面,那么SVM如何对这两个类进行分类?到目前为止,我们只研究过线性超平面。 SVM可以解决这个问题。并且是轻松就可以做到!它通过引入额外的特征来解决这个问题。在这里,我们将添加一个新特征 现在,让我们绘制轴x和z上的数据点: 在上图中,要考虑的问题是: z的所有值都是正的,因为z是x和y的平方和在原图中,红色圆圈出现在靠近x和y轴原点的位置,导致z值比较低。星形相对远离原点,导致z值较高。在SVM中,很容易就可以在这两个类之间建立线性超平面。但是,另一个需要解决的问题是,我们是否需要手动添加一个特征以获得超平面。不,并不需要这么做,SVM有一种称为核技巧的技术。这些函数把低维度的输入空间转换为更高维度的空间,也就是它将不可分离的问题转换为可分离的问题,这些函数称为内核函数。它主要用于非线性的分离问题。简而言之,它执行一些非常复杂的数据转换,然后根据你定义的标签或输出找出分离数据的过程。 当SVM找到一条合适的超平面之后,我们在原始输入空间中查看超平面时,它看起来像一个圆圈: 现在,让我们看看在数据科学中应用SVM算法的方法。 3.如何在Python中实现SVM?在Python中,scikit-learn是一个广泛使用的用于实现机器学习算法的库,SVM也可在scikit-learn库中使用并且遵循相同的结构(导入库,创建对象,拟合模型和预测)。我们来看下面的代码: 导入库from sklearn import svm 假设您有用于训练数据集的X(特征数据)和Y(目标),以及测试数据的x_test(特征数据)创建SVM分类对象model = svm.svc(kernel='linear', c=1, gamma=1)  与之相关的选项有很多,比如更改kernel值(内核)、gamma值和C值。下一节将对此进行更多讨论。使用训练集训练模型,并检查成绩model.fit(X, y)model.score(X, y) 预测输出predicted= model.predict(x_test) 4.如何调整SVM的参数?对机器学习算法进行调整参数值可以有效地提高模型的性能。让我们看一下SVM可用的参数列表。 sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma=0.0, coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, random_state=None) 下面将讨论一些对模型性能影响较大的重要参数,如“kernel”,“gamma”和“C”。 kernel:我们之间已经简单的讨论过了。在算法参数中,我们可以为kernel值提供各种内核选项,如“linear”,“rbf”,“poly”等(默认值为“rbf”)。其中“rbf”和“poly”对于找到非线性超平面是很有用的。让我们看一下这个例子,我们使用线性内核函数对iris数据集中的两个特性进行分类。 ...

June 27, 2019 · 1 min · jiezi

25道题检测你对支持向量机算法的掌握程度

介绍在我们学习机器算法的时候,可以将机器学习算法视为包含刀枪剑戟斧钺钩叉的一个军械库。你可以使用各种各样的兵器,但你要明白这些兵器是需要在合适的时间合理的地点使用它们。作为类比,你可以将“回归算法”想象成能够有效切割数据的剑,但无法处理高度复杂的数据。相反的是,“支持向量机(SVM)”就像一把锋利的刀,它比较适用于较小的数据集,但在较小的数据集上面,它可以构建更加强大的模型。 相信在你学习机器学习算法解决分类问题的时候,肯定听说过支持向量机(SVM),在过去的五十年中SVM在随着时间进行演化,并且在分类之外也得到了应用,比如回归、离散值分析、排序。我相信你在不同的途径中肯定也接触过支持向量机,是不是觉得已经对这个东西有些头痛,认为很多人都会,但是自己好像怎么都不能明白过来它的原理,或者说你已经对自己有关支持向量机的知识已经很有自信了,那么现在你来对地方了,这份技能测试就是专门测试你对于支持向量机的掌握程度已经是否可以应用。这份测试已经有超过550多人参加了,最后我会放出这些人的分数的分布情况,从而方便你对比一下自己的支持向量机的水平程度。 技能测试问题(每题1分)问题背景:1-2 假设你使用的是一个线性SVM分类器,是用来解决存在的2分类问题。现在你已经获得了以下数据,其中一些点用红色圈起来表示支持向量。 1)如果从数据中删除以下任何一个红点。决策边界会改变吗? A)YES B)NO 2)[是或否]如果从数据中删除非红色圆圈点,决策边界会发生变化吗? A)真 B)假 3)有关于支持向量机的泛化误差是什么意思? A)超平面与支持向量的距离 B)支持向量机对未知数据的预测精度如何 C)支持向量机中的阈值误差量 4)当C参数设置为无穷大时,以下哪项成立? A)如果存在最优的超平面,那么则会是完全可以分类数据 B)软边际分类器将分离数据 C)以上都不是 5)硬边缘是什么意思? A)SVM允许分类中的误差很小 B)SVM允许分类中的误差很大 C)以上都不是 6)训练支持向量机的最小时间复杂度是O(n2)。根据这一事实,什么尺寸的数据集不是最适合SVM的? A)大型数据集 B)小型数据集 C)中型数据集 D)大小无关紧要 7)支持向量机的有效性取决于: A)内核的选择 B)内核的参数 C)软边距的参数C D)以上所有 8)支持向量是最接近决策边界的数据点。 A)是 B)否 9)支持向量机在以下什么情况中的效果最差: A)数据是线性可分的 B)数据干净并且可以使用 C)数据有噪音且包含重叠点 10)假设在支持向量机中使用高Gamma值并且使用RBF内核。这意味着什么? A)模型考虑甚至远离超平面的点进行建模 B)模型只考虑超平面附近的点进行建模 C)模型不会受到点距离超平面的影响并进行建模 D)没有以上 11)支持向量机中的代价参数表示: A)要进行的交叉验证的数量 B)要使用的内核 C)模型的分类错误和简单性之间的权衡 D)以上都不是 12) 假设你正在基于数据X进行构建支持向量机模型。数据X可能容易出错,这意味着你不应该过多地信任任何特定的数据点。假如现在你想建立一个支持向量机模型,它的二次核函数为2次多项式,它使用松弛变量C作为它的超参数之一。基于此,请给出以下问题的答案。 当你使用非常大的C值(C->无穷大)时会发生什么? 注意:对于小C,也可以正确地对所有数据点进行分类 A)对于给定的超参数C,我们仍然可以正确的对数据进行分类 B)对于给定的超参数C,我们不能对数据进行正确的分类 C)不好说 D)以上都不是 13)当使用非常小的C值(C~0)会发生什么? A)将会发生分类错误 B)数据将被正确的分类 C)不好说 D)以上都不是 14)如果我正在使用我的数据集的所有特征,并且我在训练集上达到100%的准确率,但在验证集上却只达到约70%,我应该注意什么? A)欠拟合 B)没什么注意的,模型是非常完美的 C)过度拟合 ...

June 26, 2019 · 1 min · jiezi

机器学习项目之实现垃圾邮件处理1数据清洗

学习了支持向量机算法后(SVM)想自己用一些数据集来尝试一下,在网络上找了一个垃圾邮件处理的数据集正好适用于SVM支持向量算法,所以在这里不讲SVM算法内容,而是分享我是如何用Python来实现的。具体数据集:[邮件数据集][1][1]: https://pan.baidu.com/s/1ivQmo-04fCa3qVG0SAiUtQ1. 首先查看数据集 邮件中有很多中特征值,有些是有用的有些却无法帮助我们判断是否是垃圾邮件,所以这里我们选取其中4个特征值(From,To,Data,Content)。(1、邮件的内容分析——主要包含:发件人、收件人、发件时间以及邮件的内容)![分类][3](2、是否为垃圾邮件的标签,spam——是垃圾邮件;ham——不是垃圾邮件)2. 分析数据集分析:垃圾邮件处理问题是一个**监督学习**,仅用来分类邮件好坏固为**二分类**问题,分类内容为**长文本**。所有非向量形式的特征工程,首先要转换成向量的形式该数据集适合很多种模型(贝叶斯,KNN),在这里我用SVM来解决3. 开始进行数据清洗的工作引入模块常用功能 import os索引文件(分类标签)读取,该文件中分为两列第一列:分类标签是否为垃圾邮件(是:spam、否:ham);第二列:存放邮件对应文件夹路径,两列之间通过空格分割 def read_index_file(file_path): type_dict={"spam":"1","ham":"0"} #用字典存放分类的垃圾邮件(0/1) index_file=open(file_path) index_dict={} #存储分类后得到的结构字典 try: for line in index_file: #按照行来读取 arr=line.split(" ") #从每行的第一个空格分开 if len(arr) == 2: key,value = arr #将key和value分别赋值前后两段 #将value中的数据规整,将../data去掉 value=value.replace("../data","").replace("\n","") #将每一个值是1/0对应加入数据字典中 index_dict[value]=type_dict[key.lower()] #将spam/ham中可能出现的大写字母换成小写 finally: index_file.close() return index_dict 邮件的文件内容数据读取 def read_file(file_path): #打开邮件只读r,编码方式gb2312,错误忽略 file=open(file_path,"r",encoding="gb2312",errors="ignore") content_dict={} try: is_content = False for line in file: #按行读取 line = line.strip() #去掉每行的空格 if line.startswith("From:"): #将From:后的内容加入数据字典,将key="from:",value=line[5:]5以后的内容 content_dict["from:"]=line[5:] elif line.startswith("To:"): content_dict["to:"]=line[3:] elif line.startswith("Date:"): content_dict["date:"]=line[5:] elif not line: # 邮件内容与上面信息存在着第一个空行,遇到空行时,这里标记为True以便进行下面的邮件内容处理 # line文件的行为空时是False,不为空时是True is_content = True #如果这一行是空行表明下一行开始是具体的内容(content),则开始处理邮件 if is_content: if "content" in content_dict: #如果这一行有内容则加入字典 content_dict["content"] += line else: #如果这一行没有内容则不加入,继续下一行 content_dict["content"] = line finally: file.close() return content_dict3、邮件数据处理(内容的拼接,并用逗号进行分割) ...

June 11, 2019 · 2 min · jiezi