Python机器学习理论与实战(六)支持向量机
简介
支持向量机(Support Vector Machine,简称 SVM)是一个强大的分类算法,其具有优秀的泛化能力。在本文中,我们将介绍 SVM 的原理、实现及应用。
SVM 原理
SVM 的核心思想是:找到一个可以将不同类别的数据分割开的最优超平面。其中“最优”的定义是:在所有能成功分割不同类别数据的超平面中,选择距离两类样本点最近的点到超平面的距离最大的超平面。
SVM 实现
SVM 可以用于线性可分和线性不可分的情况。使用不同的核函数可以将线性不可分的情况转化为线性可分,从而解决问题。
下面是使用 scikit-learn 实现 SVM 的基本流程:
from sklearn import svm
clf = svm.SVC() # 初始化 SVM 模型
clf.fit(X_train, y_train) # 训练模型
y_predict = clf.predict(X_test) # 预测结果
其中 X_train
表示训练集的特征矩阵,y_train
表示训练集的标签,X_test
表示测试集的特征矩阵,y_predict
表示模型预测出的测试集标签。
下面是一个简单的例子,使用 SVM 对 iris 数据集进行分类:
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
# 初始化 SVM 模型
clf = svm.SVC(kernel='linear', C=1)
clf.fit(X_train, y_train)
# 预测结果并计算准确率
y_predict = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_predict)
print('准确率:%.2f%%' % (accuracy * 100))
SVM 应用
SVM 通常用于分类问题,例如文本分类、图像分类等。以下是两个示例:
例子1:使用 SVM 进行文本分类
下面是将 SVM 用于文本分类的示例:
import numpy as np
from sklearn import svm
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据集
newsgroups_train = fetch_20newsgroups(subset='train')
categories = newsgroups_train.target_names
# 特征工程
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(newsgroups_train.data)
y = newsgroups_train.target
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
# 初始化 SVM 模型
clf = svm.SVC(kernel='linear', C=1)
clf.fit(X_train, y_train)
# 预测结果并计算准确率
y_predict = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_predict)
print('准确率:%.2f%%' % (accuracy * 100))
例子2:使用 SVM 进行图像分类
下面是将 SVM 用于图像分类的示例:
import os
import cv2
import numpy as np
from sklearn import svm
from sklearn.metrics import accuracy_score
# 加载数据集
data_dir = './data'
classes = ['cats', 'dogs']
X, y = [], []
for class_id, class_name in enumerate(classes):
for file_name in os.listdir(os.path.join(data_dir, class_name)):
img_path = os.path.join(data_dir, class_name, file_name)
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (32, 32)) # 将图像缩放至相同大小
X.append(img.flatten()) # 将图像数据展平为一维数组
y.append(class_id)
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
# 初始化 SVM 模型
clf = svm.SVC(kernel='linear', C=1)
clf.fit(X_train, y_train)
# 预测结果并计算准确率
y_predict = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_predict)
print('准确率:%.2f%%' % (accuracy * 100))
总结
这篇文章介绍了 SVM 的原理和实现,同时给出了文本分类和图像分类的两个示例。SVM 是一种非常强大的分类算法,具有很好的泛化能力,既可以用于线性可分问题,也可以用于线性不可分问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python机器学习理论与实战(六)支持向量机 - Python技术站