【数据挖掘 | 关联性分析】万字长文详解关联性分析,详解Apriori算法为例,确定不来看看?

news2024/9/24 5:24:55

在这里插入图片描述

🤵‍♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍
🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)

在这里插入图片描述

【数据挖掘 | 关联性分析】万字长文详解关联性分析,详解Apriori算法为例,确定不来看看?
作者: 计算机魔术师
版本: 1.0 ( 2023.10.27 )

摘要: 本系列旨在普及那些深度学习路上必经的核心概念,文章内容都是博主用心学习收集所写,欢迎大家三联支持!本系列会一直更新,核心概念系列会一直更新!欢迎大家订阅

该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨]

@toc

关联性分析

数据挖掘中的关联分析是一种用于发现数据集中不同项之间的关联关系的方法。关联分析通常用于在大规模数据集中发现频繁项集和关联规则。总的来说,关联规则通过量化的数字决定某物品甲对物品乙的出现有多大的影响。该模式属于描述性模式,属于**无监督学习**的方法

下面是几种常见的关联分析方法及其详细解释:

  1. 频繁项集挖掘(Frequent Itemset Mining):频繁项集是指在数据集中同时出现的项的集合。频繁项集挖掘的目标是找到在数据集中出现频率高于预定义阈值的项集。常用的频繁项集挖掘算法包括Apriori算法和FP-Growth算法。

  2. 关联规则挖掘(Association Rule Mining):关联规则是指项集之间的条件关系,例如"A->B"表示项集A出现时,项集B也可能出现。关联规则挖掘的目标是从频繁项集中找到具有一定置信度的关联规则。关联规则通常使用支持度和置信度来衡量规则的重要性。常用的关联规则挖掘算法包括Apriori算法和FP-Growth算法。

  3. 序列模式挖掘(Sequential Pattern Mining):序列模式是指在时间序列数据中出现的一系列项的序列。序列模式挖掘的目标是发现在时间序列数据中频繁出现的序列模式。序列模式挖掘算法需要考虑项的出现顺序和时间跨度,常用的算法包括GSP(Generalized Sequential Pattern)算法和PrefixSpan算法。

  4. 关联网络分析(Association Network Analysis):关联网络分析是通过构建关联网络来分析数据集中的关联关系。关联网络由节点和边组成,其中节点代表项集,边代表项集之间的关联关系。关联网络分析可以帮助识别关键节点和关联子图,从而揭示数据集的结构和关联模式。

  5. 多层次关联分析(Multilevel Association Analysis):多层次关联分析是一种用于发现数据集中多个层次的关联关系的方法。它可以在不同的抽象层次上进行关联分析,从而揭示数据集中的多个关联模式。多层次关联分析可以通过层次划分、多层次关联规则和多层次关联网络来实现。

这些关联分析方法在数据挖掘中被广泛应用,可以帮助发现数据集中的隐含关系和模式,提供有价值的洞察和决策支持。根据具体的应用场景和数据特点,选择适合的关联分析方法进行数据挖掘分析。

下面是常用的关联规则算法的详细解释、优缺点以及以Markdown表格格式给出的总结:

算法名称算法描述优缺点
Apriori算法基于频繁项集的挖掘算法。通过迭代生成候选项集,并利用候选项集的频率计算支持度,从而找到频繁项集。然后,使用频繁项集生成关联规则,并计算置信度。优点:简单易懂,易于实现。 缺点:需要多次扫描数据集,计算复杂度较高;随着项集的增长,候选项集的数量呈指数级增加,导致算法效率较低。
FP-Growth算法使用频繁模式树(FP-Tree)的挖掘算法。首先构建FP-Tree,然后通过递归将FP-Tree划分为条件模式基,从而找到频繁项集。最后,使用频繁项集生成关联规则,并计算置信度。优点:相对于Apriori算法,减少了多次扫描数据集的开销,提高了算法效率;对于大规模数据集,效果更好。 缺点:构建FP-Tree的过程可能需要占用较大的内存空间;在某些情况下,FP-Growth算法的性能可能略差于Apriori算法。
ECLAT算法基于垂直数据格式的挖掘算法。将事务数据转换为垂直格式,其中每个项与对应的事务列表相关联。通过递归搜索和交集操作,找到频繁项集。然后,使用频繁项集生成关联规则,并计算置信度。优点:相对于Apriori算法,减少了候选项集的生成和扫描开销,提高了算法效率;对于稠密数据集,效果更好。 缺点:在稀疏数据集中,性能可能不如Apriori算法和FP-Growth算法。
FPMax算法一种寻找最大频繁项集的算法。与FP-Growth算法类似,但不生成所有频繁项集。首先找到频繁项集,然后通过计算每个频繁项集的闭包,将非最大频繁项集排除。优点:相对于FP-Growth算法,减少了频繁项集的生成和存储开销,提高了算法效率;仅保留最大频繁项集,减少了关联规则的数量,提高了结果的可解释性。 缺点:对于频繁项集较多或具有很大差异的数据集,性能可能不如FP-Growth算法。
Direct Hashing算法一种基于哈希表的挖掘算法。通过构建候选项集哈希表和事务哈希表,生成候选项集,并计算支持度。然后,通过哈希表的操作,找到频繁项集。最后,使用频繁项集生成关联规则,并计算置信度。优点:对于稠密数据集和小规模数据集,效果较好;在一些特定情况下,算法性能可能优于其他算法。 缺点:对于稀疏数据集和大规模数据集,性能可能不如其他算法;哈希表的构建和操作可能占用于关联规则挖掘的常见算法有:
灰色关联分析算法灰色关联分析算法是一种用于处理灰色系统的分析方法。它通过将不确定的数据序列转化为确定的关联度序列,从而揭示因素之间的关联性和影响程度。算法的基本思想是通过计算序列数据的关联度,来评估不同因素对于系统演化的影响程度。灰色关联分析算法主要包括数据序列预处理、关联度计算和排序三个步骤。在关联度计算中,常用的方法有灰色关联度、绝对关联度和相对关联度等。灰色关联分析算法可以广泛应用于各种领域,如经济、环境、工程等。优点:
- 能够处理不完整、不确定和不精确的数据,适用于灰色系统建模。
- 相对简单易用,计算速度较快。
- 能够揭示因素之间的关联性和影响程度,有助于分析决策和预测。
缺点:
- 对于数据的选择和预处理要求较高,需要根据具体问题进行合理的处理。
- 算法的结果受到数据质量和特征选择的影响,可能存在一定的主观性。
- 算法基于关联度的计算,对于高维数据或者复杂关系的分析可能存在局限性。

以上方法中实现较好的为Apriori算法,以及灰色关联分析算法。

Apriori 算法

Apriori算法的名称来源于拉丁语词汇"priori",意为"在之前"或"在前面"。这个名称反映了Apriori算法的基本思想,即通过先前的频繁项集来生成更大的候选项集,并通过剪枝操作来减少搜索空间。

该算法最早由R.Agrawal和R.Srikant在1994年的论文《Fast Algorithms for Mining Association Rules》中提出。在该论文中,作者提出了一种基于频繁项集的关联规则挖掘方法,其中的核心思想就是利用"先验知识"(prior knowledge)来加速挖掘过程。

下面详细介绍Apriori算法的步骤和数学推导:

  1. 数据预处理:首先,需要对数据进行预处理,确保数据集的格式适用于Apriori算法。通常,数据集采用事务表示,每个事务由若干项组成,项可以是商品、产品或其他类型的数据。

  2. 构建候选项集:根据预处理的数据集,首先生成所有可能的单个项集作为候选项集。对于大规模数据集,可以使用特殊的数据结构(如FP树)来加速候选项集的生成。

  3. 计算候选项集的支持度:遍历数据集,统计每个候选项集在数据集中出现的次数,即候选项集的支持度。支持度表示项集在数据集中出现的频率。

  4. 剪枝操作:根据设定的最小支持度阈值,将支持度低于阈值的候选项集剪枝,去除非频繁项集。这样可以减少后续步骤中的搜索空间。

  5. 组合生成更大的候选项集:从频繁项集中生成新的候选项集。对于频繁项集Lk-1,将其两两组合生成候选项集Ck,其中k表示项集的大小。

  6. 重复步骤3-5,直到无法生成更多的候选项集。

  7. 生成关联规则:对于每个频繁项集,生成关联规则。关联规则的生成可以通过逐个项集的方式,或者通过递归方式生成更多的规则。

  8. 计算置信度:计算每个关联规则的置信度。置信度表示规则的可信程度,即前项和后项同时出现的概率。

  9. 根据设定的最小置信度阈值,筛选出满足置信度要求的关联规则。

  10. 返回满足条件的关联规则作为挖掘结果。

    我们举一个实际例子来更好理解

    假设我们有以下数据集:

    数据集:
    Transaction 1: {牛奶, 面包, 蛋}
    Transaction 2: {面包, 小麦, 橙汁}
    Transaction 3: {牛奶, 小麦, 蛋}
    Transaction 4: {面包, 牛奶, 小麦, 蛋}
    Transaction 5: {面包, 牛奶, 橙汁}

    现在我们将按照Apriori算法的步骤进行求解:

    步骤1:准备数据集
    数据集已经给定如上所示。

    步骤2:确定最小支持度阈值
    假设我们选择最小支持度阈值为2,表示一个项目集在数据集中至少出现2次才被认为是频繁项集。

    步骤3:生成候选项集
    初始候选项集包含单个项目,即C1 = {牛奶, 面包, 蛋, 小麦, 橙汁}。

    步骤4:计算候选项集的支持度
    计算候选项集的支持度,统计每个候选项集在数据集中的出现次数。

    C1的支持度计数:
    牛奶: 2
    面包: 4
    蛋: 2
    小麦: 3
    橙汁: 2

    步骤5:筛选频繁项集
    根据最小支持度阈值,筛选出支持度大于或等于2的项集作为频繁项集。

    L1 = {面包, 小麦}

    步骤6:生成关联规则
    对于频繁项集L1,生成其所有可能的关联规则。

    关联规则集R1 = {面包 -> 小麦, 小麦 -> 面包}

    步骤7:计算关联规则的置信度
    计算关联规则的置信度,即计算规则的条件发生时,结论也发生的概率。

    置信度计算:
    面包 -> 小麦:支持度(面包, 小麦) / 支持度(面包) = 3/4 = 0.75
    小麦 -> 面包:支持度(面包, 小麦) / 支持度(小麦) = 3/3 = 1.00

    步骤8:筛选强关联规则
    根据设定的最小置信度阈值,筛选出置信度大于或等于0.7的关联规则作为强关联规则。

    强关联规则集R1 = {面包 -> 小麦, 小麦 -> 面包}

    通过以上步骤,我们完成了Apriori算法对给定数据集的求解。不过还有的是这里只展示两个

    此外得到的频繁项集中还有以下各项指标

    • lift(提升度)是关联规则分析中的一个度量,用于衡量两个事件之间的关联程度。它表示两个事件同时发生的概率与它们各自独立发生的概率之比。当提升度大于1时,表示两个事件之间存在正向关联,即它们的出现是相互促进的。当提升度等于1时,表示两个事件之间不存在关联。当提升度小于1时,表示两个事件之间存在负向关联,即它们的出现是相互抑制的。

    • leverage(杠杆率)是关联规则分析中的另一个度量,用于衡量两个事件之间的关联程度。它表示两个事件同时发生的概率在假设它们是独立事件的情况下预期同时发生的概率之间的差异。当杠杆率大于0时,表示两个事件之间存在正向关联。当杠杆率等于0时,表示两个事件之间不存在关联。当杠杆率小于0时,表示两个事件之间存在负向关联。

    • conviction(确信度)是关联规则分析中的另一个度量,用于衡量规则的可靠性。它表示如果前提事件发生,则导致结论事件不发生的概率假设前提事件和结论事件是独立事件的情况下导致结论事件不发生的概率之比。当确信度大于1时,表示前提事件对于导致结论事件的发生有积极影响。当确信度等于1时,表示前提事件对于导致结论事件的发生没有影响。当确信度小于1时,表示前提事件对于导致结论事件的发生具有负面影响。

    • zhangs_metric(张氏度量)是关联规则分析中的另一个度量,用于衡量规则的置信度和支持度之间的关系。它的计算方式是将置信度和支持度相乘后开方。张氏度量的取值范围在0到1之间,值越接近1表示规则越强。

    经典案例
    我们将使用一个经典的数据集,称为"Groceries",该数据集包含一段时间内超市顾客购买的物品清单。我们将使用Python中的mlxtend库来实现Apriori算法。

    数据集获取链接: https://www.kaggle.com/datasets/heeraldedhia/groceries-dataset (Dataset of 38765 rows for Market Basket Analysis)

    image-20231018211133482

    最流行的是mlxtend包。mlxtend是一个Python库(Machine Learning Extensions),旨在为机器学习领域提供额外的功能和扩展,以丰富机器学习工具箱,其中包括Apriori算法。

    下面是一个使用mlxtend库的模板代码:

    from mlxtend.preprocessing import TransactionEncoder
    from mlxtend.frequent_patterns import apriori, association_rules
    import pandas as pd
    
    # 加载数据集(简单)
    dataset = [["牛奶", "洋葱", "鸡蛋"],
               ["洋葱", "肉", "鸡蛋", "香蕉"],
               ["牛奶", "苹果", "鸡蛋"],
               ["牛奶", "洋葱", "肉", "鸡蛋"],
               ["洋葱","苹果", "鸡蛋"],
               ["鸡蛋", "苹果"],
               ["洋葱", "牛奶", "苹果", "鸡蛋"]]
    
    # 处理数据
    # 读取数据集
    data = pd.read_csv('grocery_store.csv', header=None)
    
    # 数据预处理
    transactions = []
    for i in range(len(data)):
        transactions.append([str(data.values[i, j]) for j in range(len(data.columns))])
    # 根据同一名用户同一时间作为一行数据
    
       
    # 转换数据集为布尔矩阵
    te = TransactionEncoder()
    te_ary = te.fit(dataset).transform(dataset)
    df = pd.DataFrame(te_ary, columns=te.columns_)
    
    # 使用Apriori算法找出频繁项集
    frequent_itemsets = apriori(df, min_support=0.2, use_colnames=True)
    
     # 计算关联规则的置信度和支持度
      rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7)
    print(rules)
    

在这里插入图片描述

不使用库的模板代码:

#-*- coding: utf-8 -*-
from __future__ import print_function
import pandas as pd

#自定义连接函数,用于实现L_{k-1}到C_k的连接
def connect_string(x, ms):
  x = list(map(lambda i:sorted(i.split(ms)), x))
  l = len(x[0])
  r = []
  for i in range(len(x)):
    for j in range(i,len(x)):
      if x[i][:l-1] == x[j][:l-1] and x[i][l-1] != x[j][l-1]:
        r.append(x[i][:l-1]+sorted([x[j][l-1],x[i][l-1]]))
  return r

#寻找关联规则的函数
def find_rule(d, support, confidence, ms = u'--'):
  result = pd.DataFrame(index=['support', 'confidence']) #定义输出结果
  
  support_series = 1.0*d.sum()/len(d) #支持度序列
  column = list(support_series[support_series > support].index) #初步根据支持度筛选
  k = 0
  
  while len(column) > 1:
    k = k+1
    print(u'\n正在进行第%s次搜索...' %k)
    column = connect_string(column, ms)
    print(u'数目:%s...' %len(column))
    sf = lambda i: d[i].prod(axis=1, numeric_only = True) #新一批支持度的计算函数
    
    #创建连接数据,这一步耗时、耗内存最严重。当数据集较大时,可以考虑并行运算优化。
    d_2 = pd.DataFrame(list(map(sf,column)), index = [ms.join(i) for i in column]).T
    
    support_series_2 = 1.0*d_2[[ms.join(i) for i in column]].sum()/len(d) #计算连接后的支持度
    column = list(support_series_2[support_series_2 > support].index) #新一轮支持度筛选
    support_series = support_series.append(support_series_2)
    column2 = []
    
    for i in column: #遍历可能的推理,如{A,B,C}究竟是A+B-->C还是B+C-->A还是C+A-->B?
      i = i.split(ms)
      for j in range(len(i)):
        column2.append(i[:j]+i[j+1:]+i[j:j+1])
    
    cofidence_series = pd.Series(index=[ms.join(i) for i in column2]) #定义置信度序列
 
    for i in column2: #计算置信度序列
      cofidence_series[ms.join(i)] = support_series[ms.join(sorted(i))]/support_series[ms.join(i[:len(i)-1])]
    
    for i in cofidence_series[cofidence_series > confidence].index: #置信度筛选
      result[i] = 0.0
      result[i]['confidence'] = cofidence_series[i]
      result[i]['support'] = support_series[ms.join(sorted(i.split(ms)))]
  
  result = result.T.sort_values(['confidence','support'], ascending = False) #结果整理,输出
  print(u'\n结果为:')
  print(result)
  
  return result

——————————————————————————————————————————————————————————————————————————————————————————
#-*- coding: utf-8 -*-
#使用Apriori算法挖掘菜品订单关联规则
from __future__ import print_function
import pandas as pd
from apriori import * #导入自行编写的apriori函数

inputfile = '../data/menu_orders.xls'
outputfile = '../tmp/apriori_rules.xls' #结果文件
#data = pd.read_excel(inputfile, header = None)
# 加载数据集(简单)
data = [["牛奶", "洋葱", "鸡蛋"],
           ["洋葱", "肉", "鸡蛋", "香蕉"],
           ["牛奶", "苹果", "鸡蛋"],
           ["牛奶", "洋葱", "肉", "鸡蛋"],
           ["洋葱","苹果", "鸡蛋"],
           ["鸡蛋", "苹果"],
           ["洋葱", "牛奶", "苹果", "鸡蛋"]]

print(u'\n转换原始数据至0-1矩阵...')
ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #转换0-1矩阵的过渡函数
b = map(ct, data.as_matrix()) #用map方式执行
data = pd.DataFrame(list(b)).fillna(0) #实现矩阵转换,空值用0填充
print(u'\n转换完毕。')
del b #删除中间变量b,节省内存

support = 0.2 #最小支持度
confidence = 0.5 #最小置信度
ms = '---' #连接符,默认'--',用来区分不同元素,如A--B。需要保证原始表格中不含有该字符

find_rule(data, support, confidence, ms).to_excel(outputfile) #保存结果

相关学习资源:

  1. R. Agrawal, R. Srikant. Fast algorithms for mining association rules , 1994
  2. mlxtend官方文档:http://rasbt.github.io/mlxtend/
  3. Python数据分析与挖掘实战(朱明星 著)- 第12章 关联规则挖掘

在这里插入图片描述

						  🤞到这里,如果还有什么疑问🤞
					🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
					 	 🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1134350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入探究深度学习、神经网络与卷积神经网络以及它们在多个领域中的应用

目录 1、什么是深度学习? 2、深度学习的思想 3、深度学习与神经网络 4、深度学习训练过程 4.1、先使用自下上升非监督学习(就是从底层开始,一层一层的往顶层训练) 4.2、后自顶向下的监督学习(就是通过带标签的数…

系统架构设计师之系统应用集成

应用集成是指两个或多个应用系统根据业务逻辑的需要而进行的功能之间的相互调用和互操作。应用集成需要在数据集成的基础上完成。应用集成在底层的网络集成和数据集成的基础上实现异构应用系统之间语用层次上的互操作。它们共同构成了实现企业集成化运行最顶层会聚臭成所需要的…

面试题之Vue和React的区别是什么?

一提到前端框架,相信大家都对Vue和React不陌生,这两个前端框架都是比较主流的,用户也都比较多,但是我们在使用这些框架的时候,是否对这两个框架之间的区别有所了解呢?接下来,让我们来一起的系统…

基于ubuntu20.04的 ros2(foxy版本)安装

建议最好参考官方的安装指南 Ubuntu (Debian) — ROS 2 Documentation: Foxy documentation 也可参考下面的步骤 1.安装ros2 (1)设置编码 sudo apt update sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_AL…

Git基本概念与使用

一、Git基本概念 git,是一种分布式版本控制软件,与CVS、Subversion这类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。g…

SpringCloud 微服务全栈体系(四)

第六章 Nacos 配置管理 Nacos 除了可以做注册中心,同样可以做配置管理来使用。 一、统一配置管理 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案…

将自己本地项目上传到git,增加IDEA操作

文章目录 一、初始化git仓库二、gitee创建仓库三、输入自己仓库的地址四、在添加所修改的文件可能的错误 五、合并需上传文件六、上传参考文档 一、初始化git仓库 在自己的项目中,命令行中输入 git init二、gitee创建仓库 新建仓库 设置仓库参数,设置…

Openssl数据安全传输平台011:秘钥协商服务端

0. 代码仓库 https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform/tree/main/Preparation 编译protobuf类文件 VS2022 protobuf3.17 Message.proto protoc Message.proto --cpp_out./

【每日一题】统计能整除数字的位数

文章目录 Tag题目来源题目解读解题思路方法一:取模运算 其他语言python3 写在最后 Tag 【取模运算】【2023-10-26】 题目来源 2520. 统计能整除数字的位数 题目解读 统计整数的所有数位中,可以被该整数整除的数量总和。 解题思路 方法一:…

Vue图片路径问题(动态引入)

vue项目中我们经常会遇到动态路径的图片无法显示的问题,以下是静态路径和动态路径的常见使用方法。 1.静态路径 在日常的开发中,图片的静态路径通过相对路径和绝对路径的方式引入。 相对路径:以.开头的,例如./、../之类的。就是…

小学数学作业练习册出题网站源码_支持打印转成PDF

小学数学作业练习册出题网站源码_支持打印转成PDF 小学数学出题网页版源码,加减乘除混合运算,支持自定义数字、小数、混合运算,支持加减乘除运算混合多选(一道题中同时随机出现加减乘除运算符)支持自定义出题数量&…

NSS [SWPUCTF 2021 新生赛]sql

NSS [SWPUCTF 2021 新生赛]sql 很明显是sql,有waf。 参数是wllm get型传参,有回显,单引号闭合,回显位3 跑个fuzz看看waf 过滤了空格 and 报错注入 空格->%09 ->like and->&&爆库:test_db -1%27uni…

【1++的Linux】之进程间通信

👍作者主页:进击的1 🤩 专栏链接:【1的Linux】 文章目录 一,进程间通信的目的二,管道 一,进程间通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程资源共享:…

【Linux】权限完结

个人主页点击直达:小白不是程序媛 系列专栏:Linux被操作记 目录 前言 chown指令 chgrp指令 文件类型 file指令 目录的权限 粘滞位 umask指令 权限总结 前言 上篇文章我们说到对于一个文件所属者和所属组都是同一个人时,使用所属者身…

刀片式服务器介绍

大家都知道服务器分为机架式服务器、刀片式服务器、塔式服务器三类,今天小编就分别讲一讲这三种服务器,第二篇先来讲一讲刀片式服务器的介绍。 刀片式服务器定义:是一种高密度的服务器架构,通过多个独立服务器单元组成&#xff0c…

力扣每日一题74:搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。…

C# 串口通信简单示例

C# 简单串口通信示例 串口通信示例代码 串口通信 C# 串口通信主要操作: 命名空间:using System.IO.Ports;获取端口:string[] ports System.IO.Ports.SerialPort.GetPortNames();设置端口名:serialPort1.PortName “COM1”; //…

【C++】继承 ⑫ ( 继承的二义性 | virtual 虚继承 )

文章目录 一、继承的二义性1、场景说明 - 继承的二义性2、继承中的二义性报错3、完整代码示例 二、virtual 虚继承1、虚继承引入2、虚继承语法3、代码示例 - 虚继承 一、继承的二义性 1、场景说明 - 继承的二义性 A 类 是 父类 , B 类 和 C 类 继承 A 类 , 是 子类 , D 类 多…

一文了解和使用nginx(附带图文)

前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 一文了解和使用nginx 一. nginx 简介1.1 什么是 nginx 和可以做什么事情1.2 正向代理1.3 反向代理1.4 负载均衡1.5 SSL 配置1.6 管理…

Galaxy生信云平台|Maftools高效地汇总、分析、注释和可视化肿瘤基因突变MAF文件...

2023-10-25,Galaxy中国镜像站 UseGalaxy.cn 平台新增 5 个工具。 MAF Tools Maftools-突变景观图: 绘制肿瘤基因突变景观图Maftools-突变汇总: 汇总MAF文件中的突变信息Maftools-共突变与互斥突变: 计算共突变和互斥突变Maftools-队列比较:比较两个队列之…