您的位置:首页 > 编程语言 > Python开发

使用不同的SVM对iris数据集进行分类并绘出结果

2016-04-11 16:03 726 查看

使用不同的SVM对iris数据集进行分类并绘出结果

标签: 机器学习 Python

译文之前的碎碎念

SVM学习了也有一段时间了,公式基本都推导了一遍,明显感觉SVM的推导过程比之前学习的机器学习模型的推导过程都复杂,所以不打算自己实现SVM了,既然使用了Python,那就调用一下第三方的SVM包吧。

经过一番搜索,最终决定使用scikit-learn,原因正如其主页所言:

简单且高效的数据挖掘和数据分析工具

任何人都可以使用,且适用于多种条件

建立在NumPy,SciPy,和matplotlib包之上(意味着科学计算和画图都很方便)

开源,商业可用(BSD许可证)

代码中的英文注释我都翻译成英文了,还增加了一些别的注释,如有疑问,欢迎留言。

最后,在我的MachineLearningAction仓库里面包含有本文的源码,而且还有常见的机器学习算法处理常见数据集的各种实例,欢迎访问。

译文

原文地址:http://scikit-learn.org/stable/auto_examples/svm/plot_iris.html

iris数据集共有4个维度,但是我们只根据前2个维度,使用不同的支持向量机对其中的数据进行分类,以对不同的支持向量机进行比较。这2个维度表示:

萼片长度

萼片宽度

这个例子说明了如何绘制四个不同内核的支持向量机分类的决策面。

线性模型
LinearSVC()
SVC(kernel='linear')
的决策边界略有不同,是因为:

LinearSVC()
使得hinge损失函数最小化,而
SVC
使得平方hinge损失函数最小化

LinearSVC()
使用
1 vs all
的方式进行多分类,而
SVC
使用
1 vs 1
的方式进行多分类

两个线性支持向量机的决策边界都是直线边界,而非线性核函数的支持向量机(多项式核,高斯径向基核)的决策边界都是非线性的曲线边界,这些曲线边界的具体形状取决于核函数以及核函数的参数。

注意:将二维数据集的分类决策函数绘制出来,能够直观的了解其各自的特点,这种方法在高维数据集中就不能使用了。(因为画不出来么~)



源码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets

# 导入数据集
iris = datasets.load_iris()
X = iris.data[:, :2]  # 只取前两维特征
y = iris.target

h = .02  # 网格中的步长

# 创建支持向量机实例,并拟合出数据
C = 1.0  # SVM正则化参数
svc = svm.SVC(kernel='linear', C=C).fit(X, y) # 线性核
rbf_svc = svm.SVC(kernel='rbf', gamma=0.7, C=C).fit(X, y) # 径向基核
poly_svc = svm.SVC(kernel='poly', degree=3, C=C).fit(X, y) # 多项式核
lin_svc = svm.LinearSVC(C=C).fit(X, y) #线性核

# 创建网格,以绘制图像
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))

# 图的标题
titles = ['SVC with linear kernel',
'LinearSVC (linear kernel)',
'SVC with RBF kernel',
'SVC with polynomial (degree 3) kernel']

for i, clf in enumerate((svc, lin_svc, rbf_svc, poly_svc)):
# 绘出决策边界,不同的区域分配不同的颜色
plt.subplot(2, 2, i + 1) # 创建一个2行2列的图,并以第i个图为当前图
plt.subplots_adjust(wspace=0.4, hspace=0.4) # 设置子图间隔

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) #将xx和yy中的元素组成一对对坐标,作为支持向量机的输入,返回一个array

# 把分类结果绘制出来
Z = Z.reshape(xx.shape) #(220, 280)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8) #使用等高线的函数将不同的区域绘制出来

# 将训练数据以离散点的形式绘制出来
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())
plt.title(titles[i])

plt.show()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 机器学习 svm