支持向量机(Support Vector Machines,SVM)是一种强大的机器学习算法,可用于解决分类和回归问题。SVM的目标是找到一个最优的超平面,以在特征空间中有效地划分不同类别的样本。
在二维空间中,超平面是一条直线,而在更高维的空间中,它是一个平面。对于二分类问题,SVM试图找到一个超平面,使得两个类别的样本被最大间隔分开。
在SVM中,支持向量是离超平面最近的样本点。这些支持向量对决定超平面的位置和方向起关键作用。
SVM的目标是最大化支持向量到超平面的间隔,即最大化决策边界的宽度。
SVM可以使用核函数将数据映射到高维空间,从而在低维空间中无法线性分离的数据可以在高维空间中变得线性可分。
支持向量机(SVM)可以使用不同的核函数来处理线性不可分的问题,将数据映射到高维空间,以便在该空间中找到线性的超平面。以下是一些常见的SVM核函数:
在特征空间中直接进行线性划分。适用于线性可分的情况。
将数据映射到更高次的多项式特征空间。c 是常数,d 是多项式的次数。
使用高斯分布函数进行映射,可以处理非线性问题。σ 是控制核函数宽度的参数。
使用双曲正切函数进行映射,常用于神经网络。
使用拉普拉斯分布进行映射,与RBF核类似,但对异常值更敏感。
这些核函数允许SVM在更高维度的空间中进行非线性映射,从而使得在原始特征空间中线性不可分的问题变得可分。选择适当的核函数通常依赖于具体问题和数据的性质,以及对模型的理解。
对于非线性可分的数据,SVM引入软间隔,允许一些样本不满足硬间隔条件,以提高模型的泛化能力。
scikit-learn
):以下是一个简单的SVM分类示例:
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report
# 加载数据集
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.2, random_state=42)
# 创建SVM模型
model = SVC(kernel='linear') # 使用线性核函数
# 训练模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)
print(f'Accuracy: {accuracy}')
print(f'Classification Report:\n{report}')
这是一个使用线性核函数的示例。对于非线性问题,可以尝试使用不同的核函数,如径向基核函数(RBF kernel)。SVM的性能和调参密切相关,通常需要根据具体问题进行调优。
kernel='linear'
这是最简单的核函数,对应于线性SVM,适用于线性可分的情况。
kernel='poly'
除了指定kernel外,还可以设置degree参数来指定多项式的次数。例如,degree=3表示使用三次多项式。
kernel='rbf'
这是一种常用的非线性核函数,通过调整gamma参数可以影响决策边界的“柔软性”。
kernel='sigmoid'
使用双曲正切函数进行映射,通常在神经网络中使用。
除了上述常见的核函数,scikit-learn还允许使用自定义的核函数,通过指定kernel='precomputed’并传递预计算的核矩阵。