在单个感知器的情况下 - 文献表明它不能用于分离非线性判别情况,如XOR函数。这是可以理解的,因为线的(在2-D中)的VC维度是3,因此单个2-D线不能区分像XOR那样的输出。
然而,我的问题是为什么单个感知器中的评估函数应该是线性阶跃函数?显然,如果我们有像S形一样的非线性评估函数,这个感知器可以区分XOR的1和0。那么,我在这里错过了一些东西吗?
答案 0 :(得分:12)
如果我们有像sigmoid这样的非线性评估函数,这个感知器可以区分XOR的1和0
这根本不是真的。歧视的标准不是线条的形状(或更高维度的超平面),而是函数是否允许 linear separability 。
没有单个函数可以生成能够分离XOR函数点的超平面。图像中的曲线将点分开,但它不是函数。
要分离XOR点,您必须使用至少两行(或任何其他形状函数)。这将需要两个单独的感知器。然后,您可以使用第三个感知器在符号的基础上分离中间结果。
答案 1 :(得分:3)
我假设sigmoid你实际上不是指sigmoid,而是具有局部最大值的东西。而正常的感知器二元分类器具有以下形式:
f(x) = (1 if w.x+b>0 else 0)
你可以有一个功能:
f(x) = (1 if |w.x+b|<0.5 else 0)
这肯定会起作用,但是相当人为,因为你有效地将你的模型定制到你的数据集,这很糟糕。
正常的感知器算法是否会收敛几乎肯定是不可能的,尽管我可能会弄错。 http://en.wikipedia.org/wiki/Perceptron#Separability_and_convergence你可能需要提出一种全新的方法来适应这种功能,这种方式会破坏目的。
或者你可以使用support vector machine,就像感知器一样,但是能够使用kernel trick来处理更复杂的情况。
答案 2 :(得分:0)
老问题,但我想留下我的想法(如果我错了,任何人都会纠正我。)
我认为你混淆了linear model
和loss
或error
功能的概念。
根据定义,Perceptron是一个线性模型,因此它定义了一个线/平面/超平面,您可以使用它来分离您的类。
标准Perceptron算法提取输出信号,给出-1或1:
yhat = signal(w * X + w0)
这很好,如果您的数据是linearly separable
,最终会收敛。
要改善这一点,您可以使用sigmoid
来平滑[-1,1]范围内的损失函数:
yhat = -1 + 2*sigmoid(w * X + w0)
mean_squared_error = (Y - yhat)^2
然后使用像Gradient Descent这样的数值优化器来最小化整个数据集的误差。这里w0,w1,w2,...,wn是你的变量。
现在,如果原始数据不是linearly separable
,您可以将其转换为可线性分离的方式,然后应用任何线性模型。这是正确的,因为模型是linear on the weights
。
这基本上就像SVM那样的模型可以对你的非线性数据进行分类。
PS: I'm learning this stuff too, so experts don't be mad at me if i said some crap.