频道栏目
首页 > 程序开发 > 综合编程 > 其他综合 > 正文
对偶感知器的python实现
2017-04-17 09:51:54           
收藏   我要投稿

对偶感知器的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的值越大,则说明其更新的次数越多,那么就意味着它距离分离超平面越近,也就越难正确分类。换句话说,这样的实例对于学习结果的影响最大!
毕竟为了这一个数据点,分离超平面移动自己移动了那么多次呢。
点击复制链接 与好友分享!回本站首页
上一篇:单例模式实现:枚举单例
下一篇:GitHub使用步骤
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站