numpy
、pandas
、sklearn
、matplotlib
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
Svm
(support Vector Mac
)又称为支持向量机,是一种二分类的模型。支持向量机可以分为线性和非线性两大类。其主要思想是找到空间中的一个更够将所有数据样本划开的直线(平面或者超平面),并且使得数据集中所有数据到这个超平面的距离最短。SVM
有两种方式实现:LinearSVC(C)
和SVC(C=1, kernel="linear")
LinearSVC
(Linear Support Vector Classification
)线性支持向量机,核函数是 linear
,相关参数:
C
:目标函数的惩罚系数C,默认C = 1.0;loss
:指定损失函数. squared_hinge
(默认), squared_hinge
penalty
: 惩罚方式,str
类型,l1, l2dual
:选择算法来解决对偶或原始优化问题。当nsamples
>nfeatures
时dual
=false
tol
:svm
结束标准的精度, 默认是1e - 3
multi_class
:如果y输出类别包含多类,用来确定多类策略, ovr
表示一对多,crammer_singer
优化所有类别的一个共同的目标 。如果选择crammer_singer
,损失、惩罚和优化将会被被忽略。max_iter
: 要运行的最大迭代次数。int
,默认1000。SVC
用于分类,用libsvm
实现,参数如下:
C
: 惩罚项,默认为1.0,C越大容错空间越小;C越小,容错空间越大kernel
: 核函数的类型,可选参数为:
linear
: 线性核函数poly
: 多项式核函数rbf
: 高斯核函数sigmod
: sigmod
核函数(竟然还有这种核函数)precomputed
: 核矩阵,表示自己提前计算好核函数矩阵degree
: 多项式核函数的阶,默认为3,只对多项式核函数生效,其他的自动忽略gamma
: 核函数系数,可选,float
类型,默认为auto
。只对rbf
,poly
,sigmod
有效。如果gamma
为auto
,代表其值为样本特征数的倒数,即1/n_features
.coef0
:核函数中的独立项,float
类型,可选,默认为0.0。只有对poly
和sigmod
核函数有用,是指其中的参数cprobability
:是否启用概率估计,bool
类型,可选参数,默认为False
,这必须在调用fit()
之前启用,并且会fit()
方法速度变慢tol
:svm
停止训练的误差精度,float
类型,可选参数,默认为1e^-3
cache_size
:内存大小,float
,可选,默认200。指定训练所需要的内存,单位MB
class_weight
:类别权重,dict
类型或str
类型,可选,默认None
。给每个类别分别设置不同的惩罚参数C,如果没有,则会给所有类别都给C=1,即前面指出的C。如果给定参数balance
,则使用y的值自动调整与输入数据中的类频率成反比的权重max_iter
:最大迭代次数,int
类型,默认为-1,不限制decision_function_shape
:决策函数类型,可选参数ovo
和ovr
,默认为ovr
。ovo
表示one vs one
,ovr
表示one vs rest
。(多分类)random_state
:数据洗牌时的种子值,int
类型,可选,默认为None
support_ : array
类型,支持向量的索引support_vectors_
: 支持向量的集合n_support_
: 比如SVC
将数据集分成了4类,该属性表示了每一类的支持向量的个数。dual_coef_
: array, shape = [n_class-1, n_SV]
对偶系数,支持向量在决策函数中的系数,在多分类问题中,这个会有所不同。coef_ : array
,该参数仅在线性核时才有效,指的是每一个属性被分配的权值。intercept_
:array
, shape = [n_class * (n_class-1) / 2]
决策函数中的常数项bias
。和coef_
共同构成决策函数的参数值.python
命令进入python
编译import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
# 获取所需数据集
iris=datasets.load_iris()
#每行的数据,一共四列,每一列映射为feature_names中对应的值
X=iris.data
#每行数据对应的分类结果值(也就是每行数据的label值),取值为[0,1,2]
Y=iris.target
#通过Y=iris.target.size,可以得到一共150行数据,三个类别个50条数据,并且数据是按照0,1,2的顺序放的
#只取y<2的类别,也就是0 1并且只取前两个特征
X=X[:,:2]
#获取0 1类别的数据
Y1=Y[Y<2]
y1=len(Y1)
#获取0类别的数据
Y2=Y[Y<1]
y2=len(Y2)
X=X[:y1,:2]
plt.scatter(X[0:y2,0],X[0:y2,1],color='red')
plt.scatter(X[y2+1:y1,0],X[y2+1:y1,1],color='blue')
plt.show()
#标准化
standardScaler=StandardScaler()
standardScaler.fit(X)
#计算训练数据的均值和方差
X_standard=standardScaler.transform(X)
#用scaler中的均值和方差来转换X,使X标准化
svc=LinearSVC(C=1e9)
svc.fit(X_standard,Y1)
meshgrid()
返回了有两个向量定义的方形空间中的所有点的集合。x0是x值,x1是y的值ravel()
将向量拉成一行c_[]
将向量排列在一起contourf()
等高线def plot_decision_boundary(model, axis):
x0, x1 = np.meshgrid(
np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),# 600个,影响列数
np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),# 600个,影响行数
)
# x0 和 x1 被拉成一列,然后拼接成360000行2列的矩阵,表示所有点
X_new = np.c_[x0.ravel(), x1.ravel()] # 变成 600 * 600行, 2列的矩阵
y_predict = model.predict(X_new) # 二维点集才可以用来预测
zz = y_predict.reshape(x0.shape) # (600, 600)
from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
#print(X_new)
将空行与注释删除,以免出现缩进错误.之后双击回车退出,再输入以下命令。
plot_decision_boundary(svc, axis=[-3, 3, -3, 3])
plt.scatter(X_standard[0:y2,0], X_standard[0:y2,1],color='red')
plt.scatter(X_standard[y2:y1,0], X_standard[y2:y1,1],color='blue')
plt.show()
svc2=LinearSVC(C=0.01)
svc2.fit(X_standard,Y1)
print(svc2.coef_)
print(svc2.intercept_)
plot_decision_boundary(svc2, axis=[-3, 3, -3, 3])
plt.scatter(X_standard[0:y2,0], X_standard[0:y2,1],color='red')
plt.scatter(X_standard[y2:y1,0], X_standard[y2:y1,1],color='blue')
plt.show()
def plot_svc_decision_boundary(model, axis):
x0, x1 = np.meshgrid(
np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),# 600个,影响列数
np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),# 600个,影响行数
)
# x0 和 x1 被拉成一列,然后拼接成360000行2列的矩阵,表示所有点
X_new = np.c_[x0.ravel(), x1.ravel()] # 变成 600 * 600行, 2列的矩阵
y_predict = model.predict(X_new) # 二维点集才可以用来预测
zz = y_predict.reshape(x0.shape) # (600, 600)
from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
w = model.coef_[0]
b = model.intercept_[0]
index_x = np.linspace(axis[0], axis[1], 100)
# f(x,y) = w[0]x1 + w[1]x2 + b
# 1 = w[0]x1 + w[1]x2 + b 上边界
# -1 = w[0]x1 + w[1]x2 + b 下边界
y_up = (1-w[0]*index_x - b) / w[1]
y_down = (-1-w[0]*index_x - b) / w[1]
x_index_up = index_x[(y_up<=axis[3]) & (y_up>=axis[2])]
x_index_down = index_x[(y_down<=axis[3]) & (y_down>=axis[2])]
y_up = y_up[(y_up<=axis[3]) & (y_up>=axis[2])]
y_down = y_down[(y_down<=axis[3]) & (y_down>=axis[2])]
plt.plot(x_index_up, y_up, color="black")
plt.plot(x_index_down, y_down, color="black")
将空行与注释删除,以免出现缩进错误.之后双击回车退出,再输入以下命令。
plot_svc_decision_boundary(svc, axis=[-3, 3, -3, 3])
plt.scatter(X_standard[0:y2,0], X_standard[0:y2,1],color='red')
plt.scatter(X_standard[y2:y1,0], X_standard[y2:y1,1],color='blue')
plt.show()
plot_svc_decision_boundary(svc2, axis=[-3, 3, -3, 3])
plt.scatter(X_standard[0:y2,0], X_standard[0:y2,1],color='red')
plt.scatter(X_standard[y2:y1,0], X_standard[y2:y1,1],color='blue')
plt.show()
SVM线性分类——鸢尾花Iris数据集.
Anaconda详细安装及使用教程(带图文).