感知机是一种二元分类模型,其基本形式为输入向量乘以权重向量再加上偏移量,最后通过激活函数输出一个标志位分类结果。感知机的Python实现可以分为三个部分:初始化参数、训练模型和预测函数。
一、初始化参数
感知机的初始化参数包括权重向量和偏移量。使用numpy数组实现,初始化权重向量为[0,0],偏移量为0:
import numpy as np
import random
class Perceptron:
def __init__(self):
self.weights = np.array([0.0,0.0])
self.bias = 0.0
二、训练模型
训练模型可以分为以下几个步骤:
1.定义激活函数
激活函数是一个阈值函数,如果输入大于等于0,则输出1,否则输出-1:
def activation_function(x):
return 1 if x>=0 else -1
2.定义训练函数
训练函数接受训练数据集和学习率作为输入,输出训练好的模型参数。
def train(self, X, y, learning_rate):
for i in range(len(X)):
x = X[i]
y_ = self.predict(x)
error = y[i] - y_
self.weights += learning_rate * error * x
self.bias += learning_rate * error
3.定义预测函数
预测函数接受输入向量作为输入,输出预测结果。
def predict(self, x):
y_ = np.dot(self.weights, x) + self.bias
return activation_function(y_)
4.定义训练循环
训练循环是训练函数的封装。循环次数可以自定义,当所有样本均正确分类时退出循环。
def fit(self, X, y, learning_rate=0.1, epochs=10):
for epoch in range(epochs):
for i in range(len(X)):
x = X[i]
y_ = self.predict(x)
error = y[i] - y_
self.weights += learning_rate * error * x
self.bias += learning_rate * error
if sum([int(self.predict(X[i])==y[i]) for i in range(len(X))])==len(X):
break
三、预测函数
预测函数接受输入向量作为输入,输出预测结果。
def predict(self, x):
y_ = np.dot(self.weights, x) + self.bias
return activation_function(y_)
四、完整代码
import numpy as np
import random
class Perceptron:
def __init__(self):
self.weights = np.array([0.0,0.0])
self.bias = 0.0
def fit(self, X, y, learning_rate=0.1, epochs=10):
for epoch in range(epochs):
for i in range(len(X)):
x = X[i]
y_ = self.predict(x)
error = y[i] - y_
self.weights += learning_rate * error * x
self.bias += learning_rate * error
if sum([int(self.predict(X[i])==y[i]) for i in range(len(X))])==len(X):
break
def predict(self, x):
y_ = np.dot(self.weights, x) + self.bias
return activation_function(y_)
def activation_function(x):
return 1 if x>=0 else -1
以上是感知机的Python实现。代码中使用了numpy、random等常用Python库,并对每个函数进行详细的注释。使用上述代码可以构建一个简单的感知机模型,用于解决二元分类问题。