ocsvm单分类器使用
每部分代码都有注释,较为详尽了都能看懂。代码可见于开源中国ocsvm的讲解博客,其他很多站也能搜到,看起来还是比较直观步骤也比较清晰,核心的步骤都有,于是就挨个查了一下。
最终做了几个小地方的修改,主要是测试数据和数据个数的调整。
先说下目标,比如你一堆数据是一堆点很多坐标,都是正常数据(图中白色)利用其作为训练集,再有一些测试集的数据(有正样本(图中紫色)和负样本(图中黄色)),利用训练出的模型判定测试集样本是否为正常数据。
这和CNN就有差别了,CNN每个训练样本都有标签,知道哪些正样本哪些负样本,但两种样本数量相对均衡。这里就不均衡了,拿到的全是正样本需要找到异常数据,这就可以称之为异常检测(AD)。
看下这段代码,从结果看,输出的图片是散点图配上两类等高线,填充的等高线是判定区域之外的部分,红色(偏红那个,其实不是红色)部分是判定是否是异常数据的平面,也就是所谓的根据训练得到的分界线。
代码如下
'''
ocsvm1
'''
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager
from sklearn import svm
# linespace(start,end,num)在start和end之间均匀间隔生成的num个数
# meshgrid生成网格点坐标矩阵,xx,yy = np.meshgrid(x,y),xx与yy一一对应坐标数据
# 如xx,yy = np.meshgrid(x,y) x = [0,1,2] y = [0,1] xx = [[0,1,2],[0,1,2]] yy = [[0,0,0],[1,1,1]]
# xx和yy用于画等高线
xx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500))
# Generate train data
# np.random.randn(d1,d2,...,dn),与np.random.rand(d1,d2,...,dn)生成[0,1)范围内的数据相似
# np.random.randn()符合标准正态分布N(0,1)以0为均值1为标准差,d均为生成数据的维度
X = 0.3 * np.random.randn(200, 2)
Y = 0.3 * np.random