我理解很好的感知器,所以只在内核上加注,但我不熟悉matemathic表达式,所以请给我一个数值例子和内核指南。
例如:
我的感知器超平面是x1*w1+x2*w2+x3*w3+b=0;
RBF
内核公式:k(x,z) = exp((-|x-z|^2)/2*variance^2)
这里采取径向基函数内核的动作。 x
是输入,z
变量是什么?
或者,如果公式中存在差异,我必须计算方差吗?
在某个地方,我已经理解,所以我必须在感知器决策函数x1*w1+x2*w2+x3*w3+b=0;
中插入这个公式但是它看起来如何看起来如果我插入?
我想问一个数字例子以避免混淆。
答案 0 :(得分:1)
如您所知,可以训练线性感知器进行二元分类。更确切地说,如果{n}空间中有n
个要素x1, x2, ..., xn
,Rn
,并且您希望将它们标记为2个类别y1 & y2
(通常为-1和+1),您可以使用线性感知器定义超平面w1*x1 + ... + wn*xn + b = 0
来执行此操作。
w1*x1 + ... + wn*xn + b > 0 or W.X + b > 0 ==> class = y1
w1*x1 + ... + wn*xn + b < 0 or W.X + b < 0 ==> class = y2
线性感知器只有在问题在Rn
中可线性分离时才能正常工作。例如,在2D空间中,这意味着一条线可以分开两组点。
<强>算法强>
一种常见的训练感知器的算法,即根据w's & b
数据点,N
及其标签X1, ..., XN
找到权重和偏差Y1, ..., YN
,以下内容:
Initialize: W = zeros(n,1); b = 0
For i=1 to N:
Calculate F(Xi) = W.Xi + b
If F(Xi)*Yi <= 0:
W <--- W + Xi*Yi
b <--- b + Yi
这将给出W & b
的最终值。此外,基于训练,W
将是训练点的线性组合,Xi's
,更准确地说,是错误分类的训练点。 W = a1*X1 + ... + ...aN*XN
a's
{0,y1,y2}
位于Z
。{/ 1>
现在,如果有一个新点,让我们说F(Z) = W.Z + b = a1*(X1.Z) + ... + aN*(XN.Z) + b
,要标记,我们会检查3rd coordinate = 0
的符号。有趣的是,只有新点和训练点的内在产品才能参与其中。
现在,如果问题不能线性分离,可能会尝试进入更高维空间,超平面可以在其中进行分类。例如,考虑2D空间中的圆。圆圈内外的点不能用线分开。但是,如果您发现可以将点转换为3D空间的变换,使得前2个坐标对于所有点保持相同,并且第3个坐标分别对于圆内外的点变为+1和-1,则定义为P(X)
的平面可以分离点。
找到这样的转换可能很困难并且计算量很大,因此引入了内核技巧。请注意,我们只使用了新点的内积和训练点。内核技巧使用这个事实并定义转换点的内积而不实际找到转换。
如果未知转换为K(Xi,Xj) = <P(Xi),P(Xj)>
,则内核函数将为:
P
。因此,不是查找Initialize: F(X) = 0
For i=1 to N:
Calculate F(Xi)
If F(Xi)*Yi <= 0:
F(.) <--- F(.) + K(.,Xi)*Yi + Yi
,而是定义核函数,它们表示高维空间中内积的标量结果。关于哪些函数可以是内核函数,也就是对应于另一个空间中的内积,也有定理。
选择内核函数后,算法将按如下方式修改:
F(.) = a1*K(.,X1) + ... + ...aN*K(.,XN) + b
最后,a's
{0,y1,y2}
位于K(Xi,Xj) = exp(- norm2(Xi-Xj)^2 / (2*sigma^2))
。
径向基函数是一种实际计算无限维空间内积的核函数。它可以写成
sigma = 1
Sigma是您可以使用的一个参数,可以找到最佳值。例如,您可以使用不同的sigma值训练模型,然后根据性能找到最佳值。您可以从F(.)
训练模型以查找Z
后,对于新数据F(Z) = a1*K(Z,X1) + ... + ...aN*K(Z,XN) + b
,x and z
的符号将决定该类。
<强>说明:强>
F
,在每次迭代中,您应该找到当前数据点和所有先前添加的点的内核输出(错误分类的点,因此被添加到<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
$(document).ready(function(){
$(".remove_tr").click(function(){
var tr_id = $(this).parent().attr("id");
var flag = "N"; var row_cnt = 0;
$("#dummy_table tr").each(function(){
if( flag == "Y" ){
$(this).attr("id", "row_"+ row_cnt);
$(this).children("td:first-child").html("row_"+ row_cnt);
$(this).attr("id", "row_"+ row_cnt);
row_cnt++;
}
if( flag =="N" && $(this).attr("id") == tr_id){
var rowArr = $(this).attr("id").split("_");
row_cnt = rowArr[1];
$(this).remove(); flag= "Y";
}
})
});
});
</script>
)。