📜  Python中的单个神经元神经网络(1)

📅  最后修改于: 2023-12-03 15:34:26.116000             🧑  作者: Mango

Python中的单个神经元神经网络

神经网络是一种用于机器学习的强大工具。它们由许多互相连接的神经元组成,可以学习输入和输出之间的关系,从而预测未来数据。单个神经元也称为感知器是神经网络中最基本的单元,可以用于分类和回归问题。

安装必备模块

在编写Python代码之前,需要安装以下模块:

  • NumPy: 这是Python中用于科学计算的主要库,它用于大规模数组和矩阵计算。
  • Matplotlib: 这是Python中用于数据可视化的主要库。
  • pandas: 这是Python中用于数据处理的主要库。

如果还没有安装这些模块,可以通过以下命令安装:

pip install numpy matplotlib pandas
创建单个神经元

一个神经元由以下几个部分组成:

  1. 输入
  2. 权重
  3. 偏移(常数)
  4. 激活函数
  5. 输出

在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()

decision_boundary

可以看到,单个神经元已经可以正确地将Setosa和Versicolor分类到一个单一区域,将Virginica分类到另一个区域。