《统计学习方法》 感知机Python 对偶形式实现

来源:互联网 发布:树莓派开源人工智能 编辑:程序博客网 时间:2024/05/16 07:37
上个博客中http://blog.csdn.net/tudaodiaozhale/article/details/77193533给大家讲了感知机的原始形式的实现。

接着给大家看看对偶形式的实现,其实跟原始形式就除了那个train不太一样,但是为了完整性,还是全部代码都写吧。首先是书中的数据集以及整体运行情况。

dataSet = [[3, 3],           [4, 3],           [1, 1]]labels = [1, 1, -1]perceptron = Perceptron(dataSet, labels)    #创建一个感知机对象weights, bias = perceptron.train() #训练print "结果是:%s, %s" % (weights, bias)
在构造函数中赋值到我们对象中的成员变量中。

def __init__(self, dataSet, labels):    #初始化数据集和标签        self.dataSet = np.array(dataSet)        self.labels = np.array(labels).transpose()
这次不需要符号函数了。我们来直接看下训练函数。
def train(self):        m, n = np.shape(self.dataSet)  #m是行和n是列        weights = np.zeros(n)        bias = 0        flag = False        Gram = np.zeros((m , m))        for i in range(m):  #计算Gram矩阵            for j in range(m):                Gram[i][j] = dataSet[i] * np.mat(dataSet[j]).transpose()        print Gram        a = np.zeros(m)        while flag != True:            flag = True            for i in range(m):  #遍历样本                sum = 0                for j in range(m):  #求误分条件                    sum += a[j] * self.labels[j] * Gram[j][i]                sum += bias                print sum                if (sum * self.labels[i] <= 0):                    a[i] += 1                    bias += self.labels[i]                    flag = False        for i in range(m):            weights += a[i] * self.dataSet[i] * self.labels[i]        return weights, bias

先按惯例求出行和列,然后按书上说的求出Gram矩阵,用于后面的计算。

其次设置个flag标记,这个标记是用来标记训练出来的参数w和b 是否符合当前的训练样本了(进入循环时先设置为True,遍历训练样本时一旦发现有不符合的就设置为False)。

然后就是误分条件了。

对偶形式的原始条件有点复杂,仔细看下代码。

然后就是a和bias的更新了

最后是根据a求出权重,返回。


阅读全文
0 0
原创粉丝点击