感知机(perceptron)是二类分类的线性模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误差分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。
![](https://img2018.cnblogs.com/blog/704960/201810/704960-20181024153552184-1654289714.png)
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()