精华内容
下载资源
问答
  • svm训练模型
    千次阅读
    2018-08-06 15:53:27

     pickle版本

    from sklearn import svm
    from sklearn.datasets import samples_generator
    from sklearn.feature_selection import SelectKBest, f_regression
    from sklearn.pipeline import make_pipeline
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import classification_report
    import pickle 
    
    print(__doc__)
    
    # import some data to play with
    X, y = samples_generator.make_classification(
        n_features=20, n_informative=3, n_redundant=0, n_classes=4,
        n_clusters_per_class=2)
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
    # 
    # # ANOVA SVM-C
    # # 1) anova filter, take 3 best ranked features
    # anova_filter = SelectKBest(f_regression, k=3)
    # # 2) svm
    # clf = svm.SVC(kernel='linear')
    # 
    # anova_svm = make_pipeline(anova_filter, clf)
    # anova_svm.fit(X_train, y_train)
    
    ##保存模型
    # # 以写二进制的方式打开文件
    # file = open("model.pickle", "wb")
    # # 把模型写入到文件中
    # pickle.dump(anova_svm, file)
    # # 关闭文件
    # file.close()
    
    ##读取模型
    # 以读二进制的方式打开文件
    file = open("model.pickle", "rb")
    # 把模型从文件中读取出来
    anova_svm = pickle.load(file)
    # 关闭文件
    file.close()
    
    y_pred = anova_svm.predict(X_test)
    print(classification_report(y_test, y_pred))

    输出:

    None
    D:\F\Anaconda3\lib\site-packages\sklearn\utils\__init__.py:54: FutureWarning: Conversion of the second argument of issubdtype from `int` to `np.signedinteger` is deprecated. In future, it will be treated as `np.int32 == np.dtype(int).type`.
      if np.issubdtype(mask.dtype, np.int):
                 precision    recall  f1-score   support
    
              0       0.29      0.33      0.31         6
              1       0.25      0.25      0.25         8
              2       0.40      0.33      0.36         6
              3       0.40      0.40      0.40         5
    
    avg / total       0.32      0.32      0.32        25
    
    

    joblib版本、

    from sklearn import svm
    from sklearn.datasets import samples_generator
    from sklearn.feature_selection import SelectKBest, f_regression
    from sklearn.pipeline import make_pipeline
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import classification_report
    from sklearn.externals import joblib
    
    print(__doc__)
    
    # import some data to play with
    X, y = samples_generator.make_classification(
        n_features=20, n_informative=3, n_redundant=0, n_classes=4,
        n_clusters_per_class=2)
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
     
    # # ANOVA SVM-C
    # # 1) anova filter, take 3 best ranked features
    # anova_filter = SelectKBest(f_regression, k=3)
    # # 2) svm
    # clf = svm.SVC(kernel='linear')
    #  
    # anova_svm = make_pipeline(anova_filter, clf)
    # anova_svm.fit(X_train, y_train)
    # 保存模型
    # joblib.dump(anova_svm, 'anova_svm.pkl') 
    
    # 提取模型
    anova_svm = joblib.load('anova_svm.pkl') 
    
    y_pred = anova_svm.predict(X_test)
    print(classification_report(y_test, y_pred))

     

    更多相关内容
  • clf.model svm训练模型

    2021-04-15 10:22:54
    svm训练模型
  • 基于python的行人检测svm hog,参考链接:https://blog.csdn.net/babyai996/article/details/117220250
  • SVM模型详解

    千次阅读 2022-03-25 08:53:21
    一、SVM定义与解决目标 SVM是一个二类分类器。其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化成一个凸二次规划问题的求解。即找到一个超平面,使两类数据离超平面越远越...

    入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。

    目录

    一、SVM定义与解决目标

    二、SVM算法原理

    1、线性可分

    (1)无松弛变量

    (2)带松弛变量​和惩罚因子C

    2、线性不可分

    (1)核函数定义和应用背景

    (2)线性核函数 LINEAR

    (3)高斯径向基核函数 RBF

    (4)多项式核函数 POLY

    (5)神经元的非线性作用核函数 Sigmoid

    (6)核函数选择技巧

    三、SVM代码实现


    一、SVM定义与解决目标

    SVM是一个二类分类器。其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化成一个凸二次规划问题的求解。即找到一个超平面,使两类数据离超平面越远越好,这样就可以让模型对新的数据分类更准确,即分类器更加稳定。

    🎈支持向量:离分隔超平面最近的一些点

    🎈间隔最大化:寻找最大化支持向量到分隔超平面的距离,以此为目标来求出分隔超平面

    🎈数据分类的类别

    (1)线性可分

    (2)线性不可分


    二、SVM算法原理

    1、线性可分

    分为2种:无松弛变量和带松弛变量

    以2个特征为例:

    如下图所示:如何分类黑点点和红点点,我们直观来看粉色那条线作为分界最好(因为该超平面对训练样本局部扰动的容忍性最好,即稳定性更高)

    🌳原始待分类的数据:(x11,x12,y1),……,(xm1,xm2,ym)

    x1,x2就是不同维的特征

    y的取值为1或-1(因为2分类)

    🌳目标超平面:w^{T}X+b = 0 —— 求最优w和b

    (这里其实展开就是w_{1}x_{1} + w_{2}x_{2}+b=0

    w是法向量,决定了超平面的方向;

    b是位移项,决定了超平面与原点间的距离)

    🌳那么空间中任意一点(x1,x2)到目标超平面的距离则为:

    r=\frac{\left|\omega^{T} x+b\right|}{|| \omega||}

    🌳又有定义:(其中x^{(i)}y^{(i)}分别是第i个样本和第i个样本值所对应的目标值)

    y_{i}(w^{T}x_{i} + b),i=1,.....,m为函数距离;

    所以我们把函数距离和点到面的距离进行一个综合,就变成了:

    \min\frac{y^{(i)}\left(w^{T} x^{(i)}+b\right)}{\|w\|}, i=1, \ldots, m为数据集与分隔超平面的几何距离;

    (1)这里用几何距离而不用函数距离的原因:

    当w,b成倍增加时,函数距离也会相应的成倍的增加,但几何函数则不会

    (2)我们刚刚不是说y的取值是1或-1嘛,这就保证了如果样本分类正确,则这个值是一个正数;如果样本分类错误,这个值是一个负数。这很好理解,分类对了就是同一边,就是正数嘛,即公式如下:

    \left\{\begin{array}{ll} \omega^{T} x_{i}+b>0, & y_{i}=+1 \\ \omega^{T} x_{i}+b<0, & y_{i}=-1 \end{array}\right.

    🌳但如果只以w^{T}X+b = 0来划分,那么它的容错性可能不是很好,所以SVM这里引入了这个:

    \left\{\begin{array}{ll} \omega^{T} x_{i}+b>=1, & y_{i}=+1 \\ \omega^{T} x_{i}+b<=-1, & y_{i}=-1 \end{array}\right.

    如图所示:(图里的转置符号我就懒得写上去了嘻嘻)

    🌳间隔

    其中,支持向量使上式的等号成立。两个异类支持向量到超平面的距离之和,也称为间隔:

    \gamma=\frac{2}{\|\omega\|}(其实就是那两条橙色的线的距离)

    🌳最大间隔划分超平面

    所以我们要找到对应的w和b让\gamma最大,即以下公式:

    \max _{\omega, b} \frac{2}{\|\omega\|}, s . t . y_{i}\left(\omega^{T} x_{i}+b\right) \geq 1, i=1,2, \ldots, m

    条件由以下所得:

    \left\{\begin{array}{ll} \omega^{T} x_{i}+b>=1, & y_{i}=+1 \\ \omega^{T} x_{i}+b<=-1, & y_{i}=-1 \end{array}\right.   左右乘上y_{i} 

    (1)无松弛变量

    🌳由上式进行变式

    为了最大化间隔,仅需最大化 \frac{1}{\|\omega\|}  ,这等价于最小化 \|\omega\|^2

    \min _{\omega, b} \frac{\|\omega\|^2}{2}, s . t . y_{i}\left(\omega^{T} x_{i}+b\right) \geq 1, i=1,2, \ldots, m

    这就是SVM的基本型

    🌳我们把约束条件融合到优化目标函数中,建立拉格朗日公式

    L(w, b, \alpha)=\frac{1}{2}\|w\|^{2}+\sum_{i=1}^{m} \alpha_{i}\left(1-y_{i}\left(w^{T} x_{i}+b\right)\right)

    令 L(w,b,α)对 w和b的偏导为零,得到:

    w =\sum_{i=1}^{m} \alpha_{i} y_{i} x_{i}     \sum_{i=1}^{m} \alpha_{i} y_{i} = 0

    代入L得

    \max _{\alpha} \sum_{i=1}^{m} \alpha_{i}-\frac{1}{2} \sum_{i=1}^{m} \sum_{j=1}^{m} \alpha_{i} \alpha_{j} y_{i} y_{j} x_{i}^{T} x_{j} --s.t. \sum_{i=1}^{m} \alpha_{i} y_{i}=0, \alpha_{i} \geq 0, i=1,2, \ldots, m

    解出\alpha后代入得:

     (这里的x和y都是支持向量)

    (2)带松弛变量\xi_{i}和惩罚因子C

    \min \frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{n} \xi_{i} -- s . t . y_{i}\left(\omega^{T} x_{i}+b\right) \geq 1-\xi_{i} , i=1,2, \ldots, m,\xi_{i}\geq0

    当C趋近于无穷大时,基本等价于无松弛变量的时候,当C取有限值的时允许一些样本不满足约束。

    其余与上述一样

    2、线性不可分

    如果训练样本线性不可分,那么只要样本的属性是有限个,就可以将其映射到高维特征空间,使这些样本线性可分。

    Note:升维后不一定线性可分,不过一般情况下升维后会更接近线性可分

    凡是遇到线性不可分的情况,一律映射到高维度空间,会出现维度爆炸的情况,那么计算难度会很大的。此时我们可以使用核函数来简化计算,核函数虽然也是将特征进行从低维到高维的转化 但是是在低维上进行计算 而实际的效果表现在高维上 解决了维度爆炸的问题

    (1)核函数定义和应用背景

    只要一个对称函数所对应的核矩阵半正定,它就能作为核函数使用。

    但是在不知道特征映射的形式时,我们并不知道什么样的核函数才是合适的。因此,核函数的选择成为SVM的最大变数

    构建核函数首先要确定输入空间到特征空间的映射,想要获取输入空间到映射空间的映射,我们需要明确输入空间内数据的分布情况,但大多数情况下,我们并不知道自己所处理的数据的具体分布,故一般很难构造出完全符合输入空间的核函数,因此我们用几种常用的核函数来代替自己构造核函数

    (2)线性核函数 LINEAR

    k(x,x_{i}) = x * x_{i}(内积)

    LINEAR主要用于线性可分的情况。我们可以看到特征空间到输入空间的维度是一样的,其参数少,速度快。对于线性可分数据,其分类效果很理想,因此我们通常首先尝试用线性核函数来做分类,看看效果如何,如果不行再换别的。

    (3)高斯径向基核函数 RBF

    k(x, x i)=\exp \left(-\frac{\|x-x i\|^{2}}{\delta^{2}}\right)

    它是一种局部性强的核函数,其可以将一个样本映射到一个更高维的空间,它是应用最广的一个,无论大样本还是小样本都有比较好的性能,而且其相对于多项式核函数参数要少,因此大多数情况下在不知道用什么核函数的时候,优先使用高斯核函数

    (4)多项式核函数 POLY

    k(x,x_{i}) = ((x * x_{i})+1)^{d}

    它也可以实现将低维的输入空间映射到高维的特征空间。但多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算

    (5)神经元的非线性作用核函数 Sigmoid

    关于Sigmoid函数的介绍可以看往期文章中

    基于分层softmax的CBoW模型详解_tt丫的博客-CSDN博客_分层softmax中有关逻辑回归Sigmoid函数的讲解

    k\left(x, x_{i}\right)=\tanh \left(\eta<x, x_{i}>+\theta\right)

    这样SVM实现的就是一种多层神经网络

    (6)核函数选择技巧

    如果我们对数据有个初步的分布了解等等,就根据这些特点去选择核函数

    如果我们不清楚的话,可以使用交叉验证的方法来试用不同的核函数,误差最小的就是效果最好的核函数;或者也可以将多个核函数结合起来,形成混合核函数。

    如果特征的数量大到和样本数量差不多,则选用线性核SVM;

    如果特征的数量小,样本的数量正常,则选用高斯核函数SVM;

    如果特征的数量小,而样本的数量很大,则需要手工添加一些特征从而变成第一种情况。


    三、SVM代码实现

    我们可以调用sklearn库中的SVM

    比如说

    model=sklearn.svm.SVC(C=2,kernel='rbf',gamma=10,decision_function_shape='ovo')

    参数说明:

    (1)C:C-SVC的惩罚参数C默认是1.0。C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,这样对训练集测试时准确率很高,但相对的,模型的泛化能力就会变弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。

    (2)kernel :核函数,默认是rbf,可以是

    0 —— 'linear';1 —— 'poly';2 —— 'rbf';3 —— 'sigmoid'

    (3)degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略

    (4)gamma :'rbf','poly'和'sigmoid'的核系数。当前默认值为'auto',它使用1 / n_features,如果gamma='scale'传递,则使用1 /(n_features * X.std())作为gamma的值。

    (5)coef0 :核函数的常数项。对于'poly'和 'sigmoid'有用

    (6) tol :默认为1e-3,停止训练的误差值大小

    主要调节的参数有:C、kernel、degree、gamma、coef0


    欢迎大家在评论区批评指正,谢谢~

    展开全文
  • SVM学习(一)SVM模型训练与分类

    万次阅读 多人点赞 2019-03-08 17:27:04
    SVM模型训练与分类 支持向量机(SVM): 一个能够将不同类样本在样本空间分隔的超平面。换句话说,给定一些标记好的训练本(监督式学习),SVM算法输出一个最优化的超分隔平面。本次利用VS2015+OpenCV3.4.1实现SVM...

    SVM模型训练与分类

    支持向量机(SVM):
    一个能够将不同类样本在样本空间分隔的超平面。换句话说,给定一些标记好的训练本(监督式学习),SVM算法输出一个最优化的超分隔平面。本次利用VS2015+OpenCV3.4.1实现SVM算法,完成数据集的训练,生成XML文件,然后通过调用XML文件来实现图片的识别分类。即为分三个步骤:数据集的准备、数据集的模型训练以及利用训练好的模型进行测试分类。

    目的:利用SVM算法实现手写体0和1的图片的识别分类。

    步骤1:数据集的准备

    在OpenCV的安装路径下,搜索digits,可以得到一张图片,图片大小为1000*2000,有0-9的10个数字,每5行为一个数字,总共50行,共有5000个手写数字,每个数字块大小为20×20。 下面将把这些数字中的0和1作为二分类的准备数据。其中0有500张,1有500张。
    在这里插入图片描述
    用下面的代码将图片准备好,在写入路径提前建立好文件夹:

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
    	char ad[128] = { 0 };
    	int  filename = 0, filenum = 0;
    	Mat img = imread("F:\\Opencv3_4_1\\opencv\\sources\\samples\\data\\digits.png");
    	Mat gray;
    	cvtColor(img, gray, CV_BGR2GRAY);
    	int b = 20;
    	int m = gray.rows / b;   //原图为1000*2000
    	int n = gray.cols / b;   //裁剪为5000个20*20的小图块
    	for (int i = 0; i < m; i++)
    	{
    		int offsetRow = i*b;  //行上的偏移量
    		if (i % 5 == 0 && i != 0)
    		{
    			filename++;
    			filenum = 0;
    		}
    		for (int j = 0; j < n; j++)
    		{
    			int offsetCol = j*b; //列上的偏移量
    			sprintf_s(ad, "D:\\data\\%d\\%d.jpg", filename, filenum++);
    			//截取20*20的小块
    			Mat tmp;
    			gray(Range(offsetRow, offsetRow + b), Range(offsetCol, offsetCol + b)).copyTo(tmp);
    			imwrite(ad, tmp);
    		}
    	}
    	return 0;
    }
    

    最后可以得到这样的结果
    准备好的数据
    将以上图片可以进行分类成训练集和测试集,方便后期进行训练和测试。要注意:训练中的图片不包含测试集合中的图片。
    在这里插入图片描述
    训练数据800张,0,1各400张;测试数据200张,0,1各100张

    步骤2:模型的训练

    数据准备完成之后,就可以用下面的代码训练了:

    #include <stdio.h>  
    #include <time.h>  
    #include <opencv2/opencv.hpp>  
    #include <opencv/cv.h>  
    #include <iostream> 
    #include <opencv2/core/core.hpp>  
    #include <opencv2/highgui/highgui.hpp>  
    #include <opencv2/ml/ml.hpp>  
    #include <io.h> //查找文件相关函数
    
    using namespace std;
    using namespace cv;
    using namespace cv::ml;
    
    void getFiles(string path, vector<string>& files);
    void getBubble(Mat& trainingImages, vector<int>& trainingLabels);
    void getNoBubble(Mat& trainingImages, vector<int>& trainingLabels);
    int main()
    {
    	//获取训练数据
    	Mat classes;
    	Mat trainingData;
    	Mat trainingImages;
    	vector<int> trainingLabels;
    	//getBubble()与getNoBubble()将获取一张图片后会将图片(特征)写入
    	//  到容器中,紧接着会将标签写入另一个容器中,这样就保证了特征
    	//  和标签是一一对应的关系push_back(0)或者push_back(1)其实就是
    	//  我们贴标签的过程。
    	getBubble(trainingImages, trainingLabels);
    	getNoBubble(trainingImages, trainingLabels);
    	//在主函数中,将getBubble()与getNoBubble()写好的包含特征的矩阵拷贝给trainingData,将包含标签的vector容器进行类
    	//型转换后拷贝到trainingLabels里,至此,数据准备工作完成,trainingData与trainingLabels就是我们要训练的数据。
    	Mat(trainingImages).copyTo(trainingData);
    	trainingData.convertTo(trainingData, CV_32FC1);
    	Mat(trainingLabels).copyTo(classes);
    	// 创建分类器并设置参数
    	Ptr<SVM> SVM_params = SVM::create();
    	SVM_params->setType(SVM::C_SVC);
    	SVM_params->setKernel(SVM::LINEAR);  //核函数
    	SVM_params->setDegree(0);
    	SVM_params->setGamma(1);
    	SVM_params->setCoef0(0);
    	SVM_params->setC(1);
    	SVM_params->setNu(0);
    	SVM_params->setP(0);
    	SVM_params->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, 0.01));
    	Ptr<TrainData> tData = TrainData::create(trainingData, ROW_SAMPLE, classes);
    	// 训练分类器
    	SVM_params->train(tData);
    	//保存模型
    	SVM_params->save("svm.xml");//将训练好的模型保存在此文件中。
    	cout << "训练好了!!!" << endl;
    	getchar();
    	return 0;
    }
    void getFiles(string path, vector<string>& files)//用来遍历文件夹下的所有文件。
    {
    	intptr_t   hFile = 0;
    	struct _finddata_t fileinfo;
    	string p;
    	int i = 30;
    	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
    	{
    		do
    		{
    			if ((fileinfo.attrib &  _A_SUBDIR))
    			{
    				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
    					getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
    			}
    			else
    			{
    				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
    			}
    
    		} while (_findnext(hFile, &fileinfo) == 0);
    
    		_findclose(hFile);
    	}
    }
    //获取正样本
    //并贴标签为1
    void getBubble(Mat& trainingImages, vector<int>& trainingLabels)
    {
    	char * filePath = "D:\\data\\train_image\\1"; //数字1样本路径
    	vector<string> files;
    	getFiles(filePath, files);
    	int number = files.size();
    	for (int i = 0; i < number; i++)
    	{
    		Mat  SrcImage = imread(files[i].c_str());
    		SrcImage = SrcImage.reshape(1, 1);
    		trainingImages.push_back(SrcImage);
    		trainingLabels.push_back(1);//该样本为数字1
    	}
    
    }
    //获取负样本
    //并贴标签为0
    void getNoBubble(Mat& trainingImages, vector<int>& trainingLabels)
    {
    	char * filePath = "D:\\data\\train_image\\0"; //数组0样本路径
    	vector<string> files;
    	getFiles(filePath, files);
    	int number = files.size();
    	for (int i = 0; i < number; i++)
    	{
    		Mat  SrcImage = imread(files[i].c_str());
    		SrcImage = SrcImage.reshape(1, 1);
    		trainingImages.push_back(SrcImage);
    		trainingLabels.push_back(0); //该样本是数字0
    	}
    }
    

    注意:此过程的主要目的是生成xml文件,此文件保存在该工程项目的根目录下。

    步骤3:加载模型进行分类识别

    将上一步生成的XML文件复制一份到该工程根目录下,否则无法加载。
    在这里插入图片描述
    测试代码如下所示:

    #include <stdio.h>  
    #include <time.h>  
    #include <opencv2/opencv.hpp>  
    #include <opencv/cv.h>  
    #include <iostream> 
    #include <opencv2/core/core.hpp>  
    #include <opencv2/highgui/highgui.hpp>  
    #include <opencv2/ml/ml.hpp>  
    #include <io.h>
    using namespace std;
    using namespace cv;
    //using namespace ml;
    
    void getFiles(string path, vector<string>& files);
    int main()
    {
    	int result0 = 0;
    	int result1 = 0;
    	char * filePath = "D:\\data\\test_image\\0";
    	vector<string> files;
    	getFiles(filePath, files);
    	int number = files.size();
    	cout <<"共有测试图片"<< number<<"张\n" << endl;
    	Ptr<ml::SVM>svm = ml::SVM::load("svm.xml");
    	
    	for (int i = 0; i < number; i++)
    	{
    		Mat inMat = imread(files[i].c_str());
    		Mat p = inMat.reshape(1, 1);
    		p.convertTo(p, CV_32FC1);
    		int response = (int)svm->predict(p);
    		cout << "识别的数字为:" << response << endl;
    		if (response == 0)
    		{
    			result0++;
    		}
    		else 
    		{
    			result1++;
    		}
    
    	}
    	cout << "识别的数字0的个数为:" << result0 << endl;
    	cout << "识别的数字1的个数为:" << result1 << endl;
    	getchar();
    	return  0;
    }
    void getFiles(string path, vector<string>& files)  //用来遍历文件夹下所有文件
    {
    	intptr_t   hFile = 0;
    	/*long   hFile = 0;*/
    	struct _finddata_t fileinfo;
    	string p;
    	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
    	{
    		do
    		{
    			if ((fileinfo.attrib &  _A_SUBDIR))
    			{
    				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
    					getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
    			}
    			else
    			{
    				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
    			}
    		} while (_findnext(hFile, &fileinfo) == 0);
    		_findclose(hFile);
    	}
    }
    

    本次的测试图片共100张,其中0有94张,1有6张。
    在这里插入图片描述
    下面展示测试效果:
    在这里插入图片描述
    可以看出测试效果还不错!

    展开全文
  • python svm 怎么训练模型

    千次阅读 2020-11-20 18:52:54
    展开全部支持2113向量机SVM(Support Vector Machine)是有监督的分类预测模型,本篇文章5261使用机器学习库scikit-learn中的手写数字数4102据集介绍使用Python对SVM模型进行1653训练并对手写数字进行识别的过程。...

    展开全部

    支持2113向量机SVM(Support Vector Machine)是有监督的分类预测模型,本篇文章5261使用机器学习库scikit-learn中的手写数字数4102据集介绍使用Python对SVM模型进行1653训练并对手写数字进行识别的过程。

    准备工作

    手写数字识别的原理是将数字的图片分割为8X8的灰度值矩阵,将这64个灰度值作为每个数字的训练集对模型进行训练。手写数字所对应的真实数字作为分类结果。在机器学习sklearn库中已经包含了不同数字的8X8灰度值矩阵,因此我们首先导入sklearn库自带的datasets数据集。然后是交叉验证库,SVM分类算法库,绘制图表库等。

    12345678910

    #导入自带数据集from sklearn import datasets#导入交叉验证库from sklearn import cross_validation#导入SVM分类算法库from sklearn import svm#导入图表库import matplotlib.pyplot as plt#生成预测结果准确率的混淆矩阵from sklearn import metrics

    读取并查看数字矩阵

    从sklearn库自带的datasets数据集中读取数字的8X8矩阵信息并赋值给digits。

    12

    #读取自带数据集并赋值给digitsdigits = datasets.load_digits()

    查看其中的数字9可以发现,手写的数字9以64个灰度值保存。从下面的8×8矩阵中很难看出这是数字9。

    12

    #查看数据集中数字9的矩阵digits.data[9]

    以灰度值的方式输出手写数字9的图像,可以看出个大概轮廓。这就是经过切割并以灰度保存的手写数字9。它所对应的64个灰度值就是模型的训练集,而真实的数字9是目标分类。我们的模型所要做的就是在已知64个灰度值与每个数字对应关系的情况下,通过对模型进行训练来对新的手写数字对应的真实数字进行分类。

    1234

    #绘制图表查看数据集中数字9的图像plt.imshow(digits.images[9], cmap=plt.cm.gray_r, interpolation='nearest')plt.title('digits.target[9]')plt.show()

    resize,m_lfit,w_600,h_800,limit_1

    设置模型的特征X和预测目标Y

    查看数据集中的分类目标,可以看到一共有10个分类,分布为0-9。我们将这个分类目标赋值给Y,作为模型的预测目标。

    12

    #数据集中的目标分类digits.target

    resize,m_lfit,w_600,h_800,limit_1

    12

    #将数据集中的目标赋给YY=digits.target

    手写数字的64个灰度值作为特征赋值给X,这里需要说明的是64个灰度值是以8×8矩阵的形式保持的,因此我们需要使用reshape函数重新调整矩阵的行列数。这里也就是将8×8的两维数据转换为64×1的一维数据。

    123

    #使用reshape函数对矩阵进行转换,并赋值给Xn_samples = len(digits.images)X = digits.images.reshape((n_samples, 64))

    查看特征值X和预测目标Y的行数,共有1797行,也就是说数据集中共有1797个手写数字的图像,64列是经过我们转化后的灰度值。

    12

    #查看X和Y的行数X.shape,Y.shape

    resize,m_lfit,w_600,h_800,limit_1

    将数据分割为训练集和测试集

    将1797个手写数字的灰度值采用随机抽样的方法分割为训练集和测试集,其中训练集为60%,测试集为40%。

    12

    #随机抽取生成训练集和测试集,其中训练集的比例为60%,测试集40%X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, Y, test_size=0.4, random_state=0)

    查看分割后的测试集数据,共有1078条数据。这些数据将用来训练SVM模型。

    12

    #查看训练集的行数X_train.shape,y_train.shape

    resize,m_lfit,w_600,h_800,limit_1

    对SVM模型进行训练

    将训练集数据X_train和y_train代入到SVM模型中,对模型进行训练。下面是具体的代码和结果。

    12

    #生成SVM分类模型clf = svm.SVC(gamma=0.001)

    12

    #使用训练集对svm分类模型进行训练clf.fit(X_train, y_train)

    使用测试集测对模型进行测试

    使用测试集数据X_test和y_test对训练后的SVM模型进行检验,模型对手写数字分类的准确率为99.3%。这是非常高的准确率。那么是否真的这么靠谱吗?下面我们来单独测试下。

    12

    #使用测试集衡量分类模型准确率clf.score(X_test, y_test)

    resize,m_lfit,w_600,h_800,limit_1

    我们使用测试集的特征X,也就是每个手写数字的64个灰度值代入到模型中,让SVM模型进行分类。

    12

    #对测试集数据进行预测predicted=clf.predict(X_test)

    然后查看前20个手写数字的分类结果,也就是手写数字所对应的真实数字。下面是具体的分类结果。

    12

    #查看前20个测试集的预测结果predicted[:20]

    resize,m_lfit,w_600,h_800,limit_1

    再查看训练集中前20个分类结果,也就是真实数字的情况,并将之前的分类结果与测试集的真实结果进行对比。

    12

    #查看测试集中的真实结果expected=y_test

    以下是测试集中前20个真实数字的结果,与前面SVM模型的分类结果对比,前20个结果是一致的。

    12

    #查看测试集中前20个真实结果expected[:20]

    resize,m_lfit,w_600,h_800,limit_1

    使用混淆矩阵来看下SVM模型对所有测试集数据的预测与真实结果的准确率情况,下面是一个10X10的矩阵,左上角第一行第一个数字60表示实际为0,SVM模型也预测为0的个数,第一行第二个数字表示实际为0,SVM模型预测为1的数字。第二行第二个数字73表示实际为1,SVM模型也预测为1的个数。

    12

    #生成准确率的混淆矩阵(Confusion matrix)metrics.confusion_matrix(expected, predicted)

    resize,m_lfit,w_600,h_800,limit_1

    从混淆矩阵中可以看到,大部分的数字SVM的分类和预测都是正确的,但也有个别的数字分类错误,例如真实的数字2,SVM模型有一次错误的分类为1,还有一次错误分类为7。

    展开全文
  • 【行人检测】利用HOG+SVM训练模型,检测行人

    万次阅读 多人点赞 2018-06-12 20:43:48
    【行人检测】利用HOG+SVM训练模型,检测行人 1.准备样本 2.提取hog特征 3. 训练SVM分类器 4.利用SVM训练的分类器,进行检测本节的训练样本以及训练的分类器参数,有需要可戳:整个流程,1.准备样本:准备正负...
  • Python: SVM模型简介

    千次阅读 2021-01-21 17:33:08
    SVM简介及sklearn参数 1.SVM简介  支持向量机SVM(Support Victory Machines)方法建立在统计学VC维和结构风险最小化原则上,既可以用于分类(二/多分类)、也可用于... 使用SVM作为模型时,通常采用如下流程:
  • svm模型训练后的参数说明

    千次阅读 2017-12-08 20:44:20
    现简单对屏幕回显信息进行说明: #iter 为迭代次数, nu 与前面的操作参数 -n nu 相同, obj 为 SVM 文件转换为的二次规划求解得到的...训练后的模型保存为文件 *.model ,用记事本打开其内容如下: svm
  • PyML(四)——用sklearn训练SVM模型

    千次阅读 2018-07-23 15:26:07
    SVM可以看作是感知机的扩展。在感知机算法中,我们最小化错误分类误差。在SVM中我们的优化目标是最大化间隔。间隔定义为两个分隔超平面(决策界)的距离。 1.用松弛变量解决线性可分的情况(软间隔) 需要调节的...
  • 但是不知道怎么导出训练好的数学模型,在论文里以公式的方式呈现。 工作区有很多训练完的数据文件![图片说明](https://img-ask.csdn.net/upload/202005/08/1588906925_136676.png) ![图片说明]...
  • sklearn中的SVM模型

    千次阅读 2020-01-15 17:18:10
    支持向量机(SVM)是一种强大的可用于监督式学习分类问题和回归问题,以及非监督式异常检测问题等的常见... 基于liblinear库的SVM分类模型,仅支持线性核,可调节损失函数和惩罚项。多分类问题采用'ovr'策略。不支...
  • Python实现GA(遗传算法)对SVM分类模型参数的优化资料说明:包括数据集+源代码+Word文档说明。 资料内容包括: 1)需求分析; 2)数据采集; 3)数据预处理; 4)探索性数据分析; 5)特征工程; 6)机器建模; 7)模型评估...
  • fitrsvm在中低维预测变量数据集上训练或交叉验证支持向量机(SVM)回归模型。 fitrsvm支持使用内核函数映射预测变量数据,并支持通过二次编程实现目标函数最小化。要在高维数据集(即包含许多预测变量的数据集)上...
  • opencv C++ SVM模型训练与分类实现

    千次阅读 2022-06-13 14:07:58
    我用的是opencv 4.5.1版本,...最近想学习一下分类算法的内容,恰好opencv有SVM的函数,故先从这个下手。找了许多资料,发现要么是opencv2、3的,要么就没有具体实现代码,学习还是把代码与原理一起结合来看比较好。...
  • from sklearn import datasets,linear_model,cross_validation,svm def load_data_regression(): diabetes = datasets.load_diabetes() return cross_validation.train_test_split(diabetes,diabetes.target,te
  • 车牌识别SVM,已经训练好的样本集,直接可用于车牌识别。包括两个文件,svm.dat和svmchinese.dat,其中前一个文件用于识别字母和数字;后一个文件用于识别汉字。
  • mo_3.m_lbp特征提取,fitcecoc训练svm模型,predict预测,人脸分类。使用fitcecoc函数训练一个多分类的SVM模型,使用predict函数利用训练出的模型对测试数据进行预测,将得到的类标预测值与测试数据真实的类标进行...
  • SVM_HOG_2400PosINRIA_12000Neg_HardExample(\u8bef\u62a5\u5c11\u4e86\u6f0f\u68c0\u591a\u4e86).rar,SVM_HOG_2400PosINRIA_12000Neg_HardExample(误报少了漏检多了).xml
  • 针对顶板冒落带高度问题提出新的预计模型...采用果蝇优化算法对预计模型进行优化训练,建立FOA-SVM预计模型,利用实测数据对模型的预计结果进行检验,预计结果较为准确,比PSO-SVM模型和GA-SVM模型结果稳定性好计算精度高。
  • 学习SVM(一) SVM模型训练与分类的OpenCV实现

    万次阅读 多人点赞 2017-03-29 21:47:52
    学习SVM(一) SVM模型训练与分类的OpenCV实现 学习SVM(二) 如何理解支持向量机的最大分类间隔 学习SVM(三)理解SVM中的对偶问题 学习SVM(四) 理解SVM中的支持向量(Support Vector)Andrew Ng 在斯坦福大学...
  • 1.介绍 Keras是基于Theano的一个深度学习框架,它的设计...先使用CNN进行训练,利用Theano函数将CNN全连接层的值取出来,给SVM进行训练 3.结果示例 因为这里只是一个演示keras&SVM的demo,未对参数进行过多
  • 基于Theano的深度学习框架keras及配合SVM训练模型

    万次阅读 热门讨论 2016-05-06 20:35:08
    1.介绍 Keras是基于Theano的一个深度学习框架...先使用CNN进行训练,利用Theano函数将CNN全连接层的值取出来,给SVM进行训练 3.结果示例 因为这里只是一个演示keras&SVM的demo,未对参数进行过多的尝试,结果一般
  • 最新代码Github地址:...所以又尝试通过hard negative mining优化训练SVM模型。原理大概就是先用原始训练训练出一个模型,然后对所有负样本滑窗预测。如果该窗口预测结果为正,那么...
  • SVM训练代码

    2022-06-25 21:47:23
    svm训练
  • SVM代码和模型.zip

    2021-08-06 10:58:49
    SVM+Sift+K-means实现图像分类(python)的代码部分,包含训练和测试代码,以及训练好的模型
  • svm_C++_SVM_

    2021-10-03 10:01:43
    此代码是用C写的,用于进行支持向量机(SVM)的训练代码的C文件格式。
  • 在调用sklearn的SVM时,如果设置verbose=True,模型训练结束后会显示一些训练过程的说明信息,如下(以下是OCSVM的返回结果): * optimization finished, # iter = 32 obj = 192.154077, rho = 19.244379 nSV = 26, ...
  • 资源名:svm源代码_其中包括svm源代码及使用svm的练习 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 适合人群:新手...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,899
精华内容 26,759
关键字:

svm训练模型

友情链接: JAVA编程题题集.rar