contourf参数 python_Python机器学习(六)
3.4 使用支持向量机最大化分类间隔0 引子支持向量机(SVM)可以看做感知器的拓展。感知器算法中,我们可以最小化分类误差。而在SVM中,我们的优化目标是最大化分类间隔。此处间隔是指两个分离的超平面的距离,而最靠近超平面的训练样本被称作支持向量。1 对分类间隔最大化的直观认识其实就是确定了决策边界的系数之后,移动决策边界(超平面),使得平行的两个超平面在保持依然为决策边界的前提下,距离最大化。注:
·
3.4 使用支持向量机最大化分类间隔
0 引子
支持向量机(SVM)可以看做感知器的拓展。感知器算法中,我们可以最小化分类误差。而在SVM中,我们的优化目标是最大化分类间隔。此处间隔是指两个分离的超平面的距离,而最靠近超平面的训练样本被称作支持向量。
1 对分类间隔最大化的直观认识
其实就是确定了决策边界的系数之后,移动决策边界(超平面),使得平行的两个超平面在保持依然为决策边界的前提下,距离最大化。
注:在实践中,通过二次规划的方法很容易得到我们想得到的最值。
2 使用松弛变量解决非线性可分问题
- 原因
对于非线性可分的数据来说,需要放松线性约束条件,以保证在适当的罚项成本下,对错误分类的情况进行优化时能够收敛。
- SVM与logistic回归
logistic回归优点:
logistic回归会尽量最大化训练数据集的条件似然,这使得它比支持向量机更易于处理离群点;
logistic回归模型简单更容易实现;
logistic回归模型更新方便,当应用于流数据分析时,这是非常具备吸引力的。
SVM优点:
支持向量机更关注接近决策边界的点。
3 使用scikit-learn实现SVM
前面章节用到了scikit-learn中的Perception和LogisticRegression类,它们都使用了LIBINEAR库,LIBLINEAR是高度优化的C/C++库。类似的,用于训练SVM模型的SVC类使用了LIBSV M库。
与使用原生python代码实现线性分类器相比,使用 LIBLINEAR和LIBSVM库实现由其优点:在用于大型数据时,可以获得极高的训练速度,然而有时候数据集很大导致没办法加载到内存中,针对这种情况,scikit-learn提供了SGDClassifier类供用户选择,这个类还通过partial_fit方法支持在线学习。SGDClassifier类背后的概念类似于第2章中实现的随机梯度算法。我们可以使用默认参数以如下方式分别初始化基于随机梯度下降的感知器、logistic回归以及支持向量机模型。
from sklearn.linear import SGDClassifier
ppn = SGDClassifier(loss = 'perception')
lr = SGDClassifier(loss='log')
svm = SGDClassifier(loss='hinge')
3.5 使用核SVM解决非线性问题
0 引子
支持向量机可以很容易的使用“核技巧”来解决非线性可分问题。在讨论SVM的基本概念之前,先通过一个例子来认识一下所谓的非线性可分问题到底是什么。
1 例子
通过如下代码,我们使用Numpy中的logical_xor函数创建了一个经过异或操作的数据集,其中100个样本属于类别1,另外的100个样本属于类别-1
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
X_xor = np.random.randn(200, 2)
y_xor = np.logical_xor(X_xor[:, 0] > 0, X_xor[:, 1] > 0)
y_xor = np.where(y_xor, 1, -1)
plt.scatter(X_xor[y_xor==1, 0], X_xor[y_xor==1, 1], c='b', marker='x', label='1')
plt.scatter(X_xor[y_xor==-1, 0], X_xor[y_xor==-1, 1], c='r', marker='s', label='-1')
plt.ylim(-3.0)
plt.legend()
plt.show()
执行上述代码可以得到一个异或数据集,其图像为:
显然通过之前的SVM和logistic回归模型是不能把它线性分类的,从图里面也看不出明显的线性决策边界。
而核方法处理此类非线性可分数据的基本理念就是:通过映射函数把样本的原始特征映射到一个使样本线性可分的更高维空间中。
就这里例子来说,我们可以将二维数据集通过下列映射转换到新的三维特征空间中,从而使样本可分。![]()
这使的我们可以将图中的两个类别通过线性超平面进行分割。然后如果我们把此超平面映射会原始特征空间,则可先行分割两类数据的超平面就变成非线性的了。
2 使用背景
为了使用SVM解决非线性问题,我们通过一个映射函数将训练数据映射到更高维度的特征空间,并在新的特征空间上训练一个线性SVM模型。然后将同样的映射函数应用于新的、未知数据上。进而使用新特征空间上的线性SVM模型对其进行分类。
但是这种思路是有问题的。
构建新的特征空间带来非常大的计算成本,特别是在处理高维数据的时候。这是就用到了我们称作核技巧的方法。
3 使用
下面使用核技巧来对之前给的异或数据来进行分类。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from matplotlib.colors import ListedColormap
def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):
# setup marker generator and color map
markers = ('s', 'x', 'o', '^', 'v')
colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
cmap = ListedColormap(colors[:len(np.unique(y))])
# plot the decision surface
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
# 生成两个个二维的矩阵
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) # .T是求转置
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha = 0.4, cmap = cmap)
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())
# plot all samples
X_test, y_test = X[test_idx, :], y[test_idx]
for idx, c1 in enumerate(np.unique(y)):
plt.scatter(x=X[y == c1, 0], y =X[y == c1, 1], alpha=0.8, c=cmap(idx), marker=markers[idx], label=c1)
# highlight test samples
if test_idx:
X_test, y_test = X[test_idx, :], y[test_idx]
plt.scatter(X_test[:, 0], X_test[:, 1], c='', alpha=1.0, linewidth=1, marker='o', s=55, label='test set')
np.random.seed(0)
X_xor = np.random.randn(200, 2)
y_xor = np.logical_xor(X_xor[:, 0] > 0, X_xor[:, 1] > 0)
y_xor = np.where(y_xor, 1, -1)
plt.scatter(X_xor[y_xor==1, 0], X_xor[y_xor==1, 1], c='b', marker='x', label='1')
plt.scatter(X_xor[y_xor==-1, 0], X_xor[y_xor==-1, 1], c='r', marker='s', label='-1')
plt.ylim(-3.0)
plt.legend()
plt.show()
svm = SVC(kernel='rbf', random_state=0, gamma=0.10, C=10.0)
svm.fit(X_xor, y_xor)
plot_decision_regions(X_xor, y_xor, classifier=svm)
plt.legend(loc='upper left')
plt.show()
其中svm中gamma的值会影响图像的拟合程度。越大拟合的越好。
更多推荐




所有评论(0)