决策树学习报告

news2024/11/25 21:52:26

报告

一、基本概念

决策树的定义:首先,决策树是一种有监督的分类算法——即给定X,Y值,构建X,Y的映射关系。不同于线性回归等是多项式,决策树是一种树形的结构,一般由根节点、父节点、子节点、叶子节点构成如图所示。父节点和子节点是相对的,子节点可以由父节点分裂而来,而子节点还能作为新的父节点继续分裂;根节点是没有父节点,即初始分裂节点,叶子节点是没有子节点的节点,为终节点。每一个分支代表着一个判断,每个叶子节点代表一种结果。

 

这是在已知各种情况的发生的概率的基础上,通过构建决策树来进行分析的一种方式。

预测方式:根据输入的样本X的特征属性和决策树的取值,将输入的X样本分配到某一个叶子节点中。将叶子节点中出现最多的Y值,作为输入的X样本的预测类别。

目的:最优的模型应该是:叶子节点中只包含一个类别的数据。

但是,事实是不可能将数据分的那么的纯,因此,需要“贪心”策略,力争在每次分割时都比上一次好一些,分的更纯一些。

  • 决策树构建过程

 

步骤一:将所有的特征看成一个一个的节点,eg(拥有房产、婚姻状态、年收入这些特征,我们可以看成一个一个的节点。)

步骤二:遍历当前特征的每一种分割方式,找到最好的分割点eg(婚姻状态这个特征,我们可以按照单身、已婚、离婚进行划分;也可以按照结过婚、没有结过婚进行划分);将数据划分为不同的子节点,eg: N1、 N2….Nm;计算划分之后所有子节点的“纯度”信息

步骤三:使用第二步遍历所有特征,选择出最优的特征,以及该特征的最优的划分方式,得出最终的子节点N1、 N2….Nm

步骤四:对子节点N1、N2….Nm分别继续执行2-3步,直到每个最终的子节点都足够“纯”。

从上述步骤可以看出,决策生成过程中有两个重要的问题:

  1. 对数据进行分割。
  2. 选择分裂特征。
  3. 什么时候停止分裂。

1. 对数据进行分割

根据属性值的类型进行划分:如果值为离散型,且不生成二叉决策树,则此时一个属性就是可以一个分支,比如:上图数据显示,婚姻状态为一个属性,而下面有三个值,单身、已婚、离婚,则这三个值都可以作为一个分类。如果值为离散型,且生成二叉决策树,可以按照 “属于此子集”和“不属于此子集”分成两个分支。还是像上面的婚姻状态,这可以按照已婚,和非婚,形成两个分支。如果值为连续性,可以确定一个值作为分裂点,按照大于分割点,小于或等于分割点生成两个分支,如上图数据,我可以按照6千元的点划分成:大于6千元和小于6千元。

2. 找到最好的分裂特征

决策树算法是一种“贪心”算法策略——只考虑在当前数据特征情况下的最好分割方式。在某种意义上的局部最优解,也就是说我只保证在当分裂的时候,能够保证数据最纯就好。对于整体的数据集而言:按照所有的特征属性进行划分操作,对所有划分操作的结果集的“纯度”进行比较,选择“纯度”越高的特征属性作为当前需要分割的数据集进行分割操作。

决策树使用信息增益作为选择特征的依据,公式如下:

H(D):分割前的纯度。

H(D|A):在给定条件A下的纯度,两者之差为信息增益度。如果信息增益度越大,则H(D|A)越小,则代表结果集的数据越纯。

计算纯度的度量方式:Gini、信息熵、错误率。一般情况下,选择信息熵和Gini系数,这三者的值越大,表示越“不纯”。

Gini:

 

信息熵:

 

错误率:

 

3. 什么时候停止分裂

一般情况有两种停止条件:当每个子节点只有一种类型的时候停止构建。当前节点中记录数小于某个阈值,同时迭代次数达到给定值时,停止构建过程。此时,使用 max(p(i))作为节点的对应类型。

方式一可能会使树的节点过多,导致过拟合(Overfiting)等问题。所以,比较常用的方式是使用方式二作为停止条件。

  • ID3

ID3算法最早是由罗斯昆(J. Ross Quinlan)于1975年在悉尼大学提出的一种分类预测算法,算法以信息论为基础,其核心是“信息熵”。ID3算法通过计算每个属性的信息增益,认为信息增益高的是好属性,每次划分选取信息增益最高的属性为划分标准,重复这个过程,直至生成一个能完美分类训练样例的决策树。

 

优点:决策树构建速度快;实现简单

缺点:

1.计算依赖于特征数目较多的特征,而属性值最多的属性并不一定最优 。

2.ID3算法不是递增算法,ID3算法是单变量决策树,对于特征属性之间的关系不会考虑。

3.抗噪性差。

4.只适合小规模数据集,需要将数据放到内存中。

代码:

import math
def splitDataSet(dataSet, i, value):
    '''
    返回数据集dataSet中,去掉第i列属性值为value的实例后形成的新的数据集
    '''
    retDataSet = []
    for x in dataSet:
        if x[i] == value:
            temp = x[:]
            temp.pop(i)
            retDataSet.append(temp)
    return retDataSet


def calcEntropy(dataSet):
    '''
    计算一个数据集的熵
    '''
    labelDict = {}  # 数据集的标签-该标签总个数
    for x in dataSet:
        label = x[-1]
        if label not in labelDict.keys():
            labelDict[label] = 0
        labelDict[label] += 1

    n = len(dataSet)
    retEntropy = 0.0
    for key in labelDict:
        p = float(labelDict[key]) / n  # 计算标签概率
        retEntropy -= p * math.log(p, 2)

    return retEntropy


def calcInfoGain(dataSet, i):
    '''
    计算对数据集dataSet,选定第i列特征时所获得的信息增益
    '''
    preEntropy = calcEntropy(dataSet)

    postEntropy = 0.0
    featureSet = set([x[i] for x in dataSet])  # 得到i列特征所有特征值的集合
    for feature in featureSet:  # 以feature为筛选条件,计算筛选后的数据集熵
        subDataSet = splitDataSet(dataSet, i, feature)
        subDataSetEntropy = calcEntropy(subDataSet)
        p = len(subDataSet) / len(dataSet)
        postEntropy += p * subDataSetEntropy

    return preEntropy - postEntropy


def getMaxInfoGainNode(dataSet, featureNameList):
    '''
    featureNameList是dataSet中各特征名称
    该函数返回两种结果:
    熵为0时,返回标签,类型为str
    熵不为0时,返回具有最大信息增益的特征的索引号,特征名,以及最大信息增益
    '''
    dataSetEntropy = calcEntropy(dataSet)
    if dataSetEntropy == 0:
        return dataSet[0][-1]  # 数据集熵为0,说明标签都相同,直接将该标签返回

    featureNum = len(featureNameList)

    maxInfoGain = 0
    maxInfoGainIndex = 0
    for i in range(0, featureNum):  # 遍历所有特征,获得具有最大信息增益的特征索引号
        infoGain = calcInfoGain(dataSet, i)
        if infoGain > maxInfoGain:
            maxInfoGain = infoGain
            maxInfoGainIndex = i

    return maxInfoGainIndex, featureNameList[maxInfoGainIndex], maxInfoGain


def createID3Tree(dataSet, featureNameList):
    '''
    该函数返回一个结点
    如果dataSet熵为0,那么返回dataSet中类标签,此标签唯一
    否则,返回一个字典,该字典的key为dataSet选出的最优特征名,value又为一个字典,
    value字典的key为最优特征的特征值名,value字典的value又为一个字典.....
    '''
    maxInfoGainNode = getMaxInfoGainNode(dataSet, featureNameList)
    if type(maxInfoGainNode) == str:
        return maxInfoGainNode

    nodeIndex, nodeName = maxInfoGainNode[0], maxInfoGainNode[1]
    ret = {}
    ret[nodeName] = {}

    featureSet = set([x[nodeIndex] for x in dataSet])
    for feature in featureSet:
        subDataSet = splitDataSet(dataSet, nodeIndex, feature)
        newFeatNameList = featureNameList[:]
        newFeatNameList.pop(nodeIndex)
        childTree = createID3Tree(subDataSet, newFeatNameList)  # 对以最大信息增益作为特征筛选后的子数据集进行递归调用
        ret[nodeName][feature] = childTree

    return ret


dataSet = [['青年', '否', '否', '一般', '拒绝'],
           ['青年', '否', '否', '好', '拒绝'],
           ['青年', '是', '否', '好', '同意'],
           ['青年', '是', '是', '一般', '同意'],
           ['青年', '否', '否', '一般', '拒绝'],
           ['中年', '否', '否', '一般', '拒绝'],
           ['中年', '否', '否', '好', '拒绝'],
           ['中年', '是', '是', '好', '同意'],
           ['中年', '否', '是', '非常好', '同意'],
           ['中年', '否', '是', '非常好', '同意'],
           ['老年', '否', '是', '非常好', '同意'],
           ['老年', '否', '是', '好', '同意'],
           ['老年', '是', '否', '好', '同意'],
           ['老年', '是', '否', '非常好', '同意'],
           ['老年', '否', '否', '一般', '拒绝'], ]

featureNameList = ['年龄', '有工作', '有房子', '信贷情况']
ID3Tree = createID3Tree(dataSet, featureNameList)
print("数据集1:",ID3Tree)
dataSet = [['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],
               ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好瓜'],
               ['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],
               ['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好瓜'],
               ['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],
               ['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '好瓜'],
               ['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '好瓜'],
               ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '好瓜'],
               ['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '坏瓜'],
               ['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '坏瓜'],
               ['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '坏瓜'],
               ['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '坏瓜'],
               ['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '坏瓜'],
               ['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '坏瓜'],
               ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '坏瓜'],
               ['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '坏瓜'],
               ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '坏瓜']]
featureNameList = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感']
ID3Tree = createID3Tree(dataSet, featureNameList)
print("数据集2:",ID3Tree)
dataSet = [[1, 1, 1, 1, 'No'],
                   [1, 1, 1, 2,  'No'],
                   [2, 1, 1, 1,  'Yes'],
                   [3, 2, 1, 1,  'Yes'],
                   [3, 3, 2, 1,  'Yes'],
                   [3, 3, 2, 2,  'No'],
                   [2, 3, 2, 2,  'Yes'],
                   [1, 2, 1, 1,  'No'],
                   [1, 3, 2, 1,  'Yes'],
                   [3, 2, 2, 1,  'Yes'],
                   [1, 2, 2, 2,  'Yes'],
                   [2, 2, 1, 2,  'Yes'],
                   [2, 1, 2, 1,  'Yes'],
                   [3, 2, 1, 2,  'No'], ]
featureNameList = ['outlook', 'temp', 'humidity', 'windy']


ID3Tree = createID3Tree(dataSet, featureNameList)
print("数据集3:",ID3Tree)

运行结果:

 

  • C4.5

在ID3算法的基础上,进行算法优化提出的一种算法(C4.5),使用信息增益率来取代ID3中的信息增益。

 

代码:

from math import log,sqrt

import operator
import re

def classCount(dataSet):
    labelCount={}
    for one in dataSet:
        if one[-1] not in labelCount.keys():
            labelCount[one[-1]]=0
        labelCount[one[-1]]+=1
    return labelCount

def calcShannonEntropy(dataSet):
    labelCount=classCount(dataSet)
    numEntries=len(dataSet)
    Entropy=0.0
    for i in labelCount:
        prob=float(labelCount[i])/numEntries
        Entropy-=prob*log(prob,2)
    return Entropy

def majorityClass(dataSet):
    labelCount=classCount(dataSet)
    sortedLabelCount=sorted(labelCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedLabelCount[0][0]

def splitDataSet(dataSet,i,value):
    subDataSet=[]
    for one in dataSet:
        if one[i]==value:
            reduceData=one[:i]
            reduceData.extend(one[i+1:])
            subDataSet.append(reduceData)
    return subDataSet

def splitContinuousDataSet(dataSet,i,value,direction):
    subDataSet=[]
    for one in dataSet:
        if direction==0:
            if one[i]>value:
                reduceData=one[:i]
                reduceData.extend(one[i+1:])
                subDataSet.append(reduceData)
        if direction==1:
            if one[i]<=value:
                reduceData=one[:i]
                reduceData.extend(one[i+1:])
                subDataSet.append(reduceData)
    return subDataSet

def chooseBestFeat(dataSet,labels):
    baseEntropy=calcShannonEntropy(dataSet)
    bestFeat=0
    baseGainRatio=-1
    numFeats=len(dataSet[0])-1
    bestSplitDic={}
    i=0
    # print('dataSet[0]:' + str(dataSet[0]))
    for i in range(numFeats):
        featVals=[example[i] for example in dataSet]
        #print('chooseBestFeat:'+str(i))
        if type(featVals[0]).__name__=='float' or type(featVals[0]).__name__=='int':
            j=0
            sortedFeatVals=sorted(featVals)
            splitList=[]
            for j in range(len(featVals)-1):
                splitList.append((sortedFeatVals[j]+sortedFeatVals[j+1])/2.0)
            for j in range(len(splitList)):
                newEntropy=0.0
                gainRatio=0.0
                splitInfo=0.0
                value=splitList[j]
                subDataSet0=splitContinuousDataSet(dataSet,i,value,0)
                subDataSet1=splitContinuousDataSet(dataSet,i,value,1)
                prob0=float(len(subDataSet0))/len(dataSet)
                newEntropy-=prob0*calcShannonEntropy(subDataSet0)
                prob1=float(len(subDataSet1))/len(dataSet)
                newEntropy-=prob1*calcShannonEntropy(subDataSet1)
                splitInfo-=prob0*log(prob0,2)
                splitInfo-=prob1*log(prob1,2)
                gainRatio=float(baseEntropy-newEntropy)/splitInfo
                # print('IVa '+str(j)+':'+str(splitInfo))
                if gainRatio>baseGainRatio:
                    baseGainRatio=gainRatio
                    bestSplit=j
                    bestFeat=i
            bestSplitDic[labels[i]]=splitList[bestSplit]
        else:
            uniqueFeatVals=set(featVals)
            GainRatio=0.0
            splitInfo=0.0
            newEntropy=0.0
            for value in uniqueFeatVals:
                subDataSet=splitDataSet(dataSet,i,value)
                prob=float(len(subDataSet))/len(dataSet)
                splitInfo-=prob*log(prob,2)
                newEntropy-=prob*calcShannonEntropy(subDataSet)
            gainRatio=float(baseEntropy-newEntropy)/splitInfo
            if gainRatio > baseGainRatio:
                bestFeat = i
                baseGainRatio = gainRatio
    if type(dataSet[0][bestFeat]).__name__=='float' or type(dataSet[0][bestFeat]).__name__=='int':
        bestFeatValue=bestSplitDic[labels[bestFeat]]
        ##bestFeatValue=labels[bestFeat]+'<='+str(bestSplitValue)
    if type(dataSet[0][bestFeat]).__name__=='str':
        bestFeatValue=labels[bestFeat]
    return bestFeat,bestFeatValue



def createTree(dataSet,labels):
    classList=[example[-1] for example in dataSet]
    if len(set(classList))==1:
        return classList[0][0]
    if len(dataSet[0])==1:
        return majorityClass(dataSet)
    Entropy = calcShannonEntropy(dataSet)
    bestFeat,bestFeatLabel=chooseBestFeat(dataSet,labels)
    # print('bestFeat:'+str(bestFeat)+'--'+str(labels[bestFeat])+', bestFeatLabel:'+str(bestFeatLabel))
    myTree={labels[bestFeat]:{}}
    subLabels = labels[:bestFeat]
    subLabels.extend(labels[bestFeat+1:])
    # print('subLabels:'+str(subLabels))
    if type(dataSet[0][bestFeat]).__name__=='str':
        featVals = [example[bestFeat] for example in dataSet]
        uniqueVals = set(featVals)
        # print('uniqueVals:' + str(uniqueVals))
        for value in uniqueVals:
            reduceDataSet=splitDataSet(dataSet,bestFeat,value)
            # print('reduceDataSet:'+str(reduceDataSet))
            myTree[labels[bestFeat]][value]=createTree(reduceDataSet,subLabels)
    if type(dataSet[0][bestFeat]).__name__=='int' or type(dataSet[0][bestFeat]).__name__=='float':
        value=bestFeatLabel
        greaterDataSet=splitContinuousDataSet(dataSet,bestFeat,value,0)
        smallerDataSet=splitContinuousDataSet(dataSet,bestFeat,value,1)
        # print('greaterDataset:' + str(greaterDataSet))
        # print('smallerDataSet:' + str(smallerDataSet))
        # print('== ' * len(dataSet[0]))
        myTree[labels[bestFeat]]['>' + str(value)] = createTree(greaterDataSet, subLabels)
        # print(myTree)
        # print('== ' * len(dataSet[0]))
        myTree[labels[bestFeat]]['<=' + str(value)] = createTree(smallerDataSet, subLabels)
    return myTree

if __name__ == '__main__':
    dataSet = [[1, '长', '粗', '男'],
               [2, '短', '粗', '男'],
               [3, '短', '粗', '男'],
               [4, '长', '细', '女'],
               [5, '短', '细', '女'],
               [6, '短', '粗', '女'],
               [7, '长', '粗', '女'],
               [8, '长', '粗', '女']]
    labels = ['序号', '头发', '声音']  # 两个特征
    print("数据集1",createTree(dataSet,labels))
    dataSet = [['青年', '否', '否', '一般', '拒绝'],
               ['青年', '否', '否', '好', '拒绝'],
               ['青年', '是', '否', '好', '同意'],
               ['青年', '是', '是', '一般', '同意'],
               ['青年', '否', '否', '一般', '拒绝'],
               ['中年', '否', '否', '一般', '拒绝'],
               ['中年', '否', '否', '好', '拒绝'],
               ['中年', '是', '是', '好', '同意'],
               ['中年', '否', '是', '非常好', '同意'],
               ['中年', '否', '是', '非常好', '同意'],
               ['老年', '否', '是', '非常好', '同意'],
               ['老年', '否', '是', '好', '同意'],
               ['老年', '是', '否', '好', '同意'],
               ['老年', '是', '否', '非常好', '同意'],
               ['老年', '否', '否', '一般', '拒绝'], ]

    labels = ['年龄', '有工作', '有房子', '信贷情况']
    print("数据集2", createTree(dataSet, labels))
    dataSet = [['Sunny', 'Hot', 'High', 'FALSE', 'N'],
                   ['Sunny', 'Hot', 'High', 'TRUE', 'N'],
                   ['Overcast', 'Hot', 'High', 'FALSE', 'P'],
                   ['Rain', 'Mild', 'High', 'FALSE', 'P'],
                   ['Rain', 'Cool', 'Normal', 'FALSE', 'P'],
                   ['Rain', 'Cool', 'Normal', 'TRUE', 'N'],
                   ['Overcast', 'Cool', 'Normal', 'TRUE', 'P'],
                   ['Sunny', 'Mild', 'High', 'FALSE', 'N'],
                   ['Sunny', 'Cool', 'Normal', 'FALSE', 'P'],
                   ['Rain', 'Mild', 'Normal', 'FALSE', 'P'],
                   ['Sunny', 'Mild', 'Normal', 'TRUE', 'P'],
                   ['Overcast', 'Mild', 'High', 'TRUE', 'P'],
                   ['Overcast', 'Hot', 'Normal', 'FALSE', 'P'],
                   ['Rain', 'Mild', 'High', 'TRUE', 'N']]

    labels = ['Outlook', 'Temperature', 'Humidity', 'Windy']

    print("数据集3", createTree(dataSet, labels))

运行结果:

 

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

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

相关文章

MyBatis-Plus的入门学习

MyBatis-Plus入门学习简介特性快速开始MyBatis-Plus的注解详解Tableld主键生成策略1、数据库自动增长 AUTO2、UUID3、Redis生成id4、MP主键自动生成TableNameTableField自动填充测试方法&#xff1a;update乐观锁select查所有根据id查多个id批量查询简单条件查询&#xff08;通…

MySQL性能优化

MySQL性能调优 存储数据类型优化 尽量避免使用 NULL尽量使用可以的最小数据类型。但也要确保没有低估需要存储的范围整型比字符串操作代价更低使用 MySQL 内建的数据类型&#xff08;比如date、time、datetime&#xff09;&#xff0c;比用字符串更快 基本数据类型 数字 整数…

中国巨头在NLP领域的大模型布局

什么是大模型&#xff1f; 大规模模型&#xff08;large-scale model&#xff09;是近年来人工智能领域的一个热点话题&#xff0c;因为它们可以对自然语言处理&#xff08;NLP&#xff09;和其他任务进行更准确和深入的处理。由于大模型需要庞大的计算资源和数据支持&#xf…

论文投稿指南——中文核心期刊推荐(国家财政)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

SpringSecurity第二讲

目录 二、SpringSecurity02 2.1 JWT概述 2.1.1 JWT介绍 2.1.2 跨域认证问题 2.2 JWT的原理 2.3 JWT的数据结构 2.3.1 Header 2.3.2 Payload 2.3.3 Signature 2.4 JWT的使用方式 2.5 JWT的使用 2.5.1 引入JWT依赖 2.5.2 编写JWT工具类 2.6 编写前后端不分离的项目…

【C语言】每日刷题 —— 牛客语法篇(3)

前言 大家好&#xff0c;继续更新专栏c_牛客&#xff0c;不出意外的话每天更新十道题&#xff0c;难度也是从易到难&#xff0c;自己复习的同时也希望能帮助到大家&#xff0c;题目答案会根据我所学到的知识提供最优解。 &#x1f3e1;个人主页&#xff1a;悲伤的猪大肠9的博客…

sd卡格式化后数据恢复怎么操作

有时候我们需要清空SD卡数据文件&#xff0c;有时候则是因为需要修复SD卡所以需要格式化&#xff0c;但是却被提示无法格式化SD卡。这种情况往往是由于平时SD卡使用时的一些不良习惯或是SD卡中病毒&#xff0c;病毒在运行SD卡中的软件所造成的。那么sd卡格式化后数据恢复怎么操…

[数据结构]栈的深入学习-java实现

CSDN的各位uu们你们好,今天千泽带来了栈的深入学习,我们会简单的用代码实现一下栈, 接下来让我们一起进入栈的神奇小世界吧!0.速览文章一、栈的定义1. 栈的概念2. 栈的图解二、栈的模拟实现三.栈的经典使用场景-逆波兰表达式总结一、栈的定义 1. 栈的概念 栈&#xff1a;一种…

国密SM4分组密码算法

前言密码&#xff0c;是指使用特定变换对数据等信息进行加密保护或安全认证的物项&#xff08;承载算法、密钥、密文的介质&#xff09;和技术&#xff0c;主要用于加密和安全认证&#xff08;身份识别、完整性、抗抵赖性&#xff09;。密码按照保密等级&#xff0c;又分为核密…

06 电力电子仿真 MATLAB/Simulink

文章目录01 单相半波整流电路02 单相全波整流电路&#xff08;子系统封装模块&#xff09;03 三相桥式整流电路&#xff08;三相模块与示波器使用&#xff09;04 相控与斩控交交调压&#xff08;THD计算&#xff09;05 Buck电路&#xff08;PWM实现与闭环反馈&#xff09;06 单…

【STL】Vector剖析及模拟实现

✍作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C vector的常用接口 首先贴上&#xff1a;vector的文档介绍,以备查阅使用。 vector的基本框架&#xff1a; vector的成员变量分别是空间首部分的_start指针和最后一个元素的下一个位置的_finish指针&#xff0c;以…

Tomcat安装及启动

日升时奋斗&#xff0c;日落时自省 目录 1、Tomcat下载 2、JDK安装及配置环境 3、Tomcat配置环境 4、启动Tomcat 5、部署演示 1、Tomcat下载 直接入主题&#xff0c;下载Tomcat 首先就是别下错了&#xff0c;直接找官方如何看是不是广告&#xff0c;或者造假 搜索Tomc…

【强度混合和波段自适应细节融合:PAN-Sharpening】

Intensity mixture and band-adaptive detail fusion for pansharpening &#xff08;用于全色锐化的强度混合和波段自适应细节融合&#xff09; 全色锐化的目的是通过高分辨率单通道全色&#xff08;PAN&#xff09;图像锐化低分辨率多光谱&#xff08;MS&#xff09;图像&a…

ChatGPT、人工智能、人类和一些酒桌闲聊

© 2023 Conmajia Initiated 10th March, 2023 昨天跟某化学家喝酒&#xff0c;期间提到了 ChatGPT。他的评价是&#xff1a;这鬼东西大量输出毫无意义、错漏百出甚至是虚假的信息&#xff0c;“in a confident accent”。例如某次 GPT 针对“描述某某记者”这一问题&#…

C++的入门

C的关键字 C总计63个关键字&#xff0c;C语言32个关键字 命名空间 我们C的就是建立在C语言之上&#xff0c;但是是高于C语言的&#xff0c;将C语言的不足都弥补上了&#xff0c;而命名空间就是为了弥补C语言的不足。 看一下这个例子。在C语言中会报错 #include<stdio.h>…

【C++】C++11——左右值|右值引用|移动语义|完美转发

文章目录一、左值与右值1.概念2.引用3.注意二、右值引用的意义1.左值引用意义2.右值引用和移动语义3.容器新增三、万能引用四、完美转发一、左值与右值 1.概念 左值是什么&#xff1f;右值是什么&#xff1f; 左值是一个表示数据的表达式&#xff08;如变量名或解引用的指针&…

学校学生心理测评系统

青少年在线心理测评系统 这款系统&#xff0c;是和北大合作开发&#xff0c;并真实用于线上测评场景&#xff0c;该项目有完整后台&#xff0c;以及学生管理等模块。 我们欢迎以下形式合作&#xff1a; 单纯研究项目。合作对该测评平台进行升级。单纯使用。 请联系我们 silv…

MyBatis里面用了多少种设计模式?

在MyBatis的两万多行的框架源码中&#xff0c;使用了大量的设计模式对工程架构中的复杂场景进行解耦&#xff0c;这些设计模式的巧妙使用是整个框架的精华。经过整理&#xff0c;大概有以下设计模式&#xff0c;如图1所示。图101类型&#xff1a;创建型模式▊ 工厂模式SqlSessi…

英飞凌Tricore原理及应用介绍04_中断请求及仲裁过程

目录1.概述2. 中断请求及过程仲裁3. 中断传到CPU会被即时响应吗&#xff1f;1.概述 在Tricore架构中允许有多个中断源包括片上外设及外部中断世间产生的中断请求&#xff0c;以打断中断服务的提供者如CPU或DMA通道&#xff0c;那你知道在Tricore里中断请求在内核中的仲裁及处理…

【java基础】ArrayList源码解析

文章目录基本介绍构造器指定初始容量默认创建通过集合创建添加add扩容机制批量添加addAll添加指定位置add添加多个元素到指定位置addAll删除删除指定元素remove删除指定索引元素remove条件删除removeIf批量删除removeAll修改修改指定位置set替换所有满足要求元素replaceAll一些…