Day_58-59 NB 算法

news2025/3/3 4:44:42

目录

Day_58符号型数据的 NB 算法

一. 关于NB算法的介绍

        1. 条件概率

        2. 独立性假设

        3. 以上式子的分析

        4. Laplacian 平滑

        5. 问题的回顾

二. 代码实现

        1. 代码的符号说明

        2. 构造函数和基础函数

        3. 计算结果的分布情况

        4. 核心代码

        5. 分类

三. 符号型数据的运行结果

Day_59数值型数据的 NB 算法

一. 数值型数据的特点

二. 代码实现

        1. 计算期望和方差

         2. 高斯类

        3. 预测结果

三. 运行结果


Day_58符号型数据的 NB 算法

一. 关于NB算法的介绍

        这里闵老师写的博客很清楚了,主要是介绍NB算法的基础理论,这里我只是稍微写一下我自己过程中遇到的问题和重要的只是总结

        1. 条件概率

        对于这一部分概率论的知识我们简单回顾一下,待会NB算法要用的到。学习过概率论的同学都知道一个条件概率的东西,具体的公式如下:

        P(A)=P(B)P(A|B)——(1)

        其中P(A)表示A事件发生的概率,P(B)表示B事件的概率,P(A|B)表示在事件B发生的前提下事件A发生的概率。对于如下的数据:我们有

        P(outlook =sunny)= 5/14(所有数据中晴天的概率),P(humidity =high∣outlook =sunny )= 3/5(在晴天的数据中,湿度高的概率),P(outlook =sunny∧humidity =high)= 3/14(在所有的数据中,既是晴天又是湿度高的概率是3/14),并且他们之间有这样的关系:P(outlook =sunny)P(humidity =high∣outlook =sunny )= P(outlook =sunny∧humidity =high)

@relation weather.symbolic

@attribute outlook {sunny, overcast, rainy}
@attribute temperature {hot, mild, cool}
@attribute humidity {high, normal}
@attribute windy {TRUE, FALSE}
@attribute play {yes, no}

@data
sunny,hot,high,FALSE,no
sunny,hot,high,TRUE,no
overcast,hot,high,FALSE,yes
rainy,mild,high,FALSE,yes
rainy,cool,normal,FALSE,yes
rainy,cool,normal,TRUE,no
overcast,cool,normal,TRUE,yes
sunny,mild,high,FALSE,no
sunny,cool,normal,FALSE,yes
rainy,mild,normal,FALSE,yes
sunny,mild,normal,TRUE,yes
overcast,mild,high,TRUE,yes
overcast,hot,normal,FALSE,yes
rainy,mild,high,TRUE,no

        2. 独立性假设

        首先我们根据(1)式,

P(D_{i}|X)=P(D_{i}X)/P(X)=P(D_{i})P(X|D_{i})/P(X)——(2)

        由于我们1.1是对于条件是1维的情况做的条件概率,那么条件是n维呢?即P(D|X),这里的X表示n个条件,例如(在天气为晴朗,温度为热,湿度为高,无风的情况下去玩的概率是100%(从数据得出,可能是由于数据集太小导致))

P(play=no | outlook=sunny\wedge temperature=hot\wedge humidity=high \wedge windy=FALSE)=1

        这里我们思考一下,若条件这些都不是相互独立的会怎么样?答案显而易见那么就不能直接从数据里面得到它的结果,所以这里我们引入一个独立性假设(上面是独立性,欢迎参考这篇文章),假设条件与条件之间是完全相互独立的,

        那么我们现在就可以将其化简成为:

        P(X|D_{i})=P(X_{1}|D_{i})P(X_{2}|D_{i})...P(X_{m}|D_{i})=\prod_{j=1}^{m}P(X_{j}|D_{i})——(3)

        联立(2)(3)

        P(D_{i}|X)=P(D_{i}X)/P(X)=P(D_{i})\prod_{j=1}^{m}P(X_{j}|D_{i})/P(X)——(4)

        3. 以上式子的分析

        对于(4)式我们观察一下,对于需要计算的结果P(D_{i}|X)它的等价式:P(D_{i})可以由数据中计算得到,对于每一个P(X_{j}|D_{i})也可以有数据计算得到,但是对于P(X)我们不能计算(例如:天气晴朗且温度为热且湿度为高且无风的情况下概率无法计算)好在我们并不需要计算P(X)的值,只需要比较分子的大小就可以预测是“去玩”还是“不去玩”了。

        4. Laplacian 平滑

        现在看起来上面的式子(4)是不是很合理?好像我们只需要计算(4)式左边的所有项就可以得到去玩或者不去玩的概率了,但是这里存在一个很严重的问题——(4)的左边项有没有可能某一个式子为0?(例如在去玩的情况下,天气为阴天的概率为0)那么无论左边的其余项为什么计算得到的结果永远是0了。

        怎么处理这里的式子呢?这里将式子改造一下

         n是所有数据的数量,v_{j}是这个x_{j}对应的属性的数量,这里由于P都是概率所以乘n将概率转化为具体的数据,对于相加的v_{j}是为了使P(x_{1}|D_{_{i}})+P(x_{2}|D_{_{i}})+...P(x_{k}|D_{_{i}})相加为1。例如对于上面的天气数据,P(outlook =sunny | play =yes)的变换为

        P^{L}=\frac{14\cdot \frac{3}{14}+1 }{ 14\cdot \frac{5}{14}+3}

        同样的道理对于P(D_{i})也进行变形:

         接着我们对于(4)式子可以进行取log(原因在于数据较大时防止溢出),再将P(x)去掉,故现在求概率的等式为

        d(x)=logP^{L}(D_{i})+\sum_{j=1}^{m}logP^{L}(x_{j}|D_{i})

        5. 问题的回顾

        问题的构建:算了这么大一堆公式不要忘记了我们原本最初的目的是什么,我们的问题是判断在X的条件下D发生的概率。以天气数据为例,我们输入训练集(数据),接着对每一个数据做leave-out-leave测试,判断在每一个条件下的P(D|X)的概率,接着根据概率的大小判断是去玩还是不去玩。而这个P(D|X)就是由我们上面的推导过程计算出来的。

二. 代码实现

        这里先写出符号型数据的处理

        1. 代码的符号说明

        dataset数据处理的实例,可以把想象成一堆数据构成的对象;numClasses表示判定结果有多少种的数量;numInstances表示数据有多少个;numConditions表示条件有几个;predicts表示预测的结果(对应的预测结果有numClasses种,选其中一种);classDistribution表示结果数据的占比;classDistributionLaplacian表示经过Laplacian变换之后的结果数据的占比;conditionalCounts三维数组:第一维表示结果的种类数量,第二维表示条件的数量,第三维表示在某一个结果的情况下,某个条件对应的某个属性的个数;conditionalProbabilitiesLaplacian表示conditionalCounts经过Laplacian变换的个数;dataType,NOMINAL,NUMERICAL表示是符号型数据还是数值型数据。

    /**
     * The data.
     */
    Instances dataset;

    /**
     * The number of classes. For binary classification it is 2.
     */
    int numClasses;

    /**
     * The number of instances.
     */
    int numInstances;

    /**
     * The number of conditional attributes.
     */
    int numConditions;

    /**
     * The prediction, including queried and predicted labels.
     */
    int[] predicts;

    /**
     * Class distribution.
     */
    double[] classDistribution;

    /**
     * Class distribution with Laplacian smooth.
     */
    double[] classDistributionLaplacian;

    /**
     * To calculate the conditional probabilities for all classes over all
     * attributes on all values.
     */
    double[][][] conditionalCounts;

    /**
     * The conditional probabilities with Laplacian smooth.
     */
    double[][][] conditionalProbabilitiesLaplacian;

    /**
     * The Guassian parameters.
     */
    GaussianParamters[][] gaussianParameters;

    /**
     * Data type.
     */
    int dataType;

    /**
     * Nominal.
     */
    public static final int NOMINAL = 0;

    /**
     * Numerical.
     */
    public static final int NUMERICAL = 1;

        2. 构造函数和基础函数

        就是打开文件,传入数据,然后统计条件数numConditions,数据的个数numInstances,结果的种类数numClasses

    public NaiveBayes(String paraFilename) {
        dataset = null;
        try {
            FileReader fileReader = new FileReader(paraFilename);
            dataset = new Instances(fileReader);
            fileReader.close();
        } catch (Exception ee) {
            System.out.println("Cannot read the file: " + paraFilename + "\r\n" + ee);
            System.exit(0);
        } // Of try

        dataset.setClassIndex(dataset.numAttributes() - 1);
        numConditions = dataset.numAttributes() - 1;
        numInstances = dataset.numInstances();
        numClasses = dataset.attribute(numConditions).numValues();
    }// Of the constructor

       这里设定是数值型还是符号型

    /**
     ********************
     * Set the data type.
     ********************
     */
    public void setDataType(int paraDataType) {
        dataType = paraDataType;
    }// Of setDataType

        3. 计算结果的分布情况

        第一个for循环的tempCounts用于记录每一种结果的个数,将它写入tempCounts;第二个for循环的classDistribution用于计算最直接的分布(结果1占总数据个数的多少,结果2占总数据个数的多少...),classDistributionLaplacian用于计算classDistribution经过Laplacian变换后的结果,背后的数学逻辑详见上文(一.关于NB算法的介绍)

    /**
     ********************
     * Calculate the class distribution with Laplacian smooth.
     ********************
     */
    public void calculateClassDistribution() {
        classDistribution = new double[numClasses];
        classDistributionLaplacian = new double[numClasses];

        double[] tempCounts = new double[numClasses];
        for (int i = 0; i < numInstances; i++) {
            int tempClassValue = (int) dataset.instance(i).classValue();
            tempCounts[tempClassValue]++;
        } // Of for i

        for (int i = 0; i < numClasses; i++) {
            classDistribution[i] = tempCounts[i] / numInstances;
            classDistributionLaplacian[i] = (tempCounts[i] + 1) / (numInstances + numClasses);
        } // Of for i

        System.out.println("Class distribution: " + Arrays.toString(classDistribution));
        System.out.println("Class distribution Laplacian: " + Arrays.toString(classDistributionLaplacian));
    }// Of calculateClassDistribution

        4. 核心代码

        介绍conditionalCounts和conditionalProbabilitiesLaplacian;说白了conditionalCounts就是记录在结果i的情况下,对应的某一个条件的不同情况的数据个数(例如当去玩的情况下,对于天气属性为晴天,雨天,多云;这几种情况下数据的个数(其他条件在这里不考虑),当然还有不去玩的情况下,同理可得)。

        第一个for循环即分配大小,conditionalCounts不是现在只有结果和条件的维度吗,再添加维度是某一个条件下的各个属性的值。

        第二个for循环,循环遍历每一个数据,再遍历每一个条件记录这个时候的数据值,将它对应的conditionalCounts矩阵的对应值加1(这里一定要记住conditionalCounts是记录数量的矩阵),接着计算出conditionalCounts经过Laplacian变换条件矩阵即可

    /**
     ********************
     * Calculate the conditional probabilities with Laplacian smooth. ONLY scan
     * the dataset once. There was a simpler one, I have removed it because the
     * time complexity is higher.
     ********************
     */
    public void calculateConditionalProbabilities() {
        conditionalCounts = new double[numClasses][numConditions][];
        conditionalProbabilitiesLaplacian = new double[numClasses][numConditions][];

        // Allocate space
        for (int i = 0; i < numClasses; i++) {
            for (int j = 0; j < numConditions; j++) {
                int tempNumValues = (int) dataset.attribute(j).numValues();
                conditionalCounts[i][j] = new double[tempNumValues];
                conditionalProbabilitiesLaplacian[i][j] = new double[tempNumValues];
            } // Of for j
        } // Of for i

        // Count the numbers
        int[] tempClassCounts = new int[numClasses];
        for (int i = 0; i < numInstances; i++) {
            int tempClass = (int) dataset.instance(i).classValue();
            tempClassCounts[tempClass]++;
            for (int j = 0; j < numConditions; j++) {
                int tempValue = (int) dataset.instance(i).value(j);
                conditionalCounts[tempClass][j][tempValue]++;
            } // Of for j
        } // Of for i

        // Now for the real probability with Laplacian
        for (int i = 0; i < numClasses; i++) {
            for (int j = 0; j < numConditions; j++) {
                int tempNumValues = (int) dataset.attribute(j).numValues();
                for (int k = 0; k < tempNumValues; k++) {
                    conditionalProbabilitiesLaplacian[i][j][k] = (conditionalCounts[i][j][k] + 1)
                            / (tempClassCounts[i] + tempNumValues);
                    // I wrote a bug here. This is an alternative approach,
                    // however its performance is better in the mushroom dataset.
                    // conditionalProbabilitiesLaplacian[i][j][k] =
                    // (numInstances * conditionalCounts[i][j][k] + 1)
                    // / (numInstances * tempClassCounts[i] + tempNumValues);
                } // Of for k
            } // Of for j
        } // Of for i

        System.out.println("Conditional probabilities: " + Arrays.deepToString(conditionalCounts));
    }// Of calculateConditionalProbabilities

        5. 分类

        分类的框架函数,这里要考虑是数值型数据还是符号型数据,这两个(准确来说是一个,重载)函数没什么要写的,很简单,就是对于每个数据做leave-out-leave测试。

    /**
     ********************
     * Classify all instances, the results are stored in predicts[].
     ********************
     */
    public void classify() {
        predicts = new int[numInstances];
        for (int i = 0; i < numInstances; i++) {
            predicts[i] = classify(dataset.instance(i));
        } // Of for i
    }// Of classify

    /**
     ********************
     * Classify an instances.
     ********************
     */
    public int classify(Instance paraInstance) {
        if (dataType == NOMINAL) {
            return classifyNominal(paraInstance);
        } else if (dataType == NUMERICAL) {
            return classifyNumerical(paraInstance);
        } // Of if

        return -1;
    }// Of classify

        以下是分类的核心代码,对于一个实例paraInstance,tempPseudoProbability记录概率结果,第一重for循环计算是否去玩的情况下的概率值,第二重for循环计算条件概率的log相加值,最后判断得到的两个概率值,谁大就选哪一种结果,判断完毕。

    /**
     ********************
     * Classify an instances with nominal data.
     ********************
     */
    public int classifyNominal(Instance paraInstance) {
        // Find the biggest one
        double tempBiggest = -10000;
        int resultBestIndex = 0;
        for (int i = 0; i < numClasses; i++) {
            double tempPseudoProbability = Math.log(classDistributionLaplacian[i]);
            for (int j = 0; j < numConditions; j++) {
                int tempAttributeValue = (int) paraInstance.value(j);

                tempPseudoProbability += Math.log(conditionalProbabilitiesLaplacian[i][j][tempAttributeValue]);
            } // Of for j

            if (tempBiggest < tempPseudoProbability) {
                tempBiggest = tempPseudoProbability;
                resultBestIndex = i;
            } // Of if
        } // Of for i

        return resultBestIndex;
    }// Of classifyNominal

三. 符号型数据的运行结果

        这里用的是天气的数据只有14条数据,准确率还是不错的0.928 

        接着使用mushroom数据对应的结果如下,准确率仍然不错

Day_59数值型数据的 NB 算法

一. 数值型数据的特点

        对于字符型数据我们直接计算每一个属性的个数就是了(例如outlook属性有3个);但是对于数值型数据(比如iris数据的sepalwidth属性,全是数值型值,怎么计算个数?不能计算),这里我们首先想到能不能积分?(意思就是将比如5.0-6.0sepalwidth属性统计为一类,然后sepalwidth就可以计数了),但是这样做有一个坏处,计算太麻烦了,假如sepalwidth的数值跨度太大,那么要分多少类才能统计完毕?

        所以这里我们思考能不能直接计算?答案是——可以!因为最终我们都是比对这些概率条件下的大小问题,因此我们可以让所有的数据列都适用一种概率评价指标。这里我们使用正态分布(因为这种假设对于通常的未知数据是可靠的,稳定的。)来模拟iris数据的每一个属性。用p(x)表示概率密度函数,p(x)是我们需要计算的用于模拟的结果。

        对于昨天计算出的Naive Bayes公式在经过Laplacian平滑的环境下有公式

        这里将P^{L}(x_{j}|D_{i})拿出来,这里D_{i}的含义是确定某一个结果,对应的x_{j}的属性的概率,对应到概率密度函数里面就是:其中P^{L}(D_{i}) 不改变,对应的用p(x_{j})代替P^{L}(x_{j}|D_{i}),接着下面公式里面的对应的方差和期望都是关于确定结果D_{i},计算对应的属性的值。

        这样我们就将离散的数值型变量用统一的计算方式表示出来了,这个式子就是数值型Naive Bayes的推导式了,因为一般都采用正态分布带描述一般的数值数据,而正态分布又叫做高斯分布,所以一般的数值型Naive Bayes又称之为Gaussian Naive Bayes算法。

二. 代码实现

        这里我只写和符号型代码不一样的地方

        1. 计算期望和方差

        当确定结果和属性之后,计算每一个的期望,期望=所有值相加/个数,方差=(每一个值-期望)的平方/个数在开根号。

   /**
     ********************
     * Calculate the conditional probabilities with Laplacian smooth.
     ********************
     */
    public void calculateGausssianParameters() {
        gaussianParameters = new GaussianParamters[numClasses][numConditions];

        double[] tempValuesArray = new double[numInstances];
        int tempNumValues = 0;
        double tempSum = 0;

        for (int i = 0; i < numClasses; i++) {
            for (int j = 0; j < numConditions; j++) {
                tempSum = 0;

                // Obtain values for this class.
                tempNumValues = 0;
                for (int k = 0; k < numInstances; k++) {
                    if ((int) dataset.instance(k).classValue() != i) {
                        continue;
                    } // Of if

                    tempValuesArray[tempNumValues] = dataset.instance(k).value(j);
                    tempSum += tempValuesArray[tempNumValues];
                    tempNumValues++;
                } // Of for k

                // Obtain parameters.
                double tempMu = tempSum / tempNumValues;

                double tempSigma = 0;
                for (int k = 0; k < tempNumValues; k++) {
                    tempSigma += (tempValuesArray[k] - tempMu) * (tempValuesArray[k] - tempMu);
                } // Of for k
                tempSigma /= tempNumValues;
                tempSigma = Math.sqrt(tempSigma);

                gaussianParameters[i][j] = new GaussianParamters(tempMu, tempSigma);
            } // Of for j
        } // Of for i

        System.out.println(Arrays.deepToString(gaussianParameters));
    }// Of calculateGausssianParameters

         2. 高斯类

        用于记录期望和方差。

   /**
     *************************
     * An inner class to store parameters.
     *************************
     */
    private class GaussianParamters {
        double mu;
        double sigma;

        public GaussianParamters(double paraMu, double paraSigma) {
            mu = paraMu;
            sigma = paraSigma;
        }// Of the constructor

        public String toString() {
            return "(" + mu + ", " + sigma + ")";
        }// Of toString
    }// Of GaussianParamters

        3. 预测结果

        由公式

        可以确定每一个条件对应的概率,最后根据概率的大小判断结论

    /**
     ********************
     * Classify an instances with numerical data.
     ********************
     */
    public int classifyNumerical(Instance paraInstance) {
        // Find the biggest one
        double tempBiggest = -10000;
        int resultBestIndex = 0;

        for (int i = 0; i < numClasses; i++) {
            double tempPseudoProbability = Math.log(classDistributionLaplacian[i]);
            for (int j = 0; j < numConditions; j++) {
                double tempAttributeValue = paraInstance.value(j);
                double tempSigma = gaussianParameters[i][j].sigma;
                double tempMu = gaussianParameters[i][j].mu;

                tempPseudoProbability += -Math.log(tempSigma)
                        - (tempAttributeValue - tempMu) * (tempAttributeValue - tempMu) / (2 * tempSigma * tempSigma);
            } // Of for j

            if (tempBiggest < tempPseudoProbability) {
                tempBiggest = tempPseudoProbability;
                resultBestIndex = i;
            } // Of if
        } // Of for i

        return resultBestIndex;
    }// Of classifyNumerical

三. 运行结果

        准确率为0.96还是相当准确的

         这里补充一点可以和kNN算法做对比

        kNN算法的运行结果:

 

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

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

相关文章

使用vtk创建设置了面的颜色的立方体

引言 该示例为官网上的例子。创建了一个每个面被设置相同颜色的立方体。 示例 开发环境 使用QtCreator4.11.2,Qt5.14.2。使用的vtk9.2的库及其头文件。创建空项目。 示例代码 其pro文件中的内容&#xff1a; QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT w…

利用jmeter测试java请求

jmeter和loadrunner一样包含了测试脚本开发、测试执行、以及测试结果统计三个部分。只是jmeter没有脚本开发工具&#xff0c;因此测试java请求的脚本选择在eclipse中进行。 首先介绍如何用eclipse编写接口性能测试脚本。 针对"Java请求"类型的测试&#xff0c;需要…

折半查找包含程序

折半查找又称二分查找&#xff0c;它仅适用于有序的顺序表 以下面的例子来讲解折半查找的过程 元素710131619293233374143数组位置012345678910 第一步&#xff1a;先确定查找元素&#xff0c;以14为例子&#xff1b;low和high分别是指向表的上界和下界&#xff1b;最开是low…

【Cookie】Cookie简介以及跨域问题

Cookie 一、Cookie简介 1、Cookie是什么 cookie是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件&#xff0c;它和你的网络浏览行为有关&#xff0c;所以存储在你电脑上的cookie就好像你的一张身份证&#xff0c;你电脑上的cookie和其他电脑上的cookie是不一样的。 …

java 堆(优先级队列)详解

JAVA堆以及优先级队列详解 一、堆的模拟实现1.1堆的概念1.2 堆的性质1.3堆的存储结构1.4堆的创建1.4.1 只有根节点不满足堆的特性1.4.2 不只有根节点不满足堆的特性1.4.2.1 建堆代码1.4.2.2 建堆过程图示 1.4.3 建堆的时间复杂度 1.5堆的插入1.5.1堆的插入的基本思想1.5.2堆的插…

非局部attention之Non-local

论文&#xff1a;Non-local Neural Networks Github&#xff1a;GitHub - AlexHex7/Non-local_pytorch: Implementation of Non-local Block. GitHub - facebookresearch/video-nonlocal-net: Non-local Neural Networks for Video Classification cvpr2018 凯明作品 论文提出…

Echarts自定义legend图例

legend: {icon: rect, // 形状itemHeight: 4, // 高度itemWidth: 18, // 宽度itemGap: 15, //设置图例的间距...... }, 效果&#xff1a;

QT进度条代理的实现

目的 进度条也是一个基本的功能&#xff0c;这里进度条想在Tableview里面实现&#xff0c;让Tableview其中一个单元格显示进度条&#xff0c;因为就用了代理。 什么是代理&#xff0c;官方说&#xff1a; 代理(Delegate)就是在视图组件上为编辑数据提供编辑器&#xff0c;如在…

Kindle刷机安装微信读书。

1、越狱 2、安装软件 3、刷机 4、安装微信读书 刷机参考链接&#xff1a; https://www.xiaohongshu.com/explore/63d3f730000000001f027d0e?sourcequestion Kindle 通用越狱教程&#xff1a;适用固件版本 5.12.2.2~5.14.2 – 书伴 正式开始了。 1、越狱&#xff0c;参考…

[Flask] Flask会话

由于HTTP的无状态性&#xff0c;为了使某个域名下的所有网页能够共享某些数据&#xff0c;Cookie和Session应运而生 1.Cookie对象 HTTP是无状态(stateless)协议&#xff0c;一次请求响应结束后&#xff0c;服务器不会留下任何关于对方状态的信息 也就是说&#xff0c;尽管在…

2023年数字人产业发展趋势报告:好看的皮囊到有趣的灵魂

报告来源&#xff1a;腾讯研究院 报告看点&#xff1a;随着交互智能技术的加速发展&#xff0c;数字人正在从技术创新走向产业应用。 在腾讯2022数字生态大会腾讯云智能专场上&#xff0c;腾讯研究院、腾讯云智能、创业黑马经过产业研究、实地调研&#xff0c;共同提炼发布《数…

【Spring】Spring Bean 容器的生命周期是什么样的?

文章目录 一、什么是 Spring Bean 的生命周期&#xff1f;二、Spring 中的 bean 的作用域有哪些?三、Spring Bean 的生命周期四、Spring Bean 的生命周期流程图 一、什么是 Spring Bean 的生命周期&#xff1f; 对于普通的 Java 对象&#xff0c;当 new 的时候创建对象&#…

智头条|2023TUYA开发者大会精彩不断,IDC预测:2026年全球AI服务支出将增至646亿美元

1、行业动态 奢侈品巨头LVMH宣布将推出元宇宙项目“The Journey” 近日&#xff0c;奢侈品巨头LVMH宣布推出元宇宙项目“The Journey”&#xff0c;允许旗下用户进入一个拥有专属产品和体验的全新虚拟世界&#xff0c;目前官网显示该元宇宙项目下包括The Showroom、The Tech …

HotSpot 垃圾收集器

HotSpot 垃圾收集器 HotSpot 虚拟机提供了多种垃圾收集器&#xff0c;每种收集器都有各自的特点&#xff0c;虽然我们要对各个收集器进行比较&#xff0c;但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。 新生代垃圾收集器 Serial 垃圾收集器&am…

Tomcat的部署及优化

目录 1.Tomcat概述 1.1 Tomcat的组件构成​编辑 1.2 Tomcat功能组件结构 1.3 Tomcat的请求过程 2. Tomcat服务的部署 2.1 搭建Tomcat运行环境 3.设置JDK环境变量​ 3.1测试java环境 4.安装启动Tomcat 1.Tomcat概述 Tomcat 是 基于Java 语言开发的Tomcat 属于轻量级应用服务…

数据结构 | 顺序线性表

一、数据结构定义 typedef int SqlTableType;typedef struct seqTable{int MAXNUM; // 最大元素个数 int curNum; // 元素的个数SqlTableType* element; // 连续空间的起始地址 }*SqlTable; 二、方法概览 SqlTable CreateSqlTable(int max); // 创建空顺序表 …

MySQL——mha高可用

MHA的概念 什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过…

【Android -- 面试】程序员面试必备软技能,值得收藏!

文章目录 一、准备技术型简历1. 准备简历模板2. 准备个⼈信息3. 准备专业技能4. 准备⼯作经历5. 准备项⽬经历 二、面试前的准备1. 利用脑图来梳理知识点2. 收到面试邀请后的准备 三、面试的注意事项1. ⾃我介绍2. 技术考察3. 向⾯试官提问4. 面试礼仪 四、如何通过 HR ⾯1. HR…

数据结构 | 顺序栈

一、数据结构定义 typedef int StackType; typedef struct seqStack{int MAXNUM; // 最大元素个数 int top; // 栈顶位置&#xff0c;初始化为0或-1StackType element[100]; // 元素的连续空间的起始地址 } *SeqStack; 二、方法概览 SeqStack CreateSqlStack…

【服务器数据恢复】ZFS文件系统下raid5数据恢复案例

服务器数据恢复环境&#xff1a; 某公司一台EMC某型号存储中有一组由12块硬盘组建的raid5磁盘阵列&#xff0c;其中有2块盘作为热备盘使用。 服务器故障&分析&#xff1a; raid5磁盘阵列中有2块磁盘离线&#xff0c;只有1块热备盘成功启用&#xff0c;另外一块热备盘未启用…