SVM支持向量机

scikit-learn中的make_blobs聚类数据生成器方法
make_blobs():

sklearn.datasets.make_blobs(n_samples=100, n_features=2,centers=3, cluster_std=1.0, center_box=(-10.0, 10.0), shuffle=True, random_state=None)
n_samples:待生成的样本的总数,默认值100。
n_features:每个样本的特征数,默认值2。
centers:类别数,默认值3。
cluster_std:每个类别的方差,如果需要生成不同方差的两个类别,可设置为[1.0,3.0],与centers对应,默认值1.0。
center_box:中心确定之后的数据边界,默认值(-10.0,10.0)。
shuffle:将数据进行洗乱,默认值True。
random_state:随机生成器种子,可以固定数值,固定数值后每次生成的数据集是固定的。

返回值:

X:array of shape [n_samples, n_features]
      The generated samples.    
y:array of shape [n_samples]
      The integer labels for cluster membership of each sample.

numpy中的linspace()方法
numpy.linspace():
在指定间隔内返回均匀间隔的数字,即返回num个均匀分布的样本,在[start,stop]。

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
endpoint:true则范围为[start,stop],false则为[start,stop)。
retstep:若为true则返回之中增加一项间隔。
dtype:推断输出的数据类型,与输入相同。    

返回值:

samples:ndarray
      There are num equally spaced samples in the closed interval [start, stop] or the half-open interval [start, stop) (depending on whether endpoint is True or False).    
step:float, optional
      Only returned if retstep is True
      Size of spacing between samples.

matplotlib中的plt.scatter()和plt.plot()方法
plt.plot():

plt.plot(x, y, format_string, **kwargs)
x,y:x轴y轴数据。
format_string:控制曲线的格式字符串,由颜色字符、风格字符、标记字符组成。
**kwargs:可画多条直线。
color:颜色。
linestyle:线条风格。
marker:标记风格。
markerfacecolor:标记颜色。
markersize:标记尺寸。

plt.scatter():

scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)
x,y:散点的坐标。
s:散点的面积。
c:散点的颜色(默认值为蓝色'b',b——blue,c——cyan,g——green,k——black,m——magenta,r——red,w——white,y——yellow)。
marker:散点样式(默认值为实心圆'o'),间附录6。
alpha:散点透明度,[0,1]之间,0完全透明,1不透明。    
linewidths:散点的边缘线宽。
edgecolors:散点的边缘颜色。
camp:指的是matplotlib.colors.Colormap,相当于多个调色盘的合集,程序中选取的是'autumn'这个调色盘。
进阶:https://zhuanlan.zhihu.com/p/111331057

SVM支持向量机


sklearn.svm中的SVC方法(对象):
SVC():

class sklearn.svm.SVC(self, C=1.0, kernel='rbf', degree=3, gamma='auto_deprecated',
             coef0=0.0, shrinking=True, probability=False,
             tol=1e-3, cache_size=200, class_weight=None,
             verbose=False, max_iter=-1, decision_function_shape='ovr',
             random_state=None)

参数:

c:惩罚系数,用来控制损失函数的惩罚系数,类似于LR中的正则化系数。默认为1,一般需要通过交叉验证来选择一个合适的C,一般来说,噪点比较多的时候,C需要小一些。
kernel:核函数,核函数是用来将非线性问题转化为线性问题的一种方法,默认是“rbf”核函数,常见的核函数见下图。
degree:当核函数是多项式核函数“poly”的时候,用来控制函数的最高次数。这个参数只对多项式核函数有用,是指多项式核函数的阶数 n。如果给的核函数参数是其他核函数,则会自动忽略该参数。
gamma:核函数系数,默认是“auto”,即特征维度的倒数。核函数系数,只对rbf  poly  sigmoid 有效。
coef0:核函数常数值( y = kx + b 的b值),只有“poly”和“sigmoid” 函数有,默认值是0。
shrinking:是否启用启发式收缩方式,默认为True。启发式收缩方式就是:如果能预知哪些变量对应着支持向量,则只要在这些样本上训练就够了,其他样本可不予考虑,这不影响训练结果,但降低了问题的规模并有助于迅速求解,起到一个加速训练的效果。
probability:是否使用概率估计,默认是False。
tol:残差收敛条件,默认是0.0001,与LR中的一致。
chache_size:缓冲大小,用来限制计算量大小,默认是200M,如果机器内存大,推荐使用500MB甚至1000MB。
class_weight:与其他模型中参数含义一样,也是用来处理不平衡样本数据的,可以直接以字典的形式指定不同类别的权重,也可以使用balanced参数值。如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高,当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个系数,选择默认的None。
verbose:是否冗余,默认为False。
max_iter:最大迭代次数,默认为1000。
decision_function_shape:与“multi_class”参数含义类似,可以选择“ovo” 或者“ovr”(0.18版本默认是“ovo”,0.19版本为“ovr”) OvR(one vs rest)的思想很简单,无论你是多少元分类,我们都可以看做二元分类,具体的做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除第K类样本以外的所有样本作为负类,然后在上面做二元分类,得到第K类的分类模型。 OvO(one vs one)则是每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1 和 T2的样本放在一起,把T1作为正例,T2 作为负例,进行二元分类,得到模型参数,我们一共需要T(T-1)/2 次分类。从上面描述可以看出,OvR相对简单,但是分类效果略差(这里是指大多数样本分布情况,某些样本分布下OvR可能更好),而OvO分类相对精确,但是分类速度没有OvR快,一般建议使用OvO以达到较好的分类效果。
random_state:随机种子的大小。

SVM支持向量机

方法:

decision_function(X):计算样本X中的决策函数。
      Parameters:X 
            array-like of shape (n_samples, n_features)
      Returns:X
            ndarray of shape (n_samples, n_classes * (n_classes-1) / 2)
            Returns the decision function of the sample for each class in the model. If decision_function_shape=“ovr”, the shape is (n_samples, n_classes)

fit(X, y, sample_weight=None):根据给定的训练数据拟合支持向量机模型。
      Parameters:sample_weight,样本权重。

代码如下:

from sklearn.datasets.samples_generator import make_blobs
from matplotlib import pyplot as plt
import numpy as np

# n_samples=50 表示取50个点,centers=2表示将数据分为两类
X, y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.6)

# 线性等分详细
xfit = np.linspace(-1, 3.5)
plt.plot([0.6], [2.1], 'x', color='red', markeredgewidth=2, markersize=10)

for m, b in [(1, 0.65), (0.5, 1.6), (-0.2, 2.9)]:
plt.plot(xfit, m * xfit + b, '-k')

# 画图形
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='viridis')
plt.show()
上一篇:【SVM分类】基于布谷鸟算法优化实现SVM数据分类matlab源码


下一篇:【语音识别】基于matlab MFCC和SVM特定人性别识别【含Matlab源码 533期】