从决策树到xgboost(一)

文章目录

  • 1 决策树
    • 1.1决策树定义
    • 1.2信息增益
    • 1.3 信息增益的算法
    • 1.4 信息增益比
  • 2 决策树ID3
    • 2.1 ID3树的构建
    • 2.2 决策树的剪枝
      • 2.2.1 损失函数定义与计算
      • 2.2.2 剪枝过程
    • 2.3 CART树
      • 2.3.1 CART回归树
      • 2.3.2 CART分类树
      • 2.3.3 CART树剪枝

1 决策树

1.1决策树定义

决策树的基本组成:决策节点、分支、叶子。
在这里插入图片描述

决策树表示给定特征条件下的概率分布。
条件概率分布定义在特征空间的一个划分上。将特征空间划分为互不相交的单元。并在每个单元上定义一个类的概率分布,就构成了一个条件概率分布。
决策树的一条路径对应于划分中的一个单元。

决策树的本质是在特征空间上的切割。
在这里插入图片描述

1.2信息增益

:设X是一个取有限个值的离散随机变量,其概率分布为:P(X=xi)=pi,i=1,2,3...nP(X=x_i)=p_i,i=1,2,3...nP(X=xi)=pi,i=1,2,3...n
那么X的熵为:H(X)=−∑i=1npilogpiH(X)=-\sum_{i=1}^np_ilogp_iH(X)=i=1npilogpi
对数以2为底或者以e为底,这时熵的单位称为比特或者纳特。熵只依赖于X的分布,而与X的具体取值无关。
熵的理论解释:熵越大,随机变量的不确定性越大。0<=H(X)<=logn0<=H(X)<=logn0<=H(X)<=logn.
例如,一个骰子6个面全是1,那么H(X)=−1∗log1=0H(X)=-1*log1=0H(X)=1log1=0。因为结果是确定的。
如果6个面分别为1,2,3,4,5,6,并且每个面的概率相同,都是16\dfrac{1}{6}61。那么H(X)=−(16log(16)+16log(16)+16log(16)+16log(16)+16log(16)+16log(16))=−(0.17∗(−2.58)∗6)=2.58H(X)=-(\dfrac{1}{6}log(\dfrac{1}{6})+\dfrac{1}{6}log(\dfrac{1}{6})+\dfrac{1}{6}log(\dfrac{1}{6})+\dfrac{1}{6}log(\dfrac{1}{6})+\dfrac{1}{6}log(\dfrac{1}{6})+\dfrac{1}{6}log(\dfrac{1}{6}))=-(0.17*(-2.58)*6)=2.58H(X)=(61log(61)+61log(61)+61log(61)+61log(61)+61log(61)+61log(61))=(0.17(2.58)6)=2.58,这个时候的不确定性就比刚才要高。

设有随机变量(X,Y),其联合概率分布为P(X=xi,Y=yi)=pi,j,i=1,2,3...n;j=1,2,3...mP(X=x_i,Y=y_i)=p_{i,j},i=1,2,3...n; j=1,2,3...mP(X=xi,Y=yi)=pi,j,i=1,2,3...n;j=1,2,3...m
条件熵H(Y|X):表示在已知随机变量X的条件下,Y的不确定性。定义为X给定条件下Y的条件概率分布的熵对X的数学期望:H(Y∣X)=∑i=1npiH(Y∣X=xi)H(Y|X)=\sum_{i=1}^np_iH(Y|X=x_i)H(YX)=i=1npiH(YX=xi)

当熵和条件熵,由数据估计得到时,分别称为经验熵与经验条件熵。

信息增益:特征A对训练数据集D的信息增益g(D,A)定义为:集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差:g(D,A)=H(D)−H(D∣A)g(D,A)=H(D)-H(D|A)g(D,A)=H(D)H(DA)
这表示了特征X的引入,使得分类Y的不确定性减少的程度。
互信息=信息熵H(Y)-条件熵H(Y|X)

1.3 信息增益的算法

设训练数据集为D
|D|表示其样本容量,即样本个数
设有K个类CkC_kCk,k=1,2,3…K
∣Ck∣|C_k|Ck表示属于类CkC_kCk的样本数
特征A有n个不同的取值{a1,a2,...ana_1,a_2,...a_na1,a2,...an}。根据特征A的取值,将D划分为n个子集D1,D2...DnD_1,D_2...D_nD1,D2...Dn
∣Di∣|D_i|Di为子集DiD_iDi的样本个数
子集DiD_iDi中属于类CkC_kCk的样本集合为DikD_{ik}Dik
∣Dik∣|D_{ik}|Dik为集合DikD_{ik}Dik的样本数

输入:数据集D,以及特征A
输出:特征A对数据集的信息增益g(D,A)
1 计算数据集D的经验熵H(D):H(D)=−∑k=1K∣Ck∣∣D∣log2∣Ck∣∣D∣H(D)=-\sum_{k=1}^K\dfrac{|C_k|}{|D|}log_2\dfrac{|C_k|}{|D|}H(D)=k=1KDCklog2DCk
2 计算特征A对数据集D的经验条件熵H(D|A):H(D∣A)=∑i=1n∣Di∣∣D∣H(Di)=∑i=1n∣Di∣∣D∣∑k=1K∣Dik∣∣Di∣log2∣Dik∣∣Di∣H(D|A)=\sum_{i=1}^n\dfrac{|D_i|}{|D|}H(D_i)=\sum_{i=1}^n\dfrac{|D_i|}{|D|}\sum_{k=1}^K\dfrac{|D_{ik}|}{|D_i|}log_2\dfrac{|D_{ik}|}{|D_i|}H(DA)=i=1nDDiH(Di)=i=1nDDik=1KDiDiklog2DiDik
3 计算信息增益g(D,A):g(D,A)=H(D)−H(D∣A)g(D,A)=H(D)-H(D|A)g(D,A)=H(D)H(DA)

1.4 信息增益比

以信息增益来选择特征,会倾向于选择特征取值多的特征。可以使用信息增益比来解决这个问题。

特征A对数据集D的信息增益比定义为信息增益与训练数据集D关于特征A的值的熵的比:gR(D,A)=g(D,A)HA(D)g_R(D,A)=\dfrac{g(D,A)}{H_A(D)}gR(D,A)=HA(D)g(D,A)
HA(D)=−∑i=1n∣Di∣∣D∣log2∣Di∣∣D∣H_A(D)=-\sum_{i=1}^n\dfrac{|D_i|}{|D|}log_2\dfrac{|D_i|}{|D|}HA(D)=i=1nDDilog2DDi,n为特征A的取值个数

2 决策树ID3

2.1 ID3树的构建

按照信息增益选择特征,形成的决策树称为ID3树。

输入:训练数据集D、特征集合A、阈值ϵ\epsilonϵ
输出:决策树T
1 若D中所有实例属于同一类CkC_kCk,则T为单节点树,并将类CkC_kCk作为该节点的类标签,返回T;
2 若A=∅A=\emptyA=,则T为单节点树,并选择D中实例数最大的类CkC_kCk作为该节点的类标签,返回T;
3 按照信息增益的算法,计算特征集合A中每个特征对D的信息增益,选择信息增益最大的特征AgA_gAg;
4 如果AgA_gAg的信息增益小于阈值ϵ\epsilonϵ,则T为单节点树,并选择D中实例数最大的类CkC_kCk作为该节点的类标签,返回T;
5 否则,对AgA_gAg的每一个可能的值aia_iai,依Ag=aiA_g=a_iAg=ai将D分割为若干非空子集DiD_iDi,将DiD_iDi中实例数最大的类作为节点标记,构建子节点。由节点及其子节点构成树T,返回T;
6 对第i个子节点,以数据集DiD_iDi作为训练集,以A-{AgA_gAg}为特征集,递归地调用步骤1-5,得到子树TiT_iTi,返回TiT_iTi

2.2 决策树的剪枝

2.2.1 损失函数定义与计算

通过极小化 决策树整体的损失函数 来实现。
设树|T|的叶子节点个数为|T|,t是树T的叶子节点,该叶子节点有NtN_tNt个样本。其中k类的样本量为NtkN_{tk}Ntk,k=1,2,3…K。
说明:一棵树T的叶子节点不一定只包含一类数据。例如在上述步骤2和5,就可能一个节点中实际存在多个类别的数据。只是因为再细分特征的信息增益太小了,不再划分。

Ht(T)H_t(T)Ht(T)为叶子节点t上的经验熵,α>=0\alpha>=0α>=0为参数,
损失函数:Cα(T)=∑i=1∣T∣NtHt(T)+α∣T∣C_{\alpha}(T)=\sum_{i=1}^{|T|}N_tH_t(T)+\alpha|T|Cα(T)=i=1TNtHt(T)+αT
说明:树的损失函数对所有叶子节点的遍历。每一个叶子节点计算:当前叶子节点个数NtN_tNt,以及叶子节点的熵Ht(T)H_t(T)Ht(T)。它们的乘积表示当前叶子节点不确定的度量,也就是损失。对所有叶子节点不确定性的度量,就称为树的损失。
α∣T∣\alpha|T|αT是为了防止树过拟合。

∑i=1∣T∣NtHt(T)\sum_{i=1}^{|T|}N_tH_t(T)i=1TNtHt(T)熵越小,说明叶子节点越来越多,这一部分会使得模型越来越复杂。α∣T∣\alpha|T|αT是为了对抗模型过渡复杂。

经验熵:Ht(T)=−∑kNtkNtlogNtkNtH_t(T)=-\sum_k\dfrac{N_{tk}}{N_t}log\dfrac{N_{tk}}{N_t}Ht(T)=kNtNtklogNtNtk

C(T)=∑i=1∣T∣NtHt(T)=−∑i=1∣T∣∑k=1KNtklogNtkNtC(T)= \sum_{i=1}^{|T|}N_tH_t(T)=-\sum_{i=1}^{|T|}\sum_{k=1}^KN_{tk}log\dfrac{N_{tk}}{N_t}C(T)=i=1TNtHt(T)=i=1Tk=1KNtklogNtNtk

那么 Cα(T)=C(T)+α∣T∣C_{\alpha}(T)=C(T)+\alpha|T|Cα(T)=C(T)+αT

2.2.2 剪枝过程

输入:决策树T,参数α\alphaα
输出:剪枝后的子树TαT_{\alpha}Tα
1 计算每个节点的经验熵
2 递归地从树的叶子结点向上缩
设一组叶子节点回缩到其父节点之前与之后的损失函数分别为:Cα(TB)C_{\alpha}(T_B)Cα(TB)Cα(TA)C_{\alpha}(T_A)Cα(TA)
如果:Cα(TA)C_{\alpha}(T_A)Cα(TA)<=Cα(TB)C_{\alpha}(T_B)Cα(TB),则进行剪枝。
3 返回2,直至不能继续为止,得到损失最小的子树TaT_aTa

以上过程将信息增益,换成信息增益比,那么得到的树就是C4.5。

2.3 CART树

CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法。
CART树是一棵二叉树。左分支的取值为是,右分支的取值为否。
这样的决策树等价于递归地二分每个特征,将输入空间划分为有限个单元,并在这些单元上确定预测的概率分布。
CART算法=决策树生成 + 决策树剪枝

2.3.1 CART回归树

  • 树的定义

设Y是连续变量,给定训练数据集:D={(x1,y1),(x2,y2),...(xn,yn)}D=\{(x_1,y_1),(x_2,y_2),...(x_n,y_n)\}D={(x1,y1),(x2,y2),...(xn,yn)}yi∈Ry_i \in RyiR 。假设已经将输入空间划分为M个单元R1,R2…Rm,每个单元上RmR_mRm上有一个固定的输出CmC_mCm,则回归树表示为:f(x)=∑m=1MCmI(x∈Rm)f(x)=\sum_{m=1}^MC_mI(x\in R_m)f(x)=m=1MCmI(xRm)
备注:遍历所有分割的子空间,数据属于某个子空间,函数值就是该空间的输出值。

  • 求解每个单元上的最优输出值

平方误差来表示预测误差,用平方误差最小准则求解每个单元上的最优输出值:∑xi∈Rm(yi−f(x))2\sum_{x_i \in R_m}(y_i-f(x))^2xiRm(yif(x))2

那么RmR_mRm上的CmC_mCm的最优值怎么计算呢?cm^=ave(yi∣xi∈Rm)\hat{c_m} = ave(y_i|x_i \in R_m)cm^=ave(yixiRm) 使用落在RmR_mRm空间内所有点的y值求平均得到。

  • 如何对输入空间进行划分

使用启发式选择的方法。
选择第j个变量x(j)x^{(j)}x(j)和它的取值s,作为切分变量和切分点,定义两个区域,一个是比s小的,一个是比s大的:R1={x∣x(j)<=s}R_1=\{x|x^{(j)}<=s\}R1={xx(j)<=s}R2={x∣x(j)>s}R_2=\{x|x^{(j)}>s\}R2={xx(j)>s}

寻找最优切分变量和切分点:
minj,s[mine1∑xi∈R1(yi−c1)2+mine2∑xi∈R2(yi−c2)2]min_{j,s}[min_{e_1}\sum_{x_i \in R_1}(y_i-c_1)^2+min_{e2}\sum_{x_i\in R_2}(y_i-c_2)^2]minj,s[mine1xiR1(yic1)2+mine2xiR2(yic2)2]

c1^=ave(yi∣xi∈R1)\hat{c_1}=ave(y_i|x_i\in R_1)c1^=ave(yixiR1)
c2^=ave(yi∣xi∈R2)\hat{c_2}=ave(y_i|x_i\in R_2)c2^=ave(yixiR2)
使得两部分误差和最小的变量j和切分点s
需要对所有变量和所有切分点遍历。(这是NP问题吧)

再对两个区域重复上述划分,直到满足停止条件。

总结成算法是这样的:最小二乘回归树生成算法。
输入:训练数据集D
输出:回归树f(x)
在训练数据集所在的输入空间中,递归地将每个区域划分为2个子区域,并决定每个子区域上的输出值,构建二叉决策树。
1 选择最优切分变量j和切分点s,求解

minj,s[mine1∑xi∈R1(yi−c1)2+mine2∑xi∈R2(yi−c2)2]min_{j,s}[min_{e_1}\sum_{x_i \in R_1}(y_i-c_1)^2+min_{e2}\sum_{x_i\in R_2}(y_i-c_2)^2]minj,s[mine1xiR1(yic1)2+mine2xiR2(yic2)2]

遍历变量j,对固定的切分变量j扫描切分点s,选择使得上式达到最小值的对(j,s)
2 用选定的对(j,s)划分区域,并决定相应的输出值:
R1={x∣x(j)<=s}R_1=\{x|x^{(j)}<=s\}R1={xx(j)<=s}
R2={x∣x(j)>s}R_2=\{x|x^{(j)}>s\}R2={xx(j)>s}
cm^=1Nm∑xi∈Rm(j,s)yi\hat{c_m}=\dfrac{1}{N_m}\sum_{x_i\in R_m(j,s)}y_icm^=Nm1xiRm(j,s)yix∈Rm,m=1,2x\in R_m,m=1,2xRm,m=1,2
每个子空间数据的y的平均值作为空间的输出。

3 继续对2个子区域调用步骤1,2,直到满足停止条件
4 将输入空间划分为M个区域R1,R2,...RMR_1,R_2,...R_MR1,R2,...RM,生成决策树:f(x)=∑m=1MCmI(x∈Rm)f(x)=\sum_{m=1}^MC_mI(x\in R_m)f(x)=m=1MCmI(xRm)

2.3.2 CART分类树

选择依据基尼指数
假设有K个分类,每个样本点属于分类k的概率是PkP_kPk。则概率分布的基尼指数:Gini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kpk2Gini(p)=\sum_{k=1}^K p_k(1-p_k)=1-\sum_{k=1}^Kp_k^2Gini(p)=k=1Kpk(1pk)=1k=1Kpk2
对于二分类Gini(p)=2p(1−p)Gini(p)=2p(1-p)Gini(p)=2p(1p)

对于给定数据集的基尼指数:Gini(D)=1−∑k=1K(∣Ck∣∣D∣)2Gini(D)=1-\sum_{k=1}^K(\dfrac{|C_k|}{|D|})^2Gini(D)=1k=1K(DCk)2

如果样本集合D根据特征A是否为a,划分为数据集D1,和数据集D2。
D1={(x,y)∈D∣A(x)=a}D_1=\{(x,y)\in D|A(x)=a\}D1={(x,y)DA(x)=a}
D2=D−D1D_2=D-D_1D2=DD1

在特征A下,集合D的基尼指数为:Gini(D)=∣D1∣∣D∣Gini(D1)+∣D2∣∣D∣Gini(D2)Gini(D)=\dfrac{|D_1|}{|D|}Gini(D_1)+\dfrac{|D_2|}{|D|}Gini(D_2)Gini(D)=DD1Gini(D1)+DD2Gini(D2)

CART分类树生成算法
输入:训练数据集D,停止计算条件
输出:CART分类树
从根节点开始,递归对每个结点操作。
1、设结点数据集为D,对每个特征A,对其每个值a,根据样本点对A=a的测试为是或否,将D分为D1,D2,计算A=a的基尼指数
2、在所有的特征A以及所有可能的切分点a中,选择基尼指数最小的特征和切分点,将数据集分配到两个子结点中。
3、对两个子结点递归调用1,2步骤
算法停止的条件是:节点中的样本个数小于阈值,或者样本集的基尼指数小于阈值。

2.3.3 CART树剪枝

计算子树的损失函数:Cα(T)=C(T)+α∣T∣C_{\alpha}(T)=C(T)+\alpha|T|Cα(T)=C(T)+αT
α\alphaα很大的时候,这样得到的会是一棵偏小的决策树。也就是叶子节点少的决策树。
α\alphaα从0到一个较大的值的过程中可以生成很多颗树。选择最优的子树TαT_{\alpha}Tα

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

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

相关文章

从决策树到xgboost(二)

文章目录3 集成学习4 Adaboost4.1 Adaboost算法4.1.1 初始化训练数据的起始权值分布4.1.2 对m个弱分类器m1,2,3...M4.1.3 构建弱分类器的线性组合4.1.4 得到最终的分类器5 Boosting5.1 加法模型5.2 前向分布算法6 提升决策树BDT6.1 BDT算法6.2 回归问题提升树7 梯度提升决策树G…

[伤了昨天的心 裂成碎片和沙一起飞]五香里脊

今晨3点挂的电话&#xff0c;6点睁开的眼。困到头痛&#xff0c;但还是烧了道肉菜。…**…**…**…**…**…**…**…*分隔 五香里脊*…**…**…**…**…**…**…**…五香里脊 材料&#xff1a;1&#xff0e;里脊肉、油、麻油。2&#xff0e;蒜末、辣椒末、水、生抽、老醋、糖、…

MOTOMAN-SV3X运动学建模验证图

以下是正解&#xff0c;逆解 结果 转载于:https://www.cnblogs.com/wqj1212/archive/2008/01/01/1022177.html

小程序·云开发实战 - 迷你微博

0. 前言 本文将手把手教你如何写出迷你版微博的一行行代码&#xff0c;迷你版微博包含以下功能&#xff1a; Feed 流&#xff1a;关注动态、所有动态发送图文动态搜索用户关注系统点赞动态个人主页使用到的云开发能力&#xff1a; 云数据库云存储云函数云调用没错&#xff0c;几…

spring mvc学习(60):ssm项目整合

SSM整合 建立springmvc项目&#xff0c;先跑起来&#xff0c;再整合spring和mybatis 一.SpringMVC建立 1.新建maven工程&#xff0c;安装tomcat 2.导入pom <!-- springmvc --><dependency><groupId>org.springframework</groupId><artifactId>…

回溯算法归纳

回溯算法解题思路回溯的两种思路题目描述按照思路1解决按思路2解决回溯的两种思路 看不同的解题方法&#xff0c;形成不同的思维。 先说结论。回溯解题思路1&#xff1a;是对可选择每个元素&#xff0c;采取不选择、选择两种策略&#xff0c;不断递归下去。最近看花花酱的视频…

mybatis学习(1):【持久化框架】Mybatis简介与原理

从这篇博文开始我们学习一下Mybatis&#xff0c;希望大家提出宝贵的建议。 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。iBATIS一词来源于“internet”和“abati…

UML类图解义

小菜&#xff1a;“对了&#xff0c;我时常在一些技术书中看到这些类图表示&#xff0c;简单的还看得懂&#xff0c;有些标记我很容易混淆。要不你给我讲讲吧。” 大鸟&#xff1a;“这个其实多看多用就熟悉了。我给你举一个例子&#xff0c;来看这样一幅图&#xff0c;其中就包…

mybatis学习(2):基本设置和核心配置

1创建一个简单的java项目 2导入jar包 建立一个lib包 链接&#xff1a;https://pan.baidu.com/s/1eJ7xXF2qvUbgde2T--Sphg 提取码&#xff1a;3bgy 加入junit的包 右键项目---build path---add library 4导入配置文件 log4j.properties ### ### log4j.rootLogger ERROR,s…

mybatis学习(3):映射文件的配置和接口创建

配置文件 db.properties jdbc.drivercom.oracle.jdbc.OracleDriver jdbc.urljdbc:oracle:thin:127.0.0.1:1521:wiicare jdbc.usernamewiicare jdbc.passwordMdsd123 log4j.properties ### ### log4j.rootLogger ERROR,stdout### ¡ ### log4j.appender.stdout org.ap…

mybatis学习(4):工具类和实体类的创建

配置文件 db.properties jdbc.drivercom.oracle.jdbc.OracleDriver jdbc.urljdbc:oracle:thin:127.0.0.1:1521:wiicare jdbc.usernamewiicare jdbc.passwordMdsd123 log4j.properties ### ### log4j.rootLogger ERROR,stdout### ¡ ### log4j.appender.stdout org.ap…

windows下解决pip安装出错问题

今天使用pip install xxx突然报错&#xff0c;找了好久全是在linux上的解决方案&#xff0c;好不容易找到一个windows下的解决方案&#xff0c;所以将他记录下来。 解决方案&#xff1a; cmd中敲命令&#xff1a;python -m ensurepip 得到pip的setuptools 然后就可以用&#xf…

检测ID卡的输入或者是其它卡的输入。

由于ID卡或者是其它的一些不同类型的卡&#xff0c;它们只是负责模拟键盘的录入&#xff0c;但是&#xff0c;它们在录入的时候没有一个很好的标识位可以让我们知道当前输入的是客户手工录入的字符串还是ID卡读入的字符串&#xff0c;我相信&#xff0c;很多人在做这样的开发时…

mybatis学习(6):IntelliJ IDEA 如何创建一个普通的 Java 项目,及创建 Java 文件并运行

一、创建 Java 项目&#xff1a; 1、打开 IDEA 软件&#xff0c;点击界面上的 Create New Project 2、出现以下界面&#xff0c;选中 Java&#xff0c;然后选择 JDK&#xff0c;最后点击 Next&#xff0c;进行下一步&#xff08;我的是 jdk1.8&#xff09; 3、这里是选择生成项…

第一百五十期:Java程序员必备:异常的十个关键知识点

总结了Java异常十个关键知识点&#xff0c;面试或者工作中都有用哦&#xff0c;加油。异常是指阻止当前方法或作用域继续执行的问题。比如你读取的文件不存在&#xff0c;数组越界&#xff0c;进行除法时&#xff0c;除数为0等都会导致异常。 前言 总结了Java异常十个关键知识点…

学用 TStringGrid [1] - ColCount、RowCount、Cells

本例功能:1、获取 StringGrid 的行数、列数;2、给单元赋值.运行效果图://示例代码: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls, Grids;typeTForm1 class(TForm)StringGrid1: TStringG…

第一百五十一期:最新计算机技能需求排名出炉:Python仅排第三,第一你猜得到吗?

除了编程语言之外&#xff0c;要想找一份计算机相关的工作&#xff0c;还需要很多其他方面的技能。最近&#xff0c;来自美国求职公司 Indeed 的一份报告显示&#xff1a;在全美工作技能需求中&#xff0c;数据库语言 SQL、编程语言 Java 分列前两位。 除了编程语言之外&#x…

歌谣致学习编程的你们

目录 致学习编程的你们&#xff0c;希望对大家有所帮助&#xff0c;纯属个人学习经验 前言 学习路线 个人网课学习平台 个人推荐两款软件 个人对于参加培训的看法 个人博客写作 同事同学资源 总结 前言 我是歌谣&#xff0c;一个致力于成为一名优秀的技术革新人员。高…

开发者福音!面向Web场景的云开发服务正式开放!

导 语 继支持小程序开发之后&#xff0c;云开发也支持Web使用啦&#xff01;开发者们可以使用云开发提供的云端能力&#xff0c;直接开发网站应用&#xff0c;如PC端网页、公众号中的网页等。由此开发者可以在网站应用中借助云函数实现业务逻辑&#xff0c;通过与云数据库、对象…

PetShop4.0--转载

以下文章转载于http://www.cnblogs.com/dragonlhf/archive/2006/07/30/463110.html petshop是微软推出的企业级程序架构随着asp.net 2.0推出了petshop4.0&#xff0c;正好这几天没有事&#xff0c;研究一下&#xff0c;学习一下2.0的新特性&#xff0c; 它包括…