Python: 感知机学习算法原始形式

参考了李航老师的《统计学习方法》第二章,利用Python简单写了一个感知机算法,但是画图真是部分真是不太会(丑哭了)。

代码运行过程中会画出分类界面:

最后紫色的是收敛后的解。

Perceptron

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from numpy import *
import numpy as np
import matplotlib.pyplot as plt
import time

plt.ion()
plt.autoscale(enable=True, tight=False)

dataFn = "data.dat>"

def drawSpLine(w, b):
    plt.plot([-b/w[0] if w[1]==0 else 0, 10 if w[0]==0 else -b/w[0]], [10 if w[1]==0 else -b/w[1], -b/w[1] if w[0]==0 else 0])
    plt.draw()
    plt.show()


with open(dataFn) as inFile:
    data = inFile.readlines()
    d = np.loadtxt(data)
    for row in d:
        if row[0]==1:
            plt.plot(row[1], row[2], 'ro')
        else:
            plt.plot(row[1], row[2], 'bo')
    plt.draw()
    plt.show()
    time.sleep(1)
   
w = ones(2)
b = random.randint(10)
eta = 1

print w
print b
drawSpLine(w, b)
time.sleep(1)

while True:
    isConv = True
    for row in d:
        if row[0]*(dot(np.transpose(w), np.transpose(row[1:])) + b) <= 0:
            w = w + eta * row[0] * row[1:]
            b = b + eta * row[0]
            print w, b
            drawSpLine(w, b)
            time.sleep(1)
            isConv = False
            break
    if isConv:
        print "Converged.>"
        break
print "w>", w
print "b>", b

plt.show(block=True)

数据:

1    1   1
1   2   1
1   1   2
-1  4   2
-1  4   3
-1  3   3

原创文章,转载请注明:转载自magic282.me

本文链接地址: 感知机学习算法原始形式

感知机学习算法原始形式bymagic282 is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License .

文章的脚注信息由WordPress的 wp-posturl插件自动生成

原文:http://magic282.me/2015/05/perceptron/

Sidebar