BP神经网络思想及其Python实现

发布时间 2023-12-20 23:34:29作者: 郝hai

神经网络是一种模拟人类大脑工作方式的计算模型。它由神经元组成,这些神经元相互连接形成网络。每个连接都有一个权重,而神经元则通过激活函数处理输入并生成输出。神经网络可以分为输入层、隐藏层和输出层。在训练过程中,神经网络通过调整权重来学习模式和特征,使其能够进行预测或分类任务。这种学习过程通常依赖于反向传播算法,它通过比较网络输出和实际目标来调整权重。深度学习是神经网络的一种特殊形式,其包含多个深度的隐藏层。深度学习在图像识别、语音识别、自然语言处理等领域取得了显著的成就。卷积神经网络(CNN)用于图像处理,循环神经网络(RNN)用于序列数据,而转换器模型(如BERT)在自然语言处理中表现出色。神经网络的发展受益于大数据和强大的计算资源,推动了人工智能领域的快速发展。它被广泛应用于各种领域,如医疗诊断、金融预测和自动驾驶。

神经元 神经网络

一、神经网络的发展和思想

1.1 神经网络的发展

神经网络的发展经历了几个关键阶段,从最初的概念到如今在各种领域取得巨大成功的深度学习。以下是神经网络发展的主要里程碑:

感知机和早期模型(1943-1960年代): 神经网络的起源可以追溯到上世纪四五十年代,当时Warren McCulloch和Walter Pitts提出了感知机模型,这是一种模拟神经元工作的数学模型。然而,由于感知机存在限制,无法解决一些复杂的问题,神经网络的发展在此时停滞了一段时间。
误差反向传播算法的引入(1970-1980年代): 在这一时期,人们提出了误差反向传播算法,使得神经网络能够更有效地学习和调整权重。这一算法的引入推动了神经网络的再次崛起,但由于当时计算资源有限,神经网络仍然面临训练时间长、性能不佳等问题。
支持向量机和神经网络的衰退(1990-2000年代): 在这段时间内,支持向量机等其他机器学习方法的兴起导致了对神经网络的相对忽视。人们认为神经网络在解决复杂问题上存在限制,因此研究重心转向了其他算法。
深度学习的复兴(2010年至今): 随着大数据的涌现和计算能力的飞速增长,深度学习重新焕发了人们对神经网络的兴趣。深度学习模型,尤其是深度卷积神经网络(CNN)和循环神经网络(RNN),在图像识别、语音识别、自然语言处理等领域取得了巨大成功。此时的神经网络模型变得更加深层,参数更多,能够更好地捕捉和理解复杂的数据模式。
迁移学习、生成对抗网络和注意力机制的兴起(2010年至今): 随着深度学习的发展,一些新的技术和概念被引入,如迁移学习、生成对抗网络(GAN)和注意力机制。这些方法进一步提高了神经网络在各种任务中的性能,使其更加灵活和适用于不同领域。
神经网络的发展不仅推动了人工智能领域的进步,也改变了许多行业的面貌。然而,尽管取得了显著成就,神经网络仍然面临一些挑战,如对大量标注数据的依赖、模型的解释性不足等问题,

1.2 神经网络算法思想

神经网络是一种模拟人脑神经元网络结构的计算模型,其核心思想是通过学习从输入到输出之间的映射关系,以识别模式、进行预测或执行分类任务。以下是神经网络算法的主要思想:

神经元模型: 神经网络的基本组成单元是神经元,它模拟生物神经元的基本功能。每个神经元接收多个输入,通过加权求和后经过激活函数得到输出。这个输出被传递到下一层的神经元,形成网络。
前馈传播: 神经网络通常是分为输入层、隐藏层和输出层。信息从输入层经过隐藏层传递到输出层的过程称为前馈传播。在传播的过程中,每个神经元的输出成为下一层神经元的输入,通过不断传递,网络最终产生输出。
权重调整: 在神经网络中,每个连接都有一个权重,决定了信息在传递过程中的重要性。神经网络的学习过程就是通过调整这些权重,使网络能够对输入数据进行准确的预测。常用的学习算法包括梯度下降和误差反向传播。
激活函数: 激活函数在神经网络中起到引入非线性的作用。常见的激活函数包括Sigmoid、Tanh和ReLU(Rectified Linear Unit)。这些函数帮助神经网络捕捉数据中的非线性关系,使得网络能够更好地适应复杂的模式。
误差反向传播: 在训练神经网络时,通过计算模型输出与实际值之间的误差,利用链式法则将误差从输出层向输入层进行反向传播。这一过程中,根据误差调整权重,使得网络的输出更加接近真实值,从而不断提高网络的性能。
深度学习和深层网络: 随着深度学习的发展,神经网络变得更深、更复杂。深度学习模型包括多个深度的隐藏层,通过多层次的特征提取和抽象,使网络能够学到更加高级和抽象的特征,适用于处理复杂的问题。
优化算法: 为了更有效地训练神经网络,各种优化算法被引入,如随机梯度下降(SGD)、Adam等。这些算法帮助网络更快地收敛到最优解,提高学习效率。
总体而言,神经网络的算法思想在于通过学习数据中的模式和特征,建立输入与输出之间的映射关系,以实现各种任务的自动化处理。这一思想的成功应用推动了人工智能领域的快速发展。

流程图 数据集

三、神经网络算例

关联规则 强关联规则

四、Python实现

4.1 案例1

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules

item_list = [['牛奶', '面包'],
             ['面包', '尿布', '啤酒', '土豆'],
             ['牛奶', '尿布', '啤酒', '可乐'],
             ['面包', '牛奶', '尿布', '啤酒'],
             ['面包', '牛奶', '尿布', '可乐']]

item_df = pd.DataFrame(item_list)

te = TransactionEncoder()
df_tf = te.fit_transform(item_list)
df = pd.DataFrame(df_tf, columns=te.columns_)

frequent_itemsets = apriori(df, min_support=0.05, use_colnames=True)

frequent_itemsets.sort_values(by='support', ascending=False, inplace=True)

# 选择2频繁项集
print(frequent_itemsets[frequent_itemsets.itemsets.apply(lambda x: len(x)) == 2])

association_rule = association_rules(frequent_itemsets, metric='confidence', min_threshold=0.9)

# 关联规则可以提升度排序
association_rule.sort_values(by='lift', ascending=False, inplace=True)

# 将排序后的关联规则输出为一个表格
result_table = pd.DataFrame({
    'Antecedents': [set(a) for a in association_rule['antecedents']],
    'Consequents': [set(c) for c in association_rule['consequents']],
    'Support': association_rule['support'],
    'Confidence': association_rule['confidence'],
    'Lift': association_rule['lift']
})

# 打印排序后的关联规则表格
print(result_table)
数据集 关联规则

4.2 案例2

#把电影数据转换成列表
data = [['葛优','黄渤','范伟','邓超','沈腾','张占义','王宝强','徐峥','闫妮','马丽'],
['黄渤','张译','韩昊霖','杜江','葛优','刘昊然','宋佳','王千源','任素汐','吴京'],
['郭涛','刘桦','连晋','黄渤','徐峥','优恵','罗兰','王迅'],
['黄渤','舒淇','王宝强','张艺兴','于和伟','王迅','李勤勤','李又麟','宁浩','管虎','梁静','徐峥','陈德森','张磊'],
['黄渤','沈腾','汤姆·派福瑞','马修·莫里森','徐峥','于和伟','雷佳音','刘桦','邓飞','蔡明凯','王戈','凯特·纳尔逊','王砚伟','呲路'],
['徐峥','黄渤','余男','多布杰','王双宝','巴多','杨新鸣','郭虹','陶虹','黄精一','赵虎','王辉'],
['黄渤','戎祥','九孔','徐峥','王双宝','巴多','董立范','高捷','马少骅','王迅','刘刚','WorapojThuantanon','赵奔','李麒麟','姜志刚','王鹭','宁浩'],
['黄渤','徐峥','袁泉','周冬雨','陶慧','岳小军','沈腾','张俪','马苏','刘美含','王砚辉','焦俊艳','郭涛'],
['雷佳音','陶虹','程媛媛','山崎敬一','郭涛','范伟','孙淳','刘桦','黄渤','岳小军','傅亨','王文','杨新鸣']]

#算法应用
itemsets, rules = apriori(data, min_support=0.5,  min_confidence=1)
print(itemsets)
{1: {('徐峥',): 7, ('黄渤',): 9}, 2: {('徐峥', '黄渤'): 7}}
print(rules)
[{徐峥} -> {黄渤}]
数据集 关联规则
在宁浩的电影中,用的最多的是黄渤和徐峥,黄渤9次,支持度100%,徐峥7次,支持度78%,('徐峥', '黄渤') 同时出现7次,置信度为100%,看来有徐峥,必有黄渤,真是宁浩必请的黄金搭档。当然,这个数据量比较小,基本上肉眼也能看出来,这里只是提供一个分析案例,巩固下基础知识,大规模的数据,人眼无法直接感知的时候,算法的挖掘与发现,就显得特别有意义了。

4.3 案例3

import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules

# 设置pandas输出表格的属性
pd.options.display.max_colwidth = 100
pd.options.display.width = 500

# 原始数据集
data = {
    'ID': [1, 2, 3, 4, 5, 6],
    'Basket': [
        ['Beer', 'Diaper', 'Pretzels', 'Chips', 'Aspirin'],
        ['Diaper', 'Beer', 'Chips', 'Lotion', 'Juice', 'BabyFood', 'Milk'],
        ['Soda', 'Chips', 'Milk'],
        ['Soup', 'Beer', 'Diaper', 'Milk', 'IceCream'],
        ['Soda', 'Coffee', 'Milk', 'Bread'],
        ['Beer', 'Chips']
    ]
}
data = pd.DataFrame(data)

# 分隔 ID 列和 Basket 列
data_id = data.drop('Basket', axis=1)

# 将 Basket 列的列表转化为字符串
basket_str = data.Basket.str.join(',')

# 根据 Basket 列的字符串数据转化为数值型
basket_numeric = basket_str.str.get_dummies(',').astype(bool)

# 将数值型数据拼接回原数据
data = pd.concat([data_id, basket_numeric], axis=1)

# 用标准数据继续关联规则分析的步骤
# 利用 mlxtend 提供的 apriori 算法函数得到频繁项集,其中设置最小支持度为 50%
frequent_item_sets = apriori(basket_numeric, min_support=0.50, use_colnames=True)

# 计算规则,并设置提升度阈值为 1
rules = association_rules(frequent_item_sets, metric='lift', min_threshold=1)

# 按照支持度、置信度和提升度降序排列规则
rules_sorted = rules.sort_values(by=['support', 'confidence', 'lift'], ascending=[False, False, False])

# 输出排好序的规则表格
print("排序后的规则表格:")
print(rules_sorted[['antecedents', 'consequents', 'support', 'confidence', 'lift']])

五、算法评价

以下是关联规则分析的常见评价标准,以及它们的定义和解释:

  • 支持度(Support):

    • 定义:数据集中包含规则项的事务比例。
    • 解释:指示规则在数据集中的频繁程度。
    • 公式:支持度(X→Y)=包含X和Y的事务数总事务数\text{支持度}(X \rightarrow Y) = \frac{\text{包含} X \text{和} Y \text{的事务数}}{\text{总事务数}}支持度(X→Y)=总事务数包含X和Y的事务数​
  • 置信度(Confidence):

    • 定义:包含前提的事务中也包含结果的可能性。
    • 解释:衡量规则的强度。
    • 公式:置信度(X→Y)=支持度(X∩Y)支持度(X)\text{置信度}(X \rightarrow Y) = \frac{\text{支持度}(X \cap Y)}{\text{支持度}(X)}置信度(X→Y)=支持度(X)支持度(X∩Y)​
  • 提升度(Lift):

    • 定义:观察到的支持度与如果项目相互独立时的期望支持度之比。
    • 解释:指示关联的强度,值大于1表示关联比随机发生的强。
    • 公式:提升度(X→Y)=支持度(X∩Y)支持度(X)×支持度(Y)\text{提升度}(X \rightarrow Y) = \frac{\text{支持度}(X \cap Y)}{\text{支持度}(X) \times \text{支持度}(Y)}提升度(X→Y)=支持度(X)×支持度(Y)支持度(X∩Y)​
  • 杠杆(Leverage 或 Piatetsky-Shapiro):

    • 定义:测量规则的观察频率与如果 X 和 Y 独立时的期望频率之间的差异。
    • 解释:正值表示 X 和 Y 共同出现的频率高于预期。
    • 公式:杠杆(X→Y)=支持度(X∩Y)−支持度(X)×支持度(Y)\text{杠杆}(X \rightarrow Y) = \text{支持度}(X \cap Y) - \text{支持度}(X) \times \text{支持度}(Y)杠杆(X→Y)=支持度(X∩Y)−支持度(X)×支持度(Y)
  • 确信度(Conviction):

    • 定义:衡量 X 发生而没有 Y 的期望频率与 X 发生而没有 Y 的观察频率之比。
    • 解释:高确信度值表示结果对前提的依赖性较高。
    • 公式:确信度(X→Y)=1 - 支持度(Y)1 - 置信度(X→Y)\text{确信度}(X \rightarrow Y) = \frac{\text{1 - 支持度}(Y)}{\text{1 - 置信度}(X \rightarrow Y)}确信度(X→Y)=1 - 置信度(X→Y)1 - 支持度(Y)​

总结

神经网络是一种受到生物神经系统启发的计算模型,用于机器学习和人工智能领域。它由多个神经元组成的层次结构构成,分为输入层、隐藏层和输出层。神经网络通过学习数据的模式和特征来执行各种任务。在神经网络中,每个神经元都与下一层的神经元连接,并具有权重,这些权重在学习过程中进行调整。神经网络的学习是通过反向传播算法实现的,该算法根据预测结果的误差调整权重,从而不断提高网络性能。
神经网络在图像识别、语音识别、自然语言处理等领域取得显著成果。深度学习是神经网络的一个分支,通过多个深层次的隐藏层进行复杂特征的学习,提高了网络的表达能力。然而,神经网络也面临一些挑战,如需要大量标记数据、计算资源消耗大等问题。研究者们不断提出新的结构和算法来改进神经网络的性能,促使其在更多领域取得成功。神经网络作为人工智能的核心技术之一,对未来科技发展具有深远影响,将继续在各个领域发挥重要作用。

参考文献

  1. python关联分析实践学习笔记
  2. python做apriori关联分析
  3. 关联分析(Apriori)详解和python实现
  4. 关联规则算法&案例