对偶感知器的 python 实现:其原理和原始形式的感知器的原理一样,对偶就是是:实质是一样,只是换了一种实现方式。我们用梯度下降法来更新权值时的公式为:由于太懒,这里用手写给出图片解答。
对偶感知器的实现
- 为了方便计算Xi*Xj,这里先引入gram矩阵,有G = [Xi * Xj], 其中G为N*N矩阵,N为数据的个数,代码实现如下:先给出伪代码:
- def gramMaxtrix(x) : xMat1 = mat(x);
- xMat2 = mat(x);
- result = dot(xMat1, xMat2.T);
- return result;
- 产生数据集的代码如下:其中我们把b从X中分开,方便计算:
- #x为数据集,y为标签,alpha为要迭代计算的值,b为偏置量def crateData() : x = array([[3, 3], [4, 3], [1, 1]]);
- y = array([1, 1, -1]);
- alpha = array([0, 0, 0]);
- b = 0;
- return x,
- y,
- alpha,
- b;
最后,我们给出训练 alpha 和偏置参数 b 的代码
- def trainPerceptron(xVec, yVec, alpha, b) : #定义循环结束标志flag = True;#得到gram矩阵gramM = array(gramMaxtrix(x));
- while flag: #求的样本数据行总数length = len(xVec);
- flag = False;
- for i in range(length) : ans = 0;#计算alpha(j) * y(j) * x(i) * x(j)的和
- for j in range(length) : ans += gramM[i][j] * y[j] * alpha[j];
- ans += b;#判断是否误分类
- if y[i] * (ans) <= 0 : flag = True;#迭代更新alpha alpha[i] += 1;#迭代更新偏置量b b += y[i];
- print(alpha);
- print(i);
- input();
- return alpha,
- b;
来看看运行结果
- >>> x,
- y,
- alhpha,
- b = crateData() >>> trainPerceptron(x, y, alhpha, b)[1 0 0] 0[1 0 1] 2[1 0 2] 2[1 0 3] 2[2 0 3] 0[2 0 4] 2[2 0 5] 2(array([2, 0, 5]), -3)
- 最后我们可以有w和alpha的关系,来求得w,最后得出分离超平面。这里alpha还有一个很有趣的性质,alpha的值越大,则说明其更新的次数越多,那么就意味着它距离分离超平面越近,也就越难正确分类。换句话说,这样的实例对于学习结果的影响最大!毕竟为了这一个数据点,分离超平面移动自己移动了那么多次呢。
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: http://www.92to.com/bangong/2017/04-17/20572753.html