【原文:http://www.cnblogs.com/justany/archive/2012/11/23/2784125.html】 分类器 分类器是一种计算机程序。 他的设计目标是在通过学习后,可自动将数据分到已知类别。 平面线性分类器 一个简单的分类问题,如图有一些圆圈和一些正方形,如何找一条最优的
【原文:http://www.cnblogs.com/justany/archive/2012/11/23/2784125.html】
分类器
分类器是一种计算机程序。
他的设计目标是在通过学习后,可自动将数据分到已知类别。
平面线性分类器
一个简单的分类问题,如图有一些圆圈和一些正方形,如何找一条最优的直线将他们分开?
我们可以找到很多种方法画出这条直线,但怎样的直线才是最优的呢?
距离样本太近的直线不是最优的,因为这样的直线对噪声敏感度高,泛化性较差。 因此我们的目标是找到一条直线,离最近的点距离最远。
怎么寻找距离最远的直线?枚举所有直线,然后计算其样本最小距离?这样显然不是一个好办法,这将产生大量的计算开销。
我们利用另一种方法,对直线的正负偏移量1,这样就产生了一个区域(下图的Maximum margin覆盖的区域),区域边界上的点到直线的距离是固定的,现在的问题是最近的点是否刚好在边界上或者在边界外。
还记得点到线的公式么?
对于直线Ax+By+C=0,点(x0, y0)到直线的距离:
distance = |Ax0+By0+C| / (A2 + B2)1/2
那么区域边缘到直线的距离:
distance = (|Ax+By+C| + 1)/ (A2 + B2)1/2 = 1/ (A2 + B2)1/2。
并需要满足对于所有样本类别yi 满足:yi (Ax+By+C) > = 1,也就是所有样本都不在该区域以内。
于是我们可以找到适当的A、B、C,从而得到:
Maximum margin = 2/ (A2 + B2)1/2。
超平面推广
同理,我们将这一定理推广到任意维度。其超平面表达式为:
一维是线、二维是面、三维是体……四维呢?五维呢?好吧统称超平面吧……
其中 叫做 权重向量 ,
叫做 偏置向量。
用这种表达式来表达线Ax+By+C = 0的话,可以这么表示:
f(x) = (C, 0) + (A, B)T (x, y);
其中(C, 0) 是偏置向量 ,(A, B)是权重向量
。
由于最优超平面可以有很多种表达方式,我们定义:
β0 + βTx = 0,
为最优超平面表达式。于是我们可以得到他的Maximum margin区域边界表达式应该为:
我们称在这边界上的点为:支持向量(Supper Vector)。
因为点到超平面距离公式为:
在边界上,即支持向量到超平面距离:
所以Maximum margin为两倍距离,即:
将M求倒数1/M 则可将求最大转换成求最小。于是有:
其中 表示样本的类别标记。
这是一个拉格朗日优化问题,可以通过拉格朗日乘数法得到最优超平面的权重向量 和偏置
。
什么是SVM
支持向量机 (SVM) 是一个类分类器,正式的定义是一个能够将不同类样本在样本空间分隔的超平面。 换句话说,给定一些标记好的训练样本 (监督式学习),SVM算法输出一个最优化的分隔超平面。
1995年Cortes和Vapnik于首先提出SVM,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。
使用SVM
#include <opencv2><span> #include </span><opencv2><span> #include </span><opencv2> <span>using</span> <span>namespace</span><span> cv; </span><span>int</span><span> main() { </span><span>//</span><span> 用于保存可视化数据的矩阵</span> <span>int</span> width = <span>512</span>, height = <span>512</span><span>; Mat image </span>=<span> Mat::zeros(height, width, CV_8UC3); </span><span>//</span><span> 创建一些训练样本</span> <span>float</span> labels[<span>4</span>] = {<span>1.0</span>, -<span>1.0</span>, -<span>1.0</span>, -<span>1.0</span><span>}; Mat labelsMat(</span><span>3</span>, <span>1</span><span>, CV_32FC1, labels); </span><span>float</span> trainingData[<span>4</span>][<span>2</span>] = { {<span>501</span>, <span>10</span>}, {<span>255</span>, <span>10</span>}, {<span>501</span>, <span>255</span>}, {<span>10</span>, <span>501</span><span>} }; Mat trainingDataMat(</span><span>3</span>, <span>2</span><span>, CV_32FC1, trainingData); </span><span>//</span><span> 设置SVM参数</span> CvSVMParams <span>params</span><span>; </span><span>params</span>.svm_type =<span> CvSVM::C_SVC; </span><span>params</span>.kernel_type =<span> CvSVM::LINEAR; </span><span>params</span>.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, <span>100</span>, 1e-<span>6</span><span>); </span><span>//</span><span> 对SVM进行训练</span> <span> CvSVM SVM; SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), </span><span>params</span><span>); Vec3b green(</span><span>0</span>,<span>255</span>,<span>0</span>), blue (<span>255</span>,<span>0</span>,<span>0</span><span>); </span><span>//</span><span> 将SVM断定的分划区域绘制出来</span> <span>for</span> (<span>int</span> i = <span>0</span>; i i) <span>for</span> (<span>int</span> j = <span>0</span>; j j) { Mat sampleMat = (Mat_float>(<span>1</span>,<span>2</span>) i,j); <span>float</span> response =<span> SVM.predict(sampleMat); </span><span>if</span> (response == <span>1</span><span>) image.at</span><vec3b>(j, i) =<span> green; </span><span>else</span> <span>if</span> (response == -<span>1</span><span>) image.at</span><vec3b>(j, i) =<span> blue; } </span><span>//</span><span> 绘制训练数据点</span> <span>int</span> thickness = -<span>1</span><span>; </span><span>int</span> lineType = <span>8</span><span>; circle( image, Point(</span><span>501</span>, <span>10</span>), <span>5</span>, Scalar( <span>0</span>, <span>0</span>, <span>0</span><span>), thickness, lineType); circle( image, Point(</span><span>255</span>, <span>10</span>), <span>5</span>, Scalar(<span>255</span>, <span>255</span>, <span>255</span><span>), thickness, lineType); circle( image, Point(</span><span>501</span>, <span>255</span>), <span>5</span>, Scalar(<span>255</span>, <span>255</span>, <span>255</span><span>), thickness, lineType); circle( image, Point( </span><span>10</span>, <span>501</span>), <span>5</span>, Scalar(<span>255</span>, <span>255</span>, <span>255</span><span>), thickness, lineType); </span><span>//</span><span> 绘制支持向量</span> thickness = <span>2</span><span>; lineType </span>= <span>8</span><span>; </span><span>int</span> c =<span> SVM.get_support_vector_count(); </span><span>for</span> (<span>int</span> i = <span>0</span>; i i) { <span>const</span> <span>float</span>* v =<span> SVM.get_support_vector(i); circle( image, Point( (</span><span>int</span>) v[<span>0</span>], (<span>int</span>) v[<span>1</span>]), <span>6</span>, Scalar(<span>128</span>, <span>128</span>, <span>128</span><span>), thickness, lineType); } imwrite(</span><span>"</span><span>result.png</span><span>"</span>, image); <span> imshow(</span><span>"简单SVM分类</span><span>"</span>, image); waitKey(<span>0</span><span>); }</span></vec3b></vec3b></opencv2></opencv2></opencv2>
建立训练样本
这里通过Mat构造函数,建立了一个简单的训练样本。
<span>//</span> <span>float</span> labels[<span>4</span>] = {<span>1.0</span>, -<span>1.0</span>, -<span>1.0</span>, -<span>1.0</span><span>}; Mat labelsMat(</span><span>3</span>, <span>1</span><span>, CV_32FC1, labels); </span><span>//</span><span>建立一个训练样本矩阵</span> <span>float</span> trainingData[<span>4</span>][<span>2</span>] = { {<span>501</span>, <span>10</span>}, {<span>255</span>, <span>10</span>}, {<span>501</span>, <span>255</span>}, {<span>10</span>, <span>501</span><span>} }; Mat trainingDataMat(</span><span>3</span>, <span>2</span>, CV_32FC1, trainingData);
由于CvSVM::train 要求样本数据存储在float 类型的Mat中,所以建立了float类型的Mat样本。
设置SVM参数
struct CvSVMParams
SVM 训练参数结构。
该结构必须被初始化后,传给CvSVM。
CvSVMParams::CvSVMParams
构造函数
- C++: CvSVMParams::CvSVMParams()
- C++: CvSVMParams::CvSVMParams(int svm_type, int kernel_type, double degree, double gamma, double coef0, double Cvalue, double nu, double p, CvMat* class_weights, CvTermCriteria term_crit)
参数
- svm_type –
指定SVM的类型,下面是可能的取值:
- CvSVM::C_SVC C类支持向量分类机。 n类分组 (n
2),允许用异常值惩罚因子C进行不完全分类。
- CvSVM::NU_SVC
类支持向量分类机。n类似然不完全分类的分类器。参数为
取代C(其值在区间【0,1】中,nu越大,决策边界越平滑)。
- CvSVM::ONE_CLASS 单分类器,所有的训练数据提取自同一个类里,然后SVM建立了一个分界线以分割该类在特征空间中所占区域和其它类在特征空间中所占区域。
- CvSVM::EPS_SVR
类支持向量回归机。训练集中的特征向量和拟合出来的超平面的距离需要小于p。异常值惩罚因子C被采用。
- CvSVM::NU_SVR
类支持向量回归机。
代替了 p。
可从 [LibSVM] 获取更多细节。
- kernel_type –
SVM的内核类型,下面是可能的取值:
- CvSVM::LINEAR 线性内核。没有任何向映射至高维空间,线性区分(或回归)在原始特征空间中被完成,这是最快的选择。
.
- CvSVM::POLY 多项式内核:
.
- CvSVM::RBF 基于径向的函数,对于大多数情况都是一个较好的选择:
.
- CvSVM::SIGMOID Sigmoid函数内核:
.
- degree – 内核函数(POLY)的参数degree。
- gamma – 内核函数(POLY/ RBF/ SIGMOID)的参数
。
- coef0 – 内核函数(POLY/ SIGMOID)的参数coef0。
- Cvalue – SVM类型(C_SVC/ EPS_SVR/ NU_SVR)的参数C。
- nu – SVM类型(NU_SVC/ ONE_CLASS/ NU_SVR)的参数
。
- p – SVM类型(EPS_SVR)的参数
。
- class_weights – C_SVC中的可选权重,赋给指定的类,乘以C以后变成
。所以这些权重影响不同类别的错误分类惩罚项。权重越大,某一类别的误分类数据的惩罚项就越大。
- term_crit – SVM的迭代训练过程的中止条件,解决部分受约束二次最优问题。您可以指定的公差和/或最大迭代次数。
默认的构造函数初始化有以下值:
<span>CvSVMParams::CvSVMParams() : svm_type(CvSVM::C_SVC), kernel_type(CvSVM::RBF), degree(</span><span>0</span><span>), gamma(</span><span>1</span>), coef0(<span>0</span>), C(<span>1</span>), nu(<span>0</span>), p(<span>0</span>), class_weights(<span>0</span><span>) { term_crit </span>= cvTermCriteria( CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, <span>1000</span><span>, FLT_EPSILON ); }</span>
OpenCV的SVM
class CvSVM
向量支持机
CvSVM::CvSVM
训练构造函数。
- C++: CvSVM::CvSVM()
- C++: CvSVM::CvSVM(const Mat& trainData, const Mat& responses, const Mat& varIdx=Mat(), const Mat& sampleIdx=Mat(), CvSVMParamsparams=CvSVMParams() )
- C++: CvSVM::CvSVM(const CvMat* trainData, const CvMat* responses, const CvMat* varIdx=0, const CvMat* sampleIdx=0, CvSVMParamsparams=CvSVMParams() )
参数
- trainData — 训练数据,必须是CV_32FC1 (32位浮点类型,单通道)。数据必须是CV_ROW_SAMPLE的,即特征向量以行来存储。
- responses — 响应数据,通常是1D向量存储在CV_32SC1 (仅仅用在分类问题上)或者CV_32FC1格式。
- varIdx — 指定感兴趣的特征。可以是整数(32sC1)向量,例如以0为开始的索引,或者8位(8uC1)的使用的特征或者样本的掩码。用户也可以传入NULL指针,用来表示训练中使用所有变量/样本。
- sampleIdx — 指定感兴趣的样本。描述同上。
- params — SVM参数。
CvSVM::train
训练一个SVM。
- C++: bool CvSVM::train(const Mat& trainData, const Mat& responses, const Mat& varIdx=Mat(), const Mat& sampleIdx=Mat(), CvSVMParamsparams=CvSVMParams() )
- C++: bool CvSVM::train(const CvMat* trainData, const CvMat* responses, const CvMat* varIdx=0, const CvMat* sampleIdx=0, CvSVMParamsparams=CvSVMParams() )
参数参考构造函数。
CvSVM::train_auto
根据可选参数训练一个SVM。
- C++: bool CvSVM::train_auto(const Mat& trainData, const Mat& responses, const Mat& varIdx, const Mat& sampleIdx, CvSVMParamsparams, int k_fold=10, CvParamGrid Cgrid=CvSVM::get_default_grid(CvSVM::C), CvParamGridgammaGrid=CvSVM::get_default_grid(CvSVM::GAMMA), CvParamGrid pGrid=CvSVM::get_default_grid(CvSVM::P), CvParamGridnuGrid=CvSVM::get_default_grid(CvSVM::NU), CvParamGrid coeffGrid=CvSVM::get_default_grid(CvSVM::COEF), CvParamGriddegreeGrid=CvSVM::get_default_grid(CvSVM::DEGREE), bool balanced=false)
- C++: bool CvSVM::train_auto(const CvMat* trainData, const CvMat* responses, const CvMat* varIdx, const CvMat* sampleIdx, CvSVMParams params, int kfold=10, CvParamGrid Cgrid=get_default_grid(CvSVM::C), CvParamGrid gammaGrid=get_default_grid(CvSVM::GAMMA), CvParamGrid pGrid=get_default_grid(CvSVM::P), CvParamGrid nuGrid=get_default_grid(CvSVM::NU), CvParamGridcoeffGrid=get_default_grid(CvSVM::COEF), CvParamGrid degreeGrid=get_default_grid(CvSVM::DEGREE), bool balanced=false )
参数
- k_fold – 交叉验证参数。训练集被分成k_fold的自子集。其中一个子集是用来测试模型,其他子集则成为训练集。所以,SVM算法复杂度是执行k_fold的次数。
- *Grid – 对应的SVM迭代网格参数。
- balanced – 如果是true则这是一个2类分类问题。这将会创建更多的平衡交叉验证子集。
这个方法根据CvSVMParams中的最佳参数C, gamma, p, nu, coef0, degree自动训练SVM模型。参数被认为是最佳的交叉验证,其测试集预估错误最小。
如果没有需要优化的参数,相应的网格步骤应该被设置为小于或等于1的值。例如,为了避免gamma的优化,设置gamma_grid.step = 0,gamma_grid.min_val, gamma_grid.max_val 为任意数值。所以params.gamma 由gamma得出。
最后,如果参数优化是必需的,但是相应的网格却不确定,你可能需要调用函数CvSVM::get_default_grid(),创建一个网格。例如,对于gamma,调用CvSVM::get_default_grid(CvSVM::GAMMA)。
该函数为分类运行 (params.svm_type=CvSVM::C_SVC 或者 params.svm_type=CvSVM::NU_SVC) 和为回归运行 (params.svm_type=CvSVM::EPS_SVR 或者 params.svm_type=CvSVM::NU_SVR)效果一样好。如果params.svm_type=CvSVM::ONE_CLASS,没有优化,并指定执行一般的SVM。
CvSVM::predict
预测样本的相应数据。
- C++: float CvSVM::predict(const Mat& sample, bool returnDFVal=false ) const
- C++: float CvSVM::predict(const CvMat* sample, bool returnDFVal=false ) const
- C++: float CvSVM::predict(const CvMat* samples, CvMat* results) const
参数
- sample – 需要预测的输入样本。
- samples – 需要预测的输入样本们。
- returnDFVal – 指定返回值类型。如果值是true,则是一个2类分类问题,该方法返回的决策函数值是边缘的符号距离。
- results – 相应的样本输出预测的响应。
这个函数用来预测一个新样本的响应数据(response)。在分类问题中,这个函数返回类别编号;在回归问题中,返回函数值。输入的样本必须与传给trainData的训练样本同样大小。如果训练中使用了varIdx参数,一定记住在predict函数中使用跟训练特征一致的特征。
后缀const是说预测不会影响模型的内部状态,所以这个函数可以很安全地从不同的线程调用。
CvSVM::get_default_grid
生成一个SVM网格参数。
- C++: CvParamGrid CvSVM::get_default_grid(int param_id)
参数
- param_id –
SVM参数的IDs必须是下列中的一个:
- CvSVM::C
- CvSVM::GAMMA
- CvSVM::P
- CvSVM::NU
- CvSVM::COEF
- CvSVM::DEGREE
网格参数将根据这个ID生成。
CvSVM::get_params
返回当前SVM的参数。
- C++: CvSVMParams CvSVM::get_params() const
这个函数主要是在使用CvSVM::train_auto()时去获得最佳参数。
CvSVM::get_support_vector
检索一定数量的支持向量和特定的向量。
- C++: int CvSVM::get_support_vector_count() const
- C++: const float* CvSVM::get_support_vector(int i) const
参数 i – 指定支持向量的索引。 该方法可以用于检索一组支持向量。
CvSVM::get_var_count
返回变量的个数。
- C++: int CvSVM::get_var_count() const
分割结果
- 程序创建了一张图像,在其中显示了训练样本,其中一个类显示为白色圆圈,另一个类显示为黑色圆圈。
- 训练得到SVM,并将图像的每一个像素分类。 分类的结果将图像分为蓝绿两部分,中间线就是最优分割超平面。
- 最后支持向量通过灰色边框加重显示。
OpenCV的SVM是基于台湾大学林智仁开发的LIBSVM开发包的。如果你还不过瘾可以看看下面林智仁的演示程序(需要JAVA支持):
http://www.csie.ntu.edu.tw/~cjlin/libsvm/
在这个实验中,我们成功让机器找到了区分样品的线性划分,并将其支持向量显示出来。
被山寨的原文
Introduction to Support Vector Machines . OpenCV.org
Support Vector Machines API . OpenCV.org

PHP5.4版本新功能:如何使用callable类型提示参数接受可调用的函数或方法引言:PHP5.4版本引入了一项非常便利的新功能-可以使用callable类型提示参数来接受可调用的函数或方法。这个新功能使得函数和方法可以直接指定相应的可调用参数,而无需进行额外的检查和转换。在本文中,我们将介绍callable类型提示的使用方法,并提供一些代码示例,

Python中的支持向量机(SupportVectorMachine,SVM)是一个强大的有监督学习算法,可以用来解决分类和回归问题。SVM在处理高维度数据和非线性问题的时候表现出色,被广泛地应用于数据挖掘、图像分类、文本分类、生物信息学等领域。在本文中,我们将介绍在Python中使用SVM进行分类的实例。我们将使用scikit-learn库中的SVM模

产品参数是指产品属性的意思。比如服装参数有品牌、材质、型号、大小、风格、面料、适应人群和颜色等;食品参数有品牌、重量、材质、卫生许可证号、适应人群和颜色等;家电参数有品牌、尺寸、颜色、产地、适应电压、信号、接口和功率等。

双曲函数是使用双曲线而不是圆定义的,与普通三角函数相当。它从提供的弧度角返回双曲正弦函数中的比率参数。但要做相反的事,或者换句话说。如果我们想根据双曲正弦值计算角度,我们需要像双曲反正弦运算一样的反双曲三角运算。本课程将演示如何使用C++中的双曲反正弦(asinh)函数,使用双曲正弦值(以弧度为单位)计算角度。双曲反正弦运算遵循以下公式-$$\mathrm{sinh^{-1}x\:=\:In(x\:+\:\sqrt{x^2\:+\:1})},其中\:In\:是\:自然对数\:(log_e\:k)

在开发过程中,我们可能会遇到这样一个错误提示:PHPWarning:in_array()expectsparameter。这个错误提示会在使用in_array()函数时出现,有可能是因为函数的参数传递不正确所导致的。以下我们来看看这个错误提示的解决方法。首先,需要明确in_array()函数的作用:检查一个值是否在数组中存在。该函数的原型为:in_a

ML中的一个重要任务是模型选择,或者使用数据为给定任务找到最佳的模型或参数。这也称为调优。可以对单个的估计器(如LogisticRegression)进行调优,也可以对包括多种算法、特性化和其他步骤的整个pipeline进行调优。用户可以一次调优整个Pipeline,而不是分别调优 Pipeline 中的每个元素。ML中的一个重要任务是模型选择,或者使用数据为给定任务找到最佳的模型或参数。这也称为调优。可以对单个的Estimator(如LogisticRegression)进行调优,也

大型语言模型(LLM)虽然性能强劲,但动辄几百上千亿的参数量,对计算设备还是内存的需求量之大,都不是一般公司能承受得住的。量化(Quantization)是常见的压缩操作,通过降低模型权重的精度(如32bit降为8bit),牺牲一部分模型的性能来换取更快的推理速度,更少的内存需求。但对于超过1000亿参数量的LLM来说,现有的压缩方法都无法保持模型的准确率,也无法在硬件上高效地运行。最近,麻省理工学院和英伟达的研究人员联合提出了一个通用后训练的量化(GPQ, general-purpose po

必填参数缺失是指在进行某项操作或者调用某个函数时,必要的参数没有被提供或者没有被正确地传递。在编程中,函数通常会需要一些输入参数来完成特定的任务,必须在调用函数时被提供,如果这些必填参数没有被提供,系统就无法理解如何执行函数,因此会报错或者无法继续执行。必填参数缺失在编程中是一个常见的错误,解决这个问题的方法是检查调用函数的代码,确保所有必填参数都被正确地提供等等。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン
