python_MachineLearning_感知机PLA

感知机:线性二类分类器(linear binary classifier)
 

感知机(perceptron)是二类分类的线性模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误差分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。

 
 
import numpy as np
import matplotlib.pyplot as plt

datafile = open('data.txt')

xx = []
yy = []

#read data from file
line = datafile.readline()
while line:
    p = line.split()
    print(p)
    xx.append((1, float(p[0]), float(p[1])))
    yy.append(int(p[2]))
    line = datafile.readline()

print(xx)
print(yy)
xx_arr = np.array(xx)  #numpy的array,相当于向量,可用于运算
yy_arr = np.array(yy)

w = np.array([1, 0, 0])
delta = 1

for i in range(100):
    false = -1
    for j in range(len(xx_arr)):
        if int(yy_arr[j]) != np.sign(np.dot(w, xx_arr[j])): #numpy.dot求两向量内积
            false = j
            break
    if false == -1:
        break
    w = w + delta * yy_arr[false] * xx_arr[false] #更新w向量

#使用matplotlib.pyplot绘制函数
line_x1 = np.linspace(0,5,50) #生成[0,5]之间均匀分布的50个x1
line_x2 = [(-w[1]*x-w[0])/w[2] for x in line_x1] #每个x1对应的x2
plt.plot(line_x1,line_x2)

#使用matplotlib.pyplot绘制点
for i in range(len(xx_arr)):
    if yy_arr[i] == 1:
        plt.plot(float(xx_arr[i][1]), float(xx_arr[i][2]),'go')
    else:
        plt.plot(float(xx_arr[i][1]), float(xx_arr[i][2]), 'ro')

plt.show()
原文地址:https://www.cnblogs.com/jasonlixuetao/p/9843777.html