决策树(Decision Tree)

2023-11-09

一、简介

  决策树(decision tree)是一种基本的分类与回归方法。本章主要讨论用于分类的决策树。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。其主要优点是模型具有可读性,分类速度快。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测时,对新的数据,利用决策树模型进行分类。决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的修剪
这里写图片描述

二、特征选择

  不同的决策树的特征选择方法各有不同,用于分类的树可以采用信息增益,信息增益比,基尼系数等,用于回归的树可以采用损失函数最小等等方法。

1、熵

  熵的大小是代表一个随机变量的不确定性大小,如果一个随机变量的概率分布如下:

P(X=xi)=pi,i=1,2,3,n P ( X = x i ) = p i , i = 1 , 2 , 3 … , n

那么这个变量的熵为:
H(X)=i=1npilogpi H ( X ) = − ∑ i = 1 n p i log ⁡ p i

对于一个binary变量(0,1),熵随其中某一值概率变化的曲线如下:

这里写图片描述

2、条件熵

  条件熵指的是当某变量已知的情况下随机变量的不确定性,如下:

H(Y|X)=i=1npiH(Y|X=xi) H ( Y | X ) = ∑ i = 1 n p i H ( Y | X = x i )

上式中 pi=P(X=xi),i=1,2,,n p i = P ( X = x i ) , i = 1 , 2 , … , n

3、信息增益

  一个特征对于训练数据的信息增益指的是训练集合的经验熵与该特征给定的情况下的经验条件熵的差。如果一个熵是通过数据估计得到的,那么这个熵就是经验熵。 信息增益表示得知特征X的信息而使得Y的信息的不确定性减少的程度

g(D,A)=H(D)H(D|A) g ( D , A ) = H ( D ) − H ( D | A )

一般的这个差也被称之为互信息。在数的特征选择中会选择信息增益大的特征作为节点进行分类。

4、信息增益比

  由于采用信息增益作为特征选择的标准时,树会偏向于选择一些取值比较多的特征。为了解决这个问题可以采用信息增益比。信息增益比是该特征的信息增益与训练数据的关于该特征的熵的比值,如下:

gR(D,A)=g(D,A)HA(D) g R ( D , A ) = g ( D , A ) H A ( D )

上式中 HA(D)=ni=1|Di|Dlog2|Di|D H A ( D ) = − ∑ i = 1 n | D i | D log 2 ⁡ | D i | D ,n为特征A取值个数。

5、基尼指数

  基尼指数用在分类树中,这种树是二叉树,类似于信息增益用于描述集合的不确定性。

Gini(p)=k=1Kpk(1pk)=1k=1Kp2k G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2

上式中K为类的个数,pk为属于每个类的概率。由于这种树是二叉树,所以某一特征条件给定的时候样本集合会被分割成两个部分,那么在该特征A的条件下,集合D的基尼指数为:
Gini(D,A)=|D1||D|Gini(D1)+|D2||D|Gini(D2) G i n i ( D , A ) = | D 1 | | D | G i n i ( D 1 ) + | D 2 | | D | G i n i ( D 2 )

在分类树的训练过程中会采用基尼指数最小的特征条件来作为节点。

三、决策树的生成

1、ID3算法

  ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征。

这里写图片描述
这里写图片描述

2、C4.5算法

  C4.5对于ID3做了一些改进,将特征选取的依据从信息增益改成了信息增益比

这里写图片描述

3、CART回归树

回归树每次采用平方误差最小作为选择节点条件的依据,不停的将样本集合分割成两个区域,直到满足停止条件为止。

这里写图片描述

4、CART分类树

回归树每次采用基尼指数作为选择节点条件的依据,不停的将样本集合分割成两个区域,直到满足停止条件为止。

这里写图片描述

四、决策树的剪枝

  剪枝是解决决策树过拟合的方法之一。

1、ID3与C4.5算法的剪枝

这里写图片描述

2、CART算法的剪枝

这里写图片描述

五、决策树的实现(ID3)

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <fstream>
using namespace std;
#define MAXLEN 6//输入每行的数据个数  

//多叉树的实现   
//1 广义表  
//2 父指针表示法,适于经常找父结点的应用  
//3 子女链表示法,适于经常找子结点的应用  
//4 左长子,右兄弟表示法,实现比较麻烦  
//5 每个结点的所有孩子用vector保存  
//教训:数据结构的设计很重要,本算法采用5比较合适,同时  
//注意维护剩余样例和剩余属性信息,建树时横向遍历考循环属性的值,  
//纵向遍历靠递归调用  

vector<vector<string>> state;//实例集  
vector<vector<string>> state2;//实例集  
vector<string> item(MAXLEN);//对应一行实例集  
vector <string> attribute_row;//保存首行即属性行数据  
string end("end");//输入结束  
string yes("yes");  
string no("no");  
string blank("");  
map<string, vector<string >> map_attribute_values;//存储属性对应的所有的值
int tree_size = 0;  

struct Node//决策树节点
{
    string attribute;//属性值  
    string arrived_value;//到达的属性值  
    vector<Node *> childs;//所有的孩子  
    Node()
    {
        attribute = blank;  
        arrived_value = blank;  
    }  
};  
Node * root;  

//根据数据实例计算属性与值组成的map  
void ComputeMapFrom2DVector()
{  
    unsigned int i,j,k;  
    bool exited = false;  
    vector<string> values;  
    for(i = 1; i < MAXLEN-1; i++)//按照列遍历  
    {
        for (j = 1; j < state.size(); j++)
        {  
            for (k = 0; k < values.size(); k++)
            {  
                if(!values[k].compare(state[j][i])) exited = true;  
            }
            if(!exited)
            {  
                values.push_back(state[j][i]);//注意Vector的插入都是从前面插入的,注意更新it,始终指向vector头  
            }
            exited = false;  
        }
        map_attribute_values[state[0][i]] = values;  
        values.erase(values.begin(), values.end());  
    }     
}  

//根据具体属性和值来计算熵  
double ComputeEntropy(vector<vector<string>> remain_state, string attribute, string value,bool ifparent)
{  
    vector<int> count (2,0);  
    unsigned int i,j;  
    bool done_flag = false;//哨兵值  
    for(j = 1; j < MAXLEN; j++)
    {  
        if(done_flag) break;  
        if(!attribute_row[j].compare(attribute))
        {  
            for(i = 1; i < remain_state.size(); i++)
            {  
                //ifparent记录是否算父节点
                if((!ifparent&&!remain_state[i][j].compare(value)) || ifparent)
                {  
                    if(!remain_state[i][MAXLEN - 1].compare(yes))
                    {  
                        count[0]++;  
                    }  
                    else count[1]++;  
                }  
            }  
            done_flag = true;  
        }  
    }  
    if(count[0] == 0 || count[1] == 0 ) return 0;//全部是正实例或者负实例  
    //具体计算熵 根据[+count[0],-count[1]],log2为底通过换底公式换成自然数底数  
    double sum = count[0] + count[1];  
    double entropy = -count[0]/sum*log(count[0]/sum)/log(2.0) - count[1]/sum*log(count[1]/sum)/log(2.0);  
    return entropy;  
}  

//计算按照属性attribute划分当前剩余实例的信息增益  
double ComputeGain(vector<vector<string>> remain_state, string attribute)
{  
    unsigned int j,k,m;
    //首先求不做划分时的熵  
    double parent_entropy = ComputeEntropy(remain_state, attribute, blank, true);  
    double children_entropy = 0;  
    //然后求做划分后各个值的熵  
    vector<string> values = map_attribute_values[attribute];  
    vector<double> ratio;  
    vector<int> count_values;  
    int tempint;  
    for(m = 0; m < values.size(); m++)
    {  
        tempint = 0;  
        for(k = 1; k < MAXLEN - 1; k++)
        {  
            if(!attribute_row[k].compare(attribute))
            {  
                for(j = 1; j < remain_state.size(); j++)
                {  
                    if(!remain_state[j][k].compare(values[m]))
                    {  
                        tempint++;  
                    }  
                }  
            }  
        }  
        count_values.push_back(tempint);  
    }  

    for(j = 0; j < values.size(); j++)
    {  
        ratio.push_back((double)count_values[j] / (double)(remain_state.size()-1));  
    }  
    double temp_entropy;  
    for(j = 0; j < values.size(); j++)
    {  
        temp_entropy = ComputeEntropy(remain_state, attribute, values[j], false);  
        children_entropy += ratio[j] * temp_entropy;  
    }  
    return (parent_entropy - children_entropy);   
}  

int FindAttriNumByName(string attri)
{  
    for(int i = 0; i < MAXLEN; i++)
    {  
        if(!state[0][i].compare(attri)) return i;  
    }  
    cerr<<"can't find the numth of attribute"<<endl;   
    return 0;  
}  

//找出样例中占多数的正/负性  
string MostCommonLabel(vector<vector<string>> remain_state)
{  
    int p = 0, n = 0;  
    for(unsigned i = 0; i < remain_state.size(); i++)
    {  
        if(!remain_state[i][MAXLEN-1].compare(yes)) p++;  
        else n++;  
    }  
    if(p >= n) return yes;  
    else return no;  
}  

//判断样例是否正负性都为label  
bool AllTheSameLabel(vector<vector<string>> remain_state, string label
){  
    int count = 0;  
    for(unsigned int i = 0; i < remain_state.size(); i++)
    {  
        if(!remain_state[i][MAXLEN-1].compare(label)) count++;  
    }  
    if(count == remain_state.size()-1) return true;  
    else return false;  
}  

//计算信息增益,DFS构建决策树  
//current_node为当前的节点  
//remain_state为剩余待分类的样例  
//remian_attribute为剩余还没有考虑的属性  
//返回根结点指针  
Node * BulidDecisionTreeDFS(Node * p, vector<vector<string>> remain_state, vector<string> remain_attribute)
{  
    if (p == NULL)  
        p = new Node();  
    //先看搜索到树叶的情况  
    if (AllTheSameLabel(remain_state, yes))
    {  
        p->attribute = yes;  
        return p;  
    }  
    if (AllTheSameLabel(remain_state, no))
    {  
        p->attribute = no;  
        return p;  
    }  
    if(remain_attribute.size() == 0)//所有的属性均已经考虑完了,还没有分尽 
    { 
        string label = MostCommonLabel(remain_state);  
        p->attribute = label;  
        return p;  
    }  
    double max_gain = 0, temp_gain;  
    vector <string>::iterator max_it = remain_attribute.begin();  
    vector <string>::iterator it1;  
    for(it1 = remain_attribute.begin(); it1 < remain_attribute.end(); it1++)
    {  
        temp_gain = ComputeGain(remain_state, (*it1));  
        if(temp_gain > max_gain) 
        {  
            max_gain = temp_gain;  
            max_it = it1;  
        }  
    }  
    //下面根据max_it指向的属性来划分当前样例,更新样例集和属性集  
    vector <string> new_attribute;  
    vector <vector <string> > new_state;  
    for(vector <string>::iterator it2 = remain_attribute.begin(); it2 < remain_attribute.end(); it2++)
    {  
        if((*it2).compare(*max_it)) new_attribute.push_back(*it2);  
    }  
    //确定了最佳划分属性,注意保存  
    p->attribute = *max_it;  
    vector <string> values = map_attribute_values[*max_it];  
    int attribue_num = FindAttriNumByName(*max_it);  
    new_state.push_back(attribute_row);  
    for(vector <string>::iterator it3 = values.begin(); it3 < values.end(); it3++)
    {  
        for(unsigned int i = 1; i < remain_state.size(); i++)
        {  
            if(!remain_state[i][attribue_num].compare(*it3))
            {  
                new_state.push_back(remain_state[i]);  
            }  
        }  
        Node * new_node = new Node();  
        new_node->arrived_value = *it3;  
        if(new_state.size() == 0)//表示当前没有这个分支的样例,当前的new_node为叶子节点
        {  
            new_node->attribute = MostCommonLabel(remain_state);  
        }  
        else   
            BulidDecisionTreeDFS(new_node, new_state, new_attribute);  
        //递归函数返回时即回溯时需要1 将新结点加入父节点孩子容器 2清除new_state容器  
        p->childs.push_back(new_node);  
        new_state.erase(new_state.begin()+1,new_state.end());//注意先清空new_state中的前一个取值的样例,准备遍历下一个取值样例  
    }  
    return p;  
}  

void Input()
{  
    string s;  
    while(cin>>s,s.compare("end") != 0)//-1为输入结束
    {  
        item[0] = s;  
        for(int i = 1;i < MAXLEN; i++)
        {  
            cin>>item[i];  
        }  
        state.push_back(item);//注意首行信息也输入进去,即属性  
    }  
    for(int j = 0; j < MAXLEN; j++)
    {  
        attribute_row.push_back(state[0][j]);  
    }  
}  


void Input2()
{  
    ofstream in;
    in.open("result.txt",ios::trunc); //ios::trunc表示在打开文件前将文件清空,由于是写入,文件不存在则创建
    string s;  
    while(cin>>s,s.compare("end") != 0)//-1为输入结束
    {  
        vector <string> item2(MAXLEN);//对应一行实例集  
        item2[0] = s;  
        for(int i = 1;i < MAXLEN-1; i++)
        {  
            cin>>item2[i];  
        }  
        if(item2[1] == "sunny"  && item2[3] == "high") 
        {
            cout<<"no"<<endl;;
            in<<"no"<<"\n";
        }
        if(item2[1] == "sunny"  && item2[3] == "normal") 
        {
            cout<<"yes"<<endl;in<<"yes"<<"\n";
        }
        if(item2[1] == "overcast")  
        {
            cout<<"yes"<<endl;in<<"yes"<<"\n";
        }
        if(item2[1] == "rain" && item2[4] == "false") 
        {
            cout<<"yes"<<endl;in<<"yes"<<"\n";
        }
        if(item2[1] == "rain" && item2[4] == "true") 
        {
            cout<<"no"<<endl;in<<"no"<<"\n";
        }
    }  
    in.close();//关闭文件
}  

void PrintTree(Node *p, int depth)
{  
    for (int i = 0; i < depth; i++) cout << '\t';//按照树的深度先输出tab  
    if(!p->arrived_value.empty())
    {  
        cout<<p->arrived_value<<endl;  
        for (int i = 0; i < depth+1; i++) cout << '\t';//按照树的深度先输出tab  
    }  
    cout<<p->attribute<<endl;  
    for (vector<Node*>::iterator it = p->childs.begin(); it != p->childs.end(); it++)
    {  
        PrintTree(*it, depth + 1);  
    }  
}  

void FreeTree(Node *p)
{
    if (p == NULL)
        return;
    for (vector<Node*>::iterator it = p->childs.begin(); it != p->childs.end(); it++)
    {
        FreeTree(*it);
    }
    delete p;
    tree_size++;
}

int main()
{
    Input();
    vector<string> remain_attribute;

    string outlook("outlook");
    string Temperature("temperature");
    string Humidity("humidity");
    string Wind("wind");
    remain_attribute.push_back(outlook);
    remain_attribute.push_back(Temperature);
    remain_attribute.push_back(Humidity);
    remain_attribute.push_back(Wind);
    vector<vector<string>> remain_state;
    for(unsigned int i = 0; i < state.size(); i++)
    {  
        remain_state.push_back(state[i]);
    }
    ComputeMapFrom2DVector();  
    root = BulidDecisionTreeDFS(root,remain_state,remain_attribute);
    cout<<"the decision tree is :"<<endl;
    PrintTree(root,0);
    FreeTree(root);
    cout<<endl;
    cout<<"tree_size:"<<tree_size<<endl;
    Input2();
    return 0;  
}
//从控制台输入训练集
day outlook temperature humidity wind result
1 sunny hot high false no  
2 sunny hot high true no  
3 overcast hot high false yes  
4 rain mild high false yes  
5 rain cool normal false yes  
6 rain cool normal true no  
7 overcast cool normal true yes  
8 sunny mild high false no  
9 sunny cool normal false yes  
10 rain mild normal false yes  
11 sunny mild normal true yes  
12 overcast mild high true yes  
13 overcast hot normal false yes  
14 rain mild high true no  
end
//从控制台输入测试集
8 sunny mild high false 
9 sunny cool normal false 
10 rain mild normal false 
11 sunny mild normal true  
12 overcast mild high true 
13 overcast hot normal false  
14 rain mild high true

六、决策树总结

【优点】:

1. 计算量简单,可解释性强,比较适合处理有缺失属性值的样本,能够处理不相关的特征;

【缺点】:

1. 单颗决策树分类能力弱,并且对连续值变量难以处理;

2. 容易过拟合(后续出现了随机森林,减小了过拟合现象)。

参考:https://blog.csdn.net/qq_24699745/article/details/78226057
https://blog.csdn.net/u013058160/article/details/50396822
https://www.cnblogs.com/YongSun/p/4767085.html
https://blog.csdn.net/zhengzhenxian/article/details/79083643
https://blog.csdn.net/zuoyigexingfude/article/details/46974047
https://blog.csdn.net/lc013/article/details/55048641

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

决策树(Decision Tree) 的相关文章

  • 在 WooCommerce 中隐藏特定运输类别的运输方式

    本质上我正在尝试使统一费率方法 Idflat rate 7 disabled当购物车商品的运输类别为 Roller ID92 这是我尝试过的代码 add filter woocommerce package rates wf hide sh
  • WooCommerce 价格覆盖不起作用

    我已经使用设置了一个隐藏的输入项woocommerce before add to cart button hook function add gift wrap field gt
  • 根据购物车商品数量和产品类别进行折扣

    我正在尝试根据最小购物车商品数量和类别添加自定义购物车折扣 我从这个答案中获取了代码 购物车折扣基于购物车商品数量 并且仅适用于未促销的商品 我对其进行了一些更改 这是我的代码 add action woocommerce cart cal
  • 机器学习---决策树

    介绍 决策树和随机森林都是非线性有监督的分类模型 决策树是一种树形结构 树内部每个节点表示一个属性上的测试 每个分支代表一个测试输出 每个叶子节点代表一个分类类别 通过训练数据构建决策树 可以对未知数据进行分类 随机森林是由多个决策树组成
  • 在 Woocommerce 中更改删除购物车项目 url

    我的简单问题是如何使这段代码正常工作 esc url WC gt cart gt get cart url gt get remove url cart item key 以上我已经尝试过 当前代码如下 esc url woocommerc
  • 基于 Woocommerce 中的自定义单选按钮的动态运费

    在 Woocommerce 中 我在结帐页面上添加了两个自定义单选按钮 单击后 我调用 ajax 函数来添加送货费 这是我的代码 document on change shipping method 0 local pickup5 func
  • TagLib Sharp 不编辑艺术家

    我正在尝试将新的艺术家和标题 id3 标签保存到曲目中 从曲目加载标签工作正常 编辑曲目标题也工作正常 但是当我尝试编辑时演员 artist 它没有改变任何东西 这是代码 public void renameID3 string artis
  • 当 WooCommerce 购物车页面上的数量更新时拆分购物车项目

    我想将同一产品的购物车项目拆分为单独的行 当我增加单个产品页面上的数量并添加到购物车时 它显示为单独的购物车项目 我在用着WooCommerce 如果数量超过 1 则将购物车商品分开处理 https stackoverflow com a
  • WooCommerce:按产品类别划分的自定义购物车项目计数

    I found 这个脚本 https docs woothemes com document show cart contents total 这允许我在 WooCommerce 中的购物车图标上方显示购物车内容总数 a class car
  • 读取远程 mp3 文件的 ID3 标签?

    使用 Silverlight 读取 MP3 标签 https stackoverflow com questions 1477835 read mp3 tags with silverlight让我开始阅读 id3 标签 但我意识到 tag
  • 根据 Woocommerce 中的产品类别添加到购物车的最大商品数量

    我正在尝试自定义商店 以便名为 Quantity4 的类别仅允许在购物车中添加 4 个商品 而名为 Quantity6 的类别仅允许在购物车中添加商品 据我所知 这可以使用嵌套来实现if声明 但不知何故这不起作用 add filter wo
  • 如果不在 Woocommerce 中重新加载,自定义购物车计数不会更新

    我已将 ajax 脚本排入队列 但在不刷新页面的情况下似乎无法更新购物车商品计数 功能 Add scripts and stylesheets function startwordpress scripts wp enqueue style
  • 哪个 Hook 可以更改 WooCommerce 购物车页面中的数量更新?

    当购物车中的产品数量发生变化时 我试图触发一个功能 更具体地说 我想在客户修改购物车中的金额时运行此功能 我正在寻找购物车中剩余的金额 然后拦截更新购物车事件 目前我正在使用 add action woocommerce remove ca
  • 避免在 WooCommerce 购物车中组合虚拟和物理产品

    我已经寻找这个问题很长时间了 但似乎从未找到可能的解决方案 有谁看到任何解决方案如何在一个 Woocommerce 购物车中仅允许物理或虚拟产品 当客户尝试添加虚拟和物理的组合并禁止该组合时 或者确保该组合不能出现在一个购物车中时 可能会弹
  • 检查优惠券是否应用于 WooCommerce 中的购物车

    我需要找到一种方法来检查优惠券是否适用于 WooCommerce 结帐 如果是这样 我想做点什么 我尝试四处寻找这个问题 但找不到解决方案 这是我正在尝试的精简版本 add action woocommerce before cart ta
  • ID3v2.3 标签中的文本编码

    感谢这个网站和其他一些网站 我创建了一些简单的代码来从 MP3 文件中读取 ID3v2 3 标签 这样做是一次很棒的学习经历 因为我以前对十六进制 字节 二进制等一无所知 我可以成功读取数据 但遇到了一个我认为与使用的编码有关的问题 我意识
  • 如何使用 python 读取专辑封面? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在我的搜索中 我发现有一些库可以通过读取 ID3 标签来做到这一点 如果是这样 哪一个最好用 我不打算
  • 更改 WooCommerce 购物车和结帐页面中的“运输”文本:[重复]

    这个问题在这里已经有答案了 我正在将 WooCommerce 与 Storefront 主题一起使用 并且我正在尝试更改这个词 船运 在带有总计的购物篮页面上 我在这里找到了一些建议 https kriesi at support topi
  • 使用 python 提取 MP3 URL 的 ID3 标签并进行部分下载

    我需要提取远程 mp3 文件的 ID3 标签和元数据 我写了几行可以获取本地文件的ID3标签 from mutagen mp3 import MP3 import urllib2 audio MP3 Whistle mp3 songtitl
  • 在 WooCommerce 中添加到购物车之前清空购物车

    我正在使用 WP 作业管理器和 Woo Subscriptions Now 最初 我选择了一个套餐 Woo Subscription 然后我添加了所有细节 但没有提交 回到网站 所以要再次购买 我需要选择一个套餐 于是我选择了套餐并填写了详

随机推荐

  • Qt多进程间通信方式——共享内存

    正文 Windows平台下进程间通信常用方式有管道 文件映射 Socket通信和共享内存等 这里详细介绍一下Qt的共享内存机制 Qt官方例子 Qt官方的例子主要是一个客户端加载图片后 将图片存储到共享内存中 另一个客户端从共享内存中获取图片
  • duboo使用zookeeper连接的单机及集群配置方式

    1 单机配置
  • Spring Boot中使用WebSocket 【第一部分】

    简介 所谓WebSocket 类似于Socket 它的作用是可以让Web应用中的客户端和服务端建立全双工通信 在基于Spring的应用中使用WebSocket一般可以有以下三种方式 使用Java提供的 ServerEndpoint注解实现
  • 关于maven项目中Tomcat10与JSTL问题汇总(Debug亲身经历)

    文章目录 问题描述与解决方法 问题1 无法在web xml或使用此应用程序部署的jar文件中解析绝对uri http java sun com jsp jstl core 问题2 java lang NoClassDefFoundError
  • java 调用cmd_java打开本地应用程序(调用cmd)---Runtime用法详解

    有时候我们需要借助java程序打开电脑自带的一些程序 可以直接打开或者借助cmd命令窗口打开一些常用的应用程序或者脚本 在cmd窗口执行的命令都可以通过这种方式运行 例如 packagecn xm exam test importjava
  • 爱情与婚姻的区别(多种说法)

    在生活中 爱情与婚姻的话题 总是被人们不停的讨论着 有人说婚姻是爱情的坟墓 也有人说婚姻是爱情的延续 可我却认为 爱情是浪漫的 而婚姻是现实的 在现实中没有一个人敢说自己真正的懂得爱情 或是看透了婚姻 而至于婚姻是爱情的延续也好 或婚姻是爱
  • html5 css3教案,认识CSS3和HTML5

    内容简介 认识CSS3和HTML5 内容节选 共100页 本文写于2006年1月 当时IE7 IE8和Firefox3还未发行 文中所有说的浏览器支持均未包括这三个版本的浏览器 在IE8和Firefox3中 文中的大部分选择符已经被支持 d
  • android 实现GridView多选效果

    在使用 GridView的时候 有时需要多选上面显示的类容 比如批量删除上面显示的图片 批量上传图片等 这个时候我们可以使用层叠图来实现 效果如下 点击图片后 上面会显示出一个打钩的图片 如图 再点击选中图片 勾消失 转存失败重新上传取消
  • 基于均匀分布总体的样本及其概率密度函数的数据分析

    基于均匀分布总体的样本及其概率密度函数的数据分析 在数据分析中 我们经常遇到从某个总体中获取的样本数据 本文将讨论一个由均匀分布总体生成的样本 并使用R语言来演示相关的数据分析技术 首先 让我们了解均匀分布总体及其概率密度函数 均匀分布是一
  • 动态数据锚点定位

    锚点定位 左侧点击右侧锚点定位样式一 div class left a href book time a a href search a a href search flow a div div class right div div di
  • Java算法LC刷(3.无重复字符的最长子串)

    无重复字符的最长子串 package com core doc LeetCode public class T3 public static void main String args int map lengthOfLongestSubs
  • DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead

    问题描述 使用find element by id时报错 DeprecationWarning find element by commands are deprecated Please use find element instead
  • php组件缓冲区溢出漏洞,一个缓冲区溢出漏洞的简易教程

    这篇文章类似于 傻瓜系列之利用缓冲区溢出 在这类漏洞中 我们的做法是利用网络 程序控制器 输入等等 发送超大的数据缓冲区给程序 覆盖程序内存的重要部分 在这些缓冲区覆盖程序内存之后 我们可以重定向程序的执行流并运行注入代码 首先 我们需要做
  • 财务用计算机在成本核销,《初级会计电算化》精选题库附答案解析(五)

    初级会计电算化 练习题五 含答案解析 1 当月的记账凭证必须全部记账 如有未记账的当月凭证 系统将 TopSage A 不能结账 B 继续结账 C 放到下月 答案 A 2 往来账管理的往来客户档案的设置其最主要内容是 TopSage A 客
  • 关于 IDEA创建Spring项目时出现Cannot resolve plugin XXX的解决办法

    在创建spring项目时候Plugins文件夹下面出现许多的红色波浪报错 如下 org apache maven plugins maven clean plugin 2 5 org apache maven plugins maven c
  • 前端 - js - 编程题23 - 两数之和

    给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 你不能重复利用这个数组中同样的元素 示例 给定nums 2 7 11 15
  • Windows系统如何查看占用的端口

    Windows系统如何查看占用的端口 在有些时候 我们需要知道Windows系统占用了那些端口 比如 需要在服务器上部署一个应用程序时 需要给这个应用程序提供空闲端口用来通信 除了一些约定俗成的端口外 例如 HTTP服务占用80端口 FTP
  • Java多线程列子

    问题如下 两个线程 线程A 线程B 一个固定容量为50的队列List
  • 解决Spring boot 工程console打印太多信息

    resources下添加配置文件 logback xml 添加下面代码
  • 决策树(Decision Tree)

    一 简介 决策树 decision tree 是一种基本的分类与回归方法 本章主要讨论用于分类的决策树 决策树模型呈树形结构 在分类问题中 表示基于特征对实例进行分类的过程 它可以认为是if then规则的集合 也可以认为是定义在特征空间与