**这个示例程序展示了支持向量机分类器在“新颖性检测”模式下的行为。
程序的第一部分展示了如何使用内核参数gamma来控制类与训练样本的匹配程度。
程序的第二部分表明,SVM通过为Nu选择一个合适的值,可以在一定程度上容忍训练样本中的异常值,
可能的代价是将少数训练样本分类为新颖的。
因此,可以看出,通常最好确保用于新颖性检测的训练样本不包含离群值。
在本例中,我们使用二维数据作为特征,因为它们很容易被可视化为区域。
*显示设置
dev_close_window ()
dev_open_window (0, 0, 600, 600, 'black', WindowHandle)
dev_set_part (0, 0, 199, 199)
dev_update_off ()
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
set_system ('clip_region', 'false')//设置系统参数
*创建一个由多个像素描述的区域
gen_region_points (Region, rand(1000) * 200, rand(1000) * 200)
set_system ('clip_region', 'true')
gen_ellipse (Ellipse1, 100, 70, rad(-60), 90, 40)//获得椭圆区域
gen_ellipse (Ellipse2, 120, 150, rad(40), 50, 30)
union2 (Ellipse1, Ellipse2, Ellipses)//合并
*求交叉区域(由两个椭圆合并得的区域Ellipses 与像素区域Region的交叉部分)
intersection (Ellipses, Region, Region)
*显示设置
dev_clear_window ()
dev_set_draw ('fill')
dev_set_color ('green')
dev_display (Region)
dev_set_color ('white')
set_tposition (WindowHandle, 2, 5)
write_string (WindowHandle, 'Training samples')
set_tposition (WindowHandle, 12, 5)
write_string (WindowHandle, 'Irregularly shaped class')
stop ()
*改变gamma值,控制类与训练样本的匹配程度。
classify_2d_feature_space (Region, WindowHandle, 0.05, 0.01, 1.0)
set_tposition (WindowHandle, 190, 2)
dev_set_color ('white')
write_string (WindowHandle, 'Gamma = 0.05: Loose fit')
stop ()
classify_2d_feature_space (Region, WindowHandle, 0.4, 0.01, 1.0)
set_tposition (WindowHandle, 190, 2)
dev_set_color ('white')
write_string (WindowHandle, 'Gamma = 0.4: Tight fit')
stop ()
*流程同上,改变Nu值,观察训练样本中异常值的影响
set_system ('clip_region', 'false')
gen_region_points (Region, rand(1000) * 200, rand(1000) * 200)
set_system ('clip_region', 'true')
gen_ellipse (Ellipse1, 100, 70, rad(-60), 90, 40)
gen_ellipse (Ellipse2, 80, 150, rad(20), 10, 10)
union2 (Ellipse1, Ellipse2, Ellipses)
intersection (Ellipses, Region, Region)
dev_clear_window ()
dev_set_draw ('fill')
dev_set_color ('green')
dev_display (Region)
dev_set_color ('white')
set_tposition (WindowHandle, 2, 5)
write_string (WindowHandle, 'Training samples')
set_tposition (WindowHandle, 12, 5)
write_string (WindowHandle, 'Class with outliers (errors)')
stop ()
classify_2d_feature_space (Region, WindowHandle, 0.2, 0.01, 1.0)
set_tposition (WindowHandle, 190, 2)
dev_set_color ('white')
write_string (WindowHandle, 'Nu = 0.01: Outliers in result')
stop ()
classify_2d_feature_space (Region, WindowHandle, 0.2, 0.2, 1.0)
set_tposition (WindowHandle, 190, 2)
dev_set_color ('white')
write_string (WindowHandle, 'Nu = 0.2: Outliers not in result')
stop ()
classify_2d_feature_space (Region, WindowHandle, 0.2, 0.2, 0.9)
set_tposition (WindowHandle, 190, 2)
dev_set_color ('white')
write_string (WindowHandle, 'Nu = 0.2: Rejection threshold = 0.9')
函数:classify_2d_feature_space :
代码:
get_region_points (Region, Rows, Cols)//查询区域的像素数。
create_class_svm (2, 'rbf', KernelParam, Nu, 1, 'novelty-detection', 'normalization', 0, SVMHandle)
* Add the samples to the SVM.
for J := 0 to |Rows| - 1 by 1
add_sample_class_svm (SVMHandle, [real(Rows[J]),real(Cols[J])], 0)
endfor
* Train the SVM.
train_class_svm (SVMHandle, 0.001, 'default')
* Classify each point of the 2D feature space and accumulate the classification
* result in a class label image.
*对二维特征空间中的每个点进行分类,并将分类结果累积到类标签图像中。
gen_image_const (Image, 'byte', 200, 200)//创建一个灰度值不变的图像
if (RejectionThreshold == 1.0)
for R := 0 to 199 by 1
for C := 0 to 199 by 1
classify_class_svm (SVMHandle, [real(R),real(C)], 1, Class)
set_grayval (Image, R, C, Class)//逐点绘制轮廓
endfor
endfor
else
for R := 0 to 199 by 1
for C := 0 to 199 by 1
*用支持向量机计算一个特征向量
evaluate_class_svm (SVMHandle, [real(R),real(C)], Result)
Class := Result >= RejectionThreshold
set_grayval (Image, R, C, Class)
endfor
endfor
endif
*显示设置
label_to_region (Image, Classes)//提取一幅图像中灰度值相同的区域。
select_obj (Classes, Class1, 1)//从一个目标元组中选择一个目标
select_obj (Classes, Class2, 2)
dev_clear_window ()
dev_set_draw ('margin')
dev_set_color ('green')
dev_display (Class2)
dev_set_color ('red')
dev_display (Class1)
dev_set_draw ('fill')
dev_set_color ('green')
dev_display (Region)
set_tposition (WindowHandle, 2, 2)
write_string (WindowHandle, 'Class 2 and class region')
dev_set_color ('red')
set_tposition (WindowHandle, 180, 2)
write_string (WindowHandle, 'Class 1 and class region')
return ()
功能:改变gamma和Nu值,不同值对结果的影响