📅  最后修改于: 2023-12-03 15:34:26.116000             🧑  作者: Mango
神经网络是一种用于机器学习的强大工具。它们由许多互相连接的神经元组成,可以学习输入和输出之间的关系,从而预测未来数据。单个神经元也称为感知器是神经网络中最基本的单元,可以用于分类和回归问题。
在编写Python代码之前,需要安装以下模块:
如果还没有安装这些模块,可以通过以下命令安装:
pip install numpy matplotlib pandas
一个神经元由以下几个部分组成:
在Python中,可以使用以下代码创建一个单个神经元:
import numpy as np
class Neuron:
def __init__(self, weights, bias):
self.weights = weights
self.bias = bias
def activate(self, x):
y = np.dot(self.weights, x) + self.bias
return 1 / (1 + np.exp(-y))
这里,我们定义了一个Neuron类,它接受权重和偏置参数作为输入,并定义了一个激活函数(sigmoid函数)来计算输出。
现在我们可以使用Neuron类进行分类。为了演示如何使用它,我们将使用Iris数据集作为示例数据集。Iris数据集是一个常用的分类数据集,其中包含3种不同的鸢尾花,分别是Setosa、Versicolor和Virginica。
我们将使用Pandas库中的read_csv函数来加载数据集。以下是加载Iris数据集的代码:
import pandas as pd
iris_data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)
iris_data = iris_data.sample(frac=1).reset_index(drop=True) # shuffle data
iris_data.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class']
我们可以看到,数据集由4个特征和1个类别标签组成。我们将使用前100个样本进行二元分类,即将Setosa和Versicolor类别与Virginica类别区分开。
# 将Setosa和Versicolor类别与Virginica类别区分开
iris_data = iris_data[:100]
iris_X = iris_data[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']].values
iris_y = (iris_data['class'] == 'Iris-setosa').astype(np.int)
接下来,我们可以用一个单个神经元来训练我们的分类器:
class Perceptron:
def __init__(self, n_features):
self.neuron = Neuron(np.zeros(n_features), 0)
def train(self, X, y, n_epochs=100):
for i in range(n_epochs):
for xi, yi in zip(X, y):
output = self.neuron.activate(xi)
error = yi - output
self.neuron.weights += error * xi
self.neuron.bias += error
def predict(self, X):
return np.array([self.neuron.activate(xi) for xi in X])
这里,我们定义了一个Perceptron类,它使用先前定义的Neuron类来实现单个神经元。训练函数train根据提供的输入和输出数据来训练神经元。在每一轮训练中,我们应用激活函数来计算神经元的输出,并计算误差。然后使用误差来更新神经元的权重和偏移。预测函数predict将每个输入样本映射到该类别的概率。
最后,我们可以使用Matplotlib库来可视化分类器的决策边界。首先,我们定义了一个绘图函数,该函数使用训练好的Perceptron对象来绘制决策边界。
def plot_decision_boundary(clf, X, y):
x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1
y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100),
np.linspace(y_min, y_max, 100))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.binary, alpha=0.5)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.binary, edgecolors='black')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
然后,我们实例化一个训练好的Perceptron对象,并使用plot_decision_boundary函数将决策边界可视化。
perceptron = Perceptron(2)
perceptron.train(iris_X[:, :2], iris_y)
plt.figure(figsize=(8, 6))
plot_decision_boundary(perceptron, iris_X[:, :2], iris_y)
plt.show()
可以看到,单个神经元已经可以正确地将Setosa和Versicolor分类到一个单一区域,将Virginica分类到另一个区域。