SVM分类问题

监督式学习(Supervised Learning)常用算法包括:线性回归(Linear Regression)、逻辑回归(Logistic Regression)、神经网络(Neural Network)以及支持向量机(Support Vector Machine,SVM)等。支持向量机与逻辑回归算法类似,都是解决二分类或多分类问题,但是SVM在非线性回归预测方面具有更优秀的分类效果,所以SVM又被称为最大间距分类器。

本文不对支持向量机的原理进行详细解释,直接运用matlab自带的工具箱函数svmtrain、svmclassify解决实际的二分类问题。

导入数据:


 
 
  1. clear; close all; clc;
  2. %% ================ load fisheriris.mat ================
  3. load fisheriris.mat

1、对于线性分类问题,我们选取线性核函数,原始数据包括训练数据和测试数据两部分。


 
 
  1. data = meas(51:end,3:4); % column 3,column 4作为特征值
  2. group = species(51:end); % 类别
  3. idx = randperm(size(data,1));
  4. N = length(idx);
  5. % SVM train
  6. T = floor(N*0.9); % 90组数据作为训练数据
  7. xdata = data(idx(1:T),:);
  8. xgroup = group(idx(1:T));
  9. svmStr = svmtrain(xdata,xgroup,'Showplot',true);

训练过程得到结构体svmStr,对测试数据进行预测


 
 
  1. % SVM predict
  2. P = floor(N*0.1); % 10组预测数据
  3. ydata = data(idx(T+1:end),:);
  4. ygroup = group(idx(T+1:end));
  5. pgroup = svmclassify(svmStr,ydata,'Showplot',true); % svm预测
  6. hold on;
  7. plot(ydata(:,1),ydata(:,2),'bs','Markersize',12);
  8. accuracy1 = sum(strcmp(pgroup,ygroup))/P*100; % 预测准确性
  9. hold off;

程序运行结果如下:


图中,方块*号表示测试数据的预测结果,accuracy1结果为90%(上下浮动)。


2、对于非线性分类问题,我们选取高斯核函数RBF,原始数据包括训练数据和测试数据两部分。

训练过程前,导入原始数据:


 
 
  1. data = meas(51:end,1:2); % column 1,column 2作为特征值
  2. group = species(51:end); % 类别
  3. idx = randperm(size(data,1));
  4. N = length(idx);
  5. % SVM train
  6. T = floor(N*0.9); % 90组数据作为训练数据
  7. xdata = data(idx(1:T),:);
  8. xgroup = group(idx(1:T));

对于高斯核函数,有两个参数对SVM的分类效果有着重要的影响:一个是sigma;另一个是C。

首先讨论sigma的影响,sigma反映了RBF函数从最大值点向周围函数值下降的速度,sigma越大,下降速度越慢,对应RBF函数越平缓;sigma越小,下降速度越快,对应RBF函数越陡峭。对于不同的sigma,程序代码:


 
 
  1. % different sigma
  2. figure;
  3. sigma = 0.5;
  4. svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','rbf_sigma',...
  5. sigma,'showplot',true);
  6. title('sigma = 0.5');
  7. figure;
  8. sigma = 1;
  9. svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','rbf_sigma',...
  10. sigma,'showplot',true);
  11. title('sigma = 1');
  12. figure;
  13. sigma = 3;
  14. svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','rbf_sigma',...
  15. sigma,'showplot',true);
  16. title('sigma = 3');

分类平面分别如下:







从图中可以看出,sigma越小,分类曲线越复杂,事实也确实如此。因为sigma越小,RBF函数越陡峭,下降速度越大,预测过程容易发生过拟合问题,使分类模型对训练数据过分拟合,而对测试数据预测效果不佳。

然后讨论C的影响,程序代码如下:


 
 
  1. % different C
  2. figure;
  3. C = 1;
  4. svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','boxconstraint',...
  5. C,'showplot',true);
  6. title('C = 0.1');
  7. figure;
  8. C = 8;
  9. svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','boxconstraint',...
  10. C,'showplot',true);
  11. title('C = 1');
  12. figure;
  13. C = 64;
  14. svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','boxconstraint',...
  15. C,'showplot',true);
  16. title('C = 10');

分类平面如下:







从图中可以发现,C越大,分类曲线越复杂,也就是说越容易发生过拟合,因为C对应逻辑回归的lambda的倒数。

若令sigma=1,C=1,则对测试数据的预测程序:


 
 
  1. % SVM predict
  2. P = floor(N*0.1); % 10组预测数据
  3. ydata = data(idx(T+1:end),:);
  4. ygroup = group(idx(T+1:end));
  5. % sigma = 1,C = 1,default
  6. figure;
  7. svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','showplot',true);
  8. pgroup = svmclassify(svmStr,ydata,'Showplot',true); % svm预测
  9. hold on;
  10. plot(ydata(:,1),ydata(:,2),'bs','Markersize',12);
  11. accuracy2 = sum(strcmp(pgroup,ygroup))/P*100; % 预测准确性
  12. hold off;

程序运行结果如下:


图中,方块*号表示测试数据的预测结果,accuracy2结果为70%(上下浮动)。

分类效果不佳因为两个特征量的选择,可以选择更合适的特征量。



本文转自:https://blog.csdn.net/red_stone1/article/details/54313821

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的提问。以下是用Python编写SVM分类问题并可视化的步骤: 1. 导入所需的Python库,包括numpy、pandas、matplotlib和sklearn等。 2. 准备数据: 在这里我们可以使用sklearn的内置数据集Iris,这是一种经典的多类别分类问题数据集。我们通过加载Iris数据集来实现我们的SVM分类模型。 3. 数据预处理:划分数据集为训练数据集和测试数据集。 4. 特征缩放:进行数据标准化以确保归一性。 5. 定义模型并训练:使用sklearn提供的SVM实现,定义一个支持向量机分类器,并在训练数据集上进行训练。 6. 预测结果:对测试集进行预测并计算准确率。 7. 数据可视化:使用matplotlib库绘制分类结果的决策边界,以显示我们的分类器。 下面是示例代码: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from sklearn.metrics import accuracy_score # Load Iris dataset iris = datasets.load_iris() X = iris.data y = iris.target # Split dataset into training and test data sets X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # Scaling features to have mean 0 and variance 1 sc = StandardScaler() sc.fit(X_train) X_train_std = sc.transform(X_train) X_test_std = sc.transform(X_test) # Train SVM classifier on training data svm = SVC(kernel='linear', C=1.0, random_state=0) svm.fit(X_train_std, y_train) # Make predictions using trained classifier y_pred = svm.predict(X_test_std) # Calculate model accuracy accuracy = accuracy_score(y_test, y_pred) print('Model accuracy:', accuracy) # Plot decision regions from matplotlib.colors import ListedColormap X_combined_std = np.vstack((X_train_std, X_test_std)) y_combined = np.hstack((y_train, y_test)) markers = ('s', 'x', 'o') colors = ('red', 'blue', 'green') cmap = ListedColormap(colors[:len(np.unique(y_combined))]) x1_min, x1_max = X_combined_std[:, 0].min() - 1, X_combined_std[:, 0].max() + 1 x2_min, x2_max = X_combined_std[:, 1].min() - 1, X_combined_std[:, 1].max() + 1 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.1), np.arange(x2_min, x2_max, 0.1)) Z = svm.predict(np.array([xx1.ravel(), xx2.ravel()]).T) Z = Z.reshape(xx1.shape) plt.contourf(xx1, xx2, Z, alpha=0.3, cmap=cmap) plt.xlim(xx1.min(), xx1.max()) plt.ylim(xx2.min(), xx2.max()) for idx, cl in enumerate(np.unique(y_combined)): plt.scatter(x=X_combined_std[y_combined == cl, 0], y=X_combined_std[y_combined == cl, 1], alpha=0.8, c=cmap(idx), marker=markers[idx], label=cl) plt.xlabel('Sepal length [standardized]') plt.ylabel('Petal length [standardized]') plt.legend(loc='upper left') plt.show() ``` 希望这个回答对你有所帮助,如果你还有其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值