sklearn 之 One-Class SVM的使用示例与解析

svm.ocsvm的使用示例如下(本代码在官方代码的基础上增加了注释和部分分析代码): 

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager
from sklearn import svm

# 背景坐标点阵
xx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500))

# 生成训练数据
X = 0.3 * np.random.randn(100, 2)# 100个正常数据,shape=(100,2),[0,1)之间
X_train = np.r_[X + 2, X - 2] # 向左侧平移2得到一组数据,向右侧平移2得到一组数据,两组数据串联,

# 生成测试数据
X = 0.3 * np.random.randn(20, 2)# 20个异常数据
X_test = np.r_[X + 2, X - 2] # 向左侧平移2得到一组数据,向右侧平移2得到一组数据,两组数据串联,

# 生成20个异常数据,
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))

# 训练模型
clf = svm.OneClassSVM(nu=0.1, kernel="rbf", gamma=0.1)
clf.fit(X_train)

#----》判断数据是在超平面内还是超平面外,返回+1或-1,正号是超平面内,负号是在超平面外
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)

#----》计算样本到超平面的距离,全部大于0
y_score_train = clf.score_samples(X_train)
y_score_test = clf.score_samples(X_test)
y_score_outliers = clf.score_samples(X_outliers)

#----》计算样本到超平面的距离,含正负号,正好表示在超平面内,负号表示在超平面外
y_deci_train = clf.decision_function(X_train)
y_deci_test = clf.decision_function(X_test)
y_deci_outliers = clf.decision_function(X_outliers)

# 统计预测错误的个数
n_error_train = y_pred_train[y_pred_train == -1].size
n_error_test = y_pred_test[y_pred_test == -1].size
n_error_outliers = y_pred_outliers[y_pred_outliers == 1].size

# 计算网格数据到超平面的距离,含正负号
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) # ravel表示数组拉直
Z = Z.reshape(xx.shape)

"""
绘图
"""
plt.title("Novelty Detection")
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), 0, 7), cmap=plt.cm.PuBu)  #绘制异常区域的轮廓, 把异常区域划分为7个层次
a = plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='darkred')  # 绘制轮廓,SVM的边界点(到边界距离为0的点
plt.contourf(xx, yy, Z, levels=[0, Z.max()], colors='palevioletred')  # 绘制正常样本的区域,使用带有填充的轮廓

s = 40 # 样本点的尺寸大小
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white', s=s, edgecolors='k') # 绘制训练样本,填充白色,边缘”k“色
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='blueviolet', s=s,edgecolors='k') # 绘制测试样本--正常样本,填充蓝色,边缘”k“色
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='gold', s=s,edgecolors='k')# 绘制测试样本--异常样本,填充金色,边缘”k“色

plt.axis('tight')
plt.xlim((-5, 5))
plt.ylim((-5, 5))

# 集中添加图注
plt.legend([a.collections[0], b1, b2, c],
           ["learned frontier", "training data",
            "test regular data", "test abnormal data"],
           loc="upper left",
           prop=matplotlib.font_manager.FontProperties(size=11))
plt.xlabel("error train: %d/200 ;   errors novel regular: %d/40 ;   errors novel abnormal: %d/40"
	% (n_error_train, n_error_test, n_error_outliers))
plt.show()

示例结果如下:

 

下面简单介绍一下 sklearn.svm.OneClassSVM 函数的用法:

  1. fit(self, X[, y, sample_weight]) 训练获得样本 X 的分布边界超平面
  2. predict(self, X) 返回样本 X 的标签,返回数值为+1和-1, +1表示在边界内部,-1表示在边界外部
  3. decision_function(self, X) 计算数据点到分割超平面的有符号距离,正距离表示样本在超平面以内,负距离表示样本在超平面以外
  4. score_samples(self, X)返回样本到超平面的距离?所有返回值均为正数,目前还不知道其与decision_function之间的关系
  5. get_params(self[, deep]) 获取估计器训练参数

对于可视化图像绘制的函数

  1. matplotlib.pyplot.contour 绘制轮廓曲线
  2. matplotlib.pyplot.contourf 绘制带填充的轮廓曲线

plt.contour 与plt.contourf具有相同的参数和调用方式,唯一的不同就是plt.contour是带填充的轮廓(相邻轮廓曲线之间有颜色填充)。

plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), 0, 7), cmap=plt.cm.PuBu)的参数解释如下:

  1. xx,yy,Z分别表示x坐标,y坐标,与对应坐标点处的高度
  2. levels是一个列表,存储待绘制的等高线的高度
  3. cmap代表颜色映射,具体的样式见 Colormap reference。如果想显示热力图,只要设置属性cmap=plt.cm.hot就能显示热力图。

参考:

sklearn 之 单类支持向量机(One-Class SVM)

matplotlib.pyplot contourf()函数的使用

 

  • 6
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值