量化软件下载:赫兹量化中支持向量机如何应用于交易
支持向量机的工作原理示例:这是 Schnick 吗?
想象一个场景,您是一个研究人员,正在调查一种稀有的动物叫做 Schnicks,该动物只在北极深处出没。由于这研究对象罕见,只有很少一部分被发现过(假设是 5000 只左右)。作为一个研究人员,您被这样一个问题所困惑:我怎么去认定这是一个 Schnick 呢?

编辑
您手头上只有一些见过该动物的其他研究员发表的论文。而这些研究论文中,作者对他们发现的 Schnicks 的某些特征进行了描述,包括身高、体重、肢体数量等等。不过每一篇论文的特征描述都各不相同,而且没有明显的模式……
我们如何用这些数据来确定一只新的动物是 schnick 呢?
支持向量机就有可能成为解决该问题的方案之一。利用支持向量机区分数据的模式,创建一个框架模型以区分动物是 Schnick 还是非 Schnick。第一步就是创建一系列的数据,用于训练你的支持向量机分辨 schnick。训练数据是一系列的输入参数,为支持向量机匹配输出结果,以分析并从中提取模式。
因此,我们必须决定哪些输入参数要用到,以及其数量。理论上说,我们可以获取所希望数量的输入参数,然而这将经常减缓训练的速度(参数越多,支持向量机提取模式的时间越长)。同时,你希望选取在所有 schnick 中较为一致的输入值。比如,动物的身高或体重将是一个很好的输入选择,因为您期望所有的 schnick 都在这些数值上保持相对一致。然而,平均年龄将不是个好选择,因为您知道,所辨认的动物年龄可能差距非常大。
选择了以上的输入参数,我们开始编译熟练数据。有效的训练数据对于支持向量机来说必须满足以下特定条件:
数据必须包含 schnick 这一动物的案例
数据必须包含非 schnick 动物的案例
在这个案例中,我们获得了科学家的研究论文,这些论文已经成功地辨认出 schnick 并列出了它的相关属性。因此我们可以阅读研究论文并提取每一输入的数据,然后对每一案例分配真或假的输出结果。本例中的训练数据可能与下表类似。
训练采样
身高 [mm]
体重 [kg]
N_legs
N_eyes
L_arm [mm]
av_speed [m/s]
f_call [Hz]
Schnick (true/false)
示例 1
1030
45
8
3
420
2.1
14000
TRUE
示例 2
1010
42
8
3
450
2.2
14000
TRUE
示例 3
900
40
7
6
600
6
13000
FALSE
示例 4
1050
43
9
4
400
2.4
12000
TRUE
示例 5
700
35
2
8
320
21
13500
FALSE
示例 6
1070
42
8
3
430
2.4
12000
TRUE
示例 7
1100
40
8
3
430
2.1
11000
TRUE
示例 N
...
...
...
...
...
...
...
...
表 1. schnick 数据例表
一旦我们收集了所有的训练输入和输出数据,我们就可以用它训练我们的支持向量机。在训练过程中,支持向量机会创建一个七维模型,用以将各种训练示例分类为 ture 或 false。支持向量机会不断创建,直到获得精确表示训练数据(在指定误差容许范围之内)的模型。一旦这项训练结束,该模型就可以用来处理新的数据点,按照 true 或 false 归类。
支持向量机到底工作了吗?
借助 Schnick 案例,我写了一个脚本,测试支持向量机实际上是如何很好地处理新的 schnick 的。为了完成这个测试,我使用了“支持向量机学习工具”函数库(可以在“应用市场”中下载)。
为了针对这个案例有效建模,我们首先决定哪些是 Schnick 的实际属性。我假定的这些属性已经列在了下表中。如果一只动物满足以下所有标准,那么它就是 Schnick……
参数
下限
上限
身高 [mm]
1000
1100
体重 [kg]
40
50
N_legs
8
10
N_eyes
3
4
L_arm [mm]
400
450
av_speed [m/s]
2
2.5
f_call [Hz]
11000
15000
表 2. 定义 schnick 的参数汇总
现在我们定义了 Schnick,我们可以用这种定义来试验支持向量机。第一步是创建一个函数:能获取指定动物的 7 个输入,然后返回是否为 schnick 的动物实际分类结果。这个函数将用来生成支持向量机的训练数据,同时在结束的时候评估支持向量机的性能。可以用以下的函数完成:
//+------------------------------------------------------------------+ //| This function takes the observation properties of the observed //| animal and based on the criteria we have chosen, returns true/false whether it is a schnick //+------------------------------------------------------------------+ bool isItASchnick(double height,double weight,double N_legs,double N_eyes,double L_arm,double av_speed,double f_call) { if(height < 1000 || height > 1100) return(false); // If the height is outside the parameters > return(false) if(weight < 40 || weight > 50) return(false); // If the weight is outside the parameters > return(false) if(N_legs < 8 || N_legs > 10) return(false); // If the N_Legs is outside the parameters > return(false) if(N_eyes < 3 || N_eyes > 4) return(false); // If the N_eyes is outside the parameters > return(false) if(L_arm < 400 || L_arm > 450) return(false); // If the L_arm is outside the parameters > return(false) if(av_speed < 2 || av_speed > 2.5) return(false); // If the av_speed is outside the parameters > return(false) if(f_call < 11000 || f_call > 15000) return(false); // If the f_call is outside the parameters > return(false) return(true); // Otherwise > return(true) }
下一步就是创建一个可生成训练输入和输出的函数。本例中的输入,将通过在 7 个输入值的各自设置范围内创建随机数字的方式生成。然后针对每组随机生成的输入,再使用上面的 isItASchnick() 函数生成希望的输出结果。这在下述函数中完成: