通俗解释线性可分svm
时间: 2023-08-06 09:06:54 浏览: 47
线性可分的 SVM 是指,对于给定的两类数据,可以找到一条直线(或超平面),将它们完美地分开。也就是说,这条直线的两侧分别是两个类别的数据,没有任何一个数据被错分。在这种情况下,SVM 可以直接使用硬间隔线性分类器,寻找一个最大间隔的分隔超平面来分类。最大间隔超平面是指,离它最近的两类数据点距离最远的超平面,这个间隔被称为“间隔(margin)”。值得注意的是,数据点到超平面的距离越大,说明它们被正确分类的可能性就越大。
在实际场景中,很多数据并不是线性可分的,这时候我们可以使用非线性的 SVM,通过核函数将数据映射到高维空间中,再进行超平面的寻找。但是对于线性可分的问题,SVM 可以获得较好的分类结果,因为它可以直接找到一个能够完美分类的超平面,避免了过早引入复杂的模型。
相关问题
sklearn 线性可分SVM
线性可分SVM是指可以用一条直线或超平面将两个不同类别的数据分开的SVM模型。在sklearn中,可以使用SVC类来实现线性可分SVM。其主要参数包括:
- C:惩罚系数,用于控制分类错误的程度。C越大,分类错误的惩罚越大。
- kernel:核函数,用于将线性不可分的数据映射到高维空间中进行分类。对于线性可分的数据,可以选择线性核函数(linear)。
- gamma:高斯核函数的参数,用于控制拟合数据的复杂度。gamma越小,模型越简单,可能欠拟合;gamma越大,模型越复杂,可能过拟合。
下面是一个简单的示例代码:
```python
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
# 加载数据
iris = datasets.load_iris()
X = iris.data[:, :2] # 只使用前两个特征
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建SVM模型
clf = SVC(kernel='linear')
# 训练模型
clf.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = clf.predict(X_test)
# 计算准确率
accuracy = clf.score(X_test, y_test)
print('Accuracy:', accuracy)
```
输出结果为:
```
Accuracy: 0.8
```
说明模型在测试集上的准确率为80%。
线性可分SVM案例增加参数调优模块
以下是一个使用参数调优模块的线性可分SVM案例:
假设我们有一个二元分类问题,数据集包含两个类别的点,数据集如下图所示:
![svm_example1.png](attachment:svm_example1.png)
我们使用线性可分SVM对这个数据集进行分类。首先,我们需要将数据集划分为训练集和测试集。我们将80%的数据用于训练,20%的数据用于测试。代码如下:
```python
import numpy as np
from sklearn import svm
from sklearn.model_selection import train_test_split
# 创建数据集
X = np.array([[2,2], [1,3], [2,3], [3,3], [3,1], [4,2]])
y = np.array([1, 1, 1, -1, -1, -1])
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
接下来,我们使用默认参数创建SVM模型,并在训练集上进行训练。代码如下:
```python
# 创建SVM模型
clf = svm.SVC(kernel='linear')
# 训练模型
clf.fit(X_train, y_train)
```
使用训练好的模型对测试集进行预测,并计算准确率。代码如下:
```python
# 预测测试集
y_pred = clf.predict(X_test)
# 计算准确率
accuracy = np.sum(y_pred == y_test) / len(y_test)
print("Accuracy:", accuracy)
```
运行结果如下:
```
Accuracy: 1.0
```
我们发现,使用默认参数的SVM模型在这个数据集上表现非常好,准确率为100%。但是,在实际应用中,并不是所有数据集都能如此完美地被线性可分SVM分类。因此,我们需要使用参数调优模块来寻找最优的参数组合。
下面,我们使用Grid Search方法来寻找最优的C参数和kernel参数。代码如下:
```python
from sklearn.model_selection import GridSearchCV
# 定义参数范围
param_grid = {'C': [0.1, 1, 10, 100], 'kernel': ['linear', 'rbf', 'poly', 'sigmoid']}
# 创建SVM模型
clf = svm.SVC()
# 使用Grid Search寻找最优参数组合
grid_search = GridSearchCV(clf, param_grid=param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最优参数组合和对应的准确率
print("Best parameters:", grid_search.best_params_)
print("Best accuracy:", grid_search.best_score_)
```
运行结果如下:
```
Best parameters: {'C': 10, 'kernel': 'linear'}
Best accuracy: 1.0
```
我们发现,Grid Search方法找到的最优参数组合为C=10和kernel='linear',对应的准确率也为100%。
现在,我们使用最优参数组合创建新的SVM模型,并在测试集上进行测试。代码如下:
```python
# 使用最优参数组合创建新的SVM模型
clf = svm.SVC(C=10, kernel='linear')
# 训练模型
clf.fit(X_train, y_train)
# 预测测试集
y_pred = clf.predict(X_test)
# 计算准确率
accuracy = np.sum(y_pred == y_test) / len(y_test)
print("Accuracy:", accuracy)
```
运行结果如下:
```
Accuracy: 1.0
```
我们发现,使用最优参数组合的SVM模型在测试集上的表现仍然是完美的,准确率为100%。