决策树,随机森林,k邻近模型

  • 一. 决策树(Decision Tree)
  • 二. 随机森林(random forest)
  • 三. K-近邻(KNN)
  • 三. 结语

在本章,小弟将与大家分享一些在机器学习里很常用的模型,机器学习这个领域是计算机科学和数据科学的杂糅,过去它有时候经常被称为数据挖掘(Data mining)或者人工智能。但我们又不能很轻易的说机器学习就是统计模型,举个例子,在自然语言处理中有个注意力机制,说白了,就是平常我们说话时候,不是每个字都很重要,而是有各别几个字才是重点,预测区分哪些字关键哪些字不关键,从而可以找到相关内容,例如百度搜索:“家人觉得计算机不错,想叫我学计算机有没有人知道计算机相关的论坛或者博客,谢谢!”,我们便可以得到CSDN网站或者相关内容,这样的形式在统计模型中不会有的。再举个例子生成照片,小弟说的简单一些,得到数据照片后,将照片内容的数据像素分布投影到另一个分布上面(啥是分布,说白了就是鼻子,嘴巴,眼睛的位置,利用数学的分布表示出来,在投影到另一个新的分布上,相当于鼻子嘴巴眼睛的位置有所变动),从而得到新的照片,再和真的照片进行比对优化其实就是调参更新参数,看生成的照片像不像那回事,别生成的照片鼻子在嘴巴下面,像这样进行优化和模型,在统计模型里也是不常见的。例如生成在现实中本不存在的人或风景照片或者将我们的照片变成油画素描等等。所以小弟认为,机器学习本质就是一种预测,无论是生成照片还是通过判断关键字从而查找内容,它们都是预测后,在做些关于预测目的的事情得到我们的结果。那么在机器学习里有这么耳熟能详的几个模型:
1.决策树
2.随机森林
3.支持向量机(SVMs)
4.神经网络
5.深度神经网络(深度学习)
6.簇
7.混合模型
8.自码器(VAE,variational autoencoders)
这些机器学习的模型其实它的老祖宗还是传统的统计模型,只是表达的形式,或者优化的方法有很大差别,例如利用神经元和各种层的形式表达数学和统计预测,利用注意力机制或者比对照片来优化更新参数,说白了只不过是孩子长大了,跟老祖宗长的不太像了,孩子会玩的东西丰富了,但根还是统计和预测。

小弟再带大家回顾下第8章的交叉验证(Cross Validation), 交叉验证这个方法经常用在深度学习里去控制模型的复杂度,说白了,就是看模型里那个变量重要那个变量不重要,控制复杂度就这意思。
小弟用一个伪代码来重新阐述下交叉验证

#交叉验证
for (r=尝试不同的变量组合):for i in (1,m):m次循环取数据,m尽量大点,m越大估计越稳定,但运行太久了,自己定m的值将取到的数据化分为K等份,y(1),y(2),...,y(K)for k in (1:K):估计模型M(r)的参数利用数据y(j),(j!=k)利用估计参数后的模型M(r)来预测数据y(k)计算预测误差,即MSPE取了m次数据,再计算m个MSPE的均值,即计算EMSPE,交叉验证里喜欢叫它为CV error比较不同变量组合的EMSPE,用最小EMSPE的变量组合。

一. 决策树(Decision Tree)

决策树是非线性机器学习模型,它属于可监督式学习,我们也可以大致的把它写成:
yˉ(x1,x2,...,xp)=f(x1,x2,...,xp)\bar y(x_1,x_2,...,x_p)=f(x_1,x_2,...,x_p)yˉ​(x1​,x2​,...,xp​)=f(x1​,x2​,...,xp​)
在第7章和第6章中对于线性回归和二元逻辑回归,我们也可以写成这种泛化形式,只是区别在于,对于线性回归和二元逻辑回归f(⋅)f(·)f(⋅)为线性的,但对于决策树f(⋅)f(·)f(⋅)为非线性的。

小弟举两个例子,带大家先浅显得了解决策树长什么样子。
例子1(决策树处理分类数据,即分类):

上图方块节点即为树叶,树叶即为我们的预测,圆形节点即为划分条件,即为我们的变量,如果变量为性别,那么根据是男是女将数据划分开.方块节点写成X/Y的形式,假如我们的预测变量为是否高血压,那么则有X个人没有得,Y个人有高血压。那么患高血压的概率为YX+Y\frac{Y}{X+Y}X+YY​,那么我们便可以得到753+7\frac{7}{53+7}53+77​≈12%,那么属于女性的数据,在通过年龄变量划分,小于50岁的,和大于等于50岁的数据,再通过概率来预测是否得高血压。

例子2(决策树处理数字数据,即回归):

上图绿色为为我们的真实回归曲线,黄色即为我们决策树的回归曲线。在黄色线中,有几个横线意味着有几个树叶即我们对于y的预测,所以这个决策树有5个叶子节点。有几个竖线即为我们的划分条件,为我们的变量,我们将它化为决策树的图像即下图:

将数据的变量以x=-0.4划分两部分,小于-041的这一部分数据,然后计算它们的y值的均值得Y=1.9,作为我们得预测即叶子。

根据上述两个例子,大家会发现决策树可以处理回归和分类。但切记决策树不一定是二叉树,也不是什么平衡二叉树,什么满二叉树,它就是一个决策分析的模型。在性别中我们也可分为三类,男,女,中性,那样我们的树会多出一个分支。至于长什么样子,完全取决于我们的数据。当然了,我们可以基于这个树,再结合我们的数据结构将其优化,假如这个树是二叉树,但时间复杂度为O(n),我们可以优化为O(logn).

言归正传,如果我们有L个叶子,即意味着对于一个y值有L个预测。根据变量的条件,一步步筛选直到其中的一个预测即叶子。那么通过变量划分出的数据区域则也有L个即R1,R2,...,RLR_1,R_2,...,R_LR1​,R2​,...,RL​,划分出的数据区域之间的交集为空集也就是没重复的数据也可以说没有重复的个体。每个数据区域都有一个模型来诠释该区域的数据,从而得到对应的y值预测,即为我们的叶子。

对于回归来说,模型通常是正态分布,也就是我们的预测即期望E[y]=μE[y]=\muE[y]=μ,也就是计算均值,正如第二个例子。

如果是分类,那么就是伯努利分布,正如第一个例子,计算成功率罢了。

那么对于决策树来说,它的模型复杂度即为多少个叶子,L。叶子越多,决策树模型越复杂,更容易诠释我们的数据,但小心过饱和。

那么重点来了,我们如何产生决策树?

产生决策树
首先产生决策树分为两大部分,第一大部分利用负log似然(其实就是损失函数)来决定如何划分数据,第二大部分利用信息准则(AIC 或者BIC,等)或者交叉验证法来决定有多少个叶子,或者说划分多少个数据区域才是合适的。大家必须明白这个逻辑,否则会认为第一部分和第二部分是一样的,认为重复了没有意义。第二部分在说,是否我们需要增加节点。第一部分在说,用哪个变量来当该节点来划分数据更好。明白这逻辑后,我们来看看如何产生决策树的。

还记得第6章所讲到正向逻辑么,产生决策树一般大逻辑框架就利用这个正向逻辑。
第一步:产生一个叶子(作为我们的父节点,也就是没有任何变量,直接预测我们的y变量),计算下信息准则的值
第二步:利用负log似然来决定哪个变量来划分,尝试每个变量替代叶子,再计算下信息准则。
第三步:如果没有任何划分可以使信息准则的值变的更小,那就结束
第四步:选择最小信息准则值的树
第五步:跳到第二步
我知道小弟表达能力不好,大家肯定没懂。
我们来几张图就明白了,我们依然根据上述高血压的例子。


一开始,我们的节点即为我们的预测,然后计算它的信息准则值为175.13。77/108意味着,我们直接看有多少人得高血压108个人,有哪些人不得高血压77个人,那么根据数据得高血压概率为108108+77\frac{108}{108+77}108+77108​

根据负log似然,我们发现性别(Sex)这个变量比其他变量划分数据效果更好,那么我们利用性别来充当这个叶子,再计算下它的信息准则值

比之前的175.13,更小一些,那么我们用这棵树。
根据负log似然,我们发现年龄(Age)这个变量比其他变量划分数据效果更好,那么我们利用年龄来充当叶子,再计算下它的信息准则值

比之前的173.70,更小一些,那么我们用这棵树。
根据负log似然,我们发现年龄(Age)这个变量比其他变量划分数据效果更好,那么我们利用年龄来充当叶子,再计算下它的信息准则值

比之前的172.10,更大一些,那么我们不要用这棵树。依旧用原先的树,之后反复同样操作。
从上述构造决策树来看,它其实是一个贪心算法,每次都选取最小值的信息准则,虽然不一定是最优解,但也会预测的不错,毕竟省时间,否则各种情况搭配(也就是各种树的样子)都试一次,时间消耗太大。举个例子,在计算机编程问题里有个问题叫背包问题,也就是你的背包容量有限,要用你的背包能拿下最大价值的物品。如果你单纯的按照哪个物品贵就装哪个物品,很明显是不行的,如果你按照每个物品的平均容量价值去装,也是不行的。要有个搭配,需要用到动态分布的知识。小弟这里就不展开讨论了。但小弟想说的就是贪心算法并不一定是最优解。

那么我们现在来看下如何利用负log似然来决定哪个变量来划分

选择变量:
当变量为分类数据时:这里我们简化为二元分类(0和1),如果是多元分类,可根据第6章所讲的处理分类变量内容,化为多个二元分类的变量。
在某个叶子中,我们得到了一区域的数据y=(y1,y2,...,yn)y=(y_1,y_2,...,y_n)y=(y1​,y2​,...,yn​)
那么:
n1=∑i=1nyin_1=\sum_{i=1}^{n}y_in1​=i=1∑n​yi​
n0=n−n1n_0=n-n_1n0​=n−n1​
我们便得到了,数量为n1n_1n1​的1,和数量为n0n_0n0​的0
利用伯努利分布,即:
p(y∣θ)=θn1(1−θ)n0p(y|\theta)=\theta^{n_1}(1-\theta)^{n_0}p(y∣θ)=θn1​(1−θ)n0​
我们用下第三章似然估计伯努利的结论,得最大似然估计θˉ=n1n\bar \theta=\frac{n_1}{n}θˉ=nn1​​.
那么我负log似然的值为:
−logp(y∣θˉ)=−n1log(n1n)−n0log(n0n)-log p(y|\bar \theta)=-n_1 log(\frac{n_1}{n})-n_0log(\frac{n_0}{n})−logp(y∣θˉ)=−n1​log(nn1​​)−n0​log(nn0​​)

现在我们有一列数据

y 1 1 0 1 0 0 0 1 1 0
x1 0 0 0 0 0 1 1 1 1 1
x2 1 1 0 1 1 0 0 0 1 0

我们知道θˉ=510\bar \theta=\frac{5}{10}θˉ=105​,即y里1的概率

假如不划分:
−logp(y∣θˉ)=−5log(5/10)−5log(5/10)≈6.9315-logp(y|\bar \theta)=-5log(5/10)-5log(5/10)≈6.9315−logp(y∣θˉ)=−5log(5/10)−5log(5/10)≈6.9315

若以x1变量划分:
当x1=0时,y里有几个1,θˉ=3/5\bar\theta=3/5θˉ=3/5,当x1=1时,y里有几个1,θˉ=2/5\bar\theta=2/5θˉ=2/5:
−logp(y∣θˉ,x1=0)=−3log(3/5)−2log(2/5)≈3.3651-log p(y|\bar \theta,x1=0)=-3log(3/5)-2log(2/5)≈3.3651−logp(y∣θˉ,x1=0)=−3log(3/5)−2log(2/5)≈3.3651
−logp(y∣θˉ,x1=1)=−2log(2/5)−3log(3/5)≈3.3651-log p(y|\bar \theta,x1=1)=-2log(2/5)-3log(3/5)≈3.3651−logp(y∣θˉ,x1=1)=−2log(2/5)−3log(3/5)≈3.3651
那么和为3.3651+3.3651=6.73023.3651+3.3651=6.73023.3651+3.3651=6.7302
比不划分的负log似然更小。

若以x2变量划分
同理得:
−logp(y∣θˉ,x2=0)=−1log(1/5)−4log(4/5)≈2.5020-log p(y|\bar \theta,x2=0)=-1log(1/5)-4log(4/5)≈2.5020−logp(y∣θˉ,x2=0)=−1log(1/5)−4log(4/5)≈2.5020
−logp(y∣θˉ,x2=1)=−4log(4/5)−1log(1/5)≈2.5020-log p(y|\bar \theta,x2=1)=-4log(4/5)-1log(1/5)≈2.5020−logp(y∣θˉ,x2=1)=−4log(4/5)−1log(1/5)≈2.5020
那么和为2.5020+2.5020=5.042.5020+2.5020=5.042.5020+2.5020=5.04
比x1划分得负log似然还要小,那么我们要用x2这个变量进行划分。

划分数据:
经过选择某个变量后,如果是二元变量,还好划分,按照1,0划分。但如果变量为数据性时:
我们需要要找到一个值c,那么我们提取y值当xj<cx_j<cxj​<c和xj>=cx_j>=cxj​>=c,利用正态分布估计μ,σ\mu,\sigmaμ,σ,计算负log似然找到具有最小值的负log似然的c即可,大同小异。

到此,我们解决了如果y为二元分类,x为分类数据或者数字数据的情况下如何构造决策树。当y为数字数据时,即为回归时,我们利用正态分布,同样选取某个变量,利用负log似然,只不过用的是正态分布,不是伯努利分布。如果该变量是二元分类,我们就直接按1,0分类(例如男女),如果是数字数据,我们依旧需要找到一个值c,利用正态分布的负log似然找到具有最小值的c即可。

K-fold 交叉验证和决策树
我们上述是利用信息准则来确定决策树有多少个叶子,现在我们利用K-fold交叉验证。

小弟还是用伪代码来解释

#K-fold CV for decsion tree
def K_foldCV(L=最多有几个叶子){if(L==0):return 9999999for (i=1:m):#重复取数据m次,m的次数越大越好,越大越稳定,但跑的慢,你自己定m的值将取到的数据化分为K等份,y(1),y(2),...,y(K)for(k=1:K):用y(j),j!=k的数据来产生L个叶子的决策树,如何产生决策树如上述内容所说,但不用信息准则而已。在利用生成后的决策树来预测数据y(k)计算预测误差MSPEEMSPE=取了m次数据,再计算m个MSPE的均值,即计算EMSPE.return(min(EMSPE,K_foldCV(L-1)))#逐步减去叶子L=L-1,最后挑选最小EMSPE的树。
}

最后得到我们具有较小EMSPE的树,也得到了适当的叶子,即适当的模型复杂度。

说来也很搞笑,其实这一整套理论,我们用不着手算,只要找到相关编程语言的函数,一敲,啪就出来了,但大家也需要多多少少了解下。

决策树的优点:
1.高度可解释性,就是容易叫人看的明白。
2.可处理非线性关系
3.可处理变量之间的相互影响。
4.可处理连续,分类的预测变量
5.每个叶子都是一个模型有自己的均值和方差
事实上,决策树的分类比逻辑回归分类更好一些,如下图:

上图左侧为决策树,右侧为逻辑回归。

决策树的缺点:
1.有时候很难找到好的树。
2.对于数据的细微变化,很敏感
3.决策树虽然灵活,但不稳定,啥意思,就是有时候会有多个决策树都有较好的诠释数据的能力,我们很难判断哪个更好。
4.决策树其实效率也不高,有时候用线性模型就能解释的东西,决策树需要很多的叶子和参数。

对于决策树前三点的缺点,我们可以解决,利用随机森林(Random forest)

二. 随机森林(random forest)

我们还是看一下最早说过的预测高血压例子,假如我们有了这三个决策树,即下图

根据信息准则给我们的值,我们很容易愿意去选择最左侧的树。但事实上,它们的值也没差多少,预测的效果也差不多一样。我们便很纠结用哪个,对没错,有的同学会说都用呗,嗯,这就是我们的随机森林。

随机森林就是有多个树,它有时候也被称为集成学习(ensemble learning)。

至于每个树的生成,就没有决策树那么严格了,但分划数据与选择变量依旧利用损失方程(负log似然)。只不过,叶子的多少你可以人为控制,或者随机。

那么一个森林的预测,我们首先得到每个树的预测,然后结合这些预测,对于回归来说,那就所有树的预测的均值,对于分类来说,那就所有树的预测分类的概率。

单个树会有较低的偏差,但有较高的方差(不稳定)。多个树的结合会保持较低的偏差,同时也会降低方差。较为重要的变量,会被不同的树多次使用。

随机森林的优点:
1.很稳定
2.加强了预测准确度
3.容易处理多个变量
4.灵活

随机森林的缺点:
1.很难理解,也就是无法解释
2.模型监督学习起来很复杂,有很多的变量和参数。

三. K-近邻(KNN)

这个方法,不需要构造模型。
假如我们有了数据xi,1,xi,2,...,xi,px_{i,1},x_{i,2},...,x_{i,p}xi,1​,xi,2​,...,xi,p​和yiy_iyi​.我们要用新的数据x1′,x2′,...,xp′x_1',x_2',...,x_p'x1′​,x2′​,...,xp′​来预测y′y'y′.

那么我们需要找K个个体(也就是K行数据),和我们的新的数据x1′,x2′,...,xp′x_1',x_2',...,x_p'x1′​,x2′​,...,xp′​较为相似的个体。然后利用这K个个体的y值来预测我们新数据的y′y'y′值.
其实K-近邻这个方法,是基于如果多个变量数据很相似的话那么它们的预测变量的数据也必然相似的想法。小弟明白这个想法不太能经得起推敲,但事实上,这个想法被用在很多地方。例如恢复数据,如果有数据丢失,会利用相似的个体来恢复这个丢失的数据。

我们最常用的还是利用欧几里得距离来定义是否不同个体间的相似度。当然有很多定义相似度的方法,例如范数算距离,字向量利用cosine看相似度等等。但在数据分析模型中我们涉及的还是比较简单的。即如下欧几里得距离:
d(x,x′)=[∑j=1p(xj−xj′)2]12d(x,x')=[\sum_{j=1}^{p}(x_j-x'_j)^2]^{\frac{1}{2}}d(x,x′)=[j=1∑p​(xj​−xj′​)2]21​
对于分类变量,我们也可以用该算法来定义相似度。

那么KNN的逻辑如下:
1.按从小到大排列did_idi​
2.对应的y1,y2,...,yny_1,y_2,...,y_ny1​,y2​,...,yn​也从小到大排列。
3.选取前K个yiy_iyi​
4.预测yˉ′=f(y1,y2,...,yn)\bar y'=f(y_1,y_2,...,y_n)yˉ​′=f(y1​,y2​,...,yn​)

如果是预测变量为分类:
f(⋅)f(·)f(⋅)为选取出现最高频率的分类作为我们的yˉ′\bar y'yˉ​′

如果是预测变量为回归:
f(⋅)f(·)f(⋅)即为:
yˉ′=1K∑i=1Kyi\bar y'=\frac{1}{K}\sum_{i=1}^{K}y_iyˉ​′=K1​i=1∑K​yi​
当然有时后还会加上权值,即:
yˉ′=1K∑i=1Kg(yi)\bar y'=\frac{1}{K}\sum_{i=1}^{K}g(y_i)yˉ​′=K1​i=1∑K​g(yi​)
这里的g(⋅)g(·)g(⋅)也被称为核函数(kernel function)

所以KNN会涉及这么三个参数:
1.选择K,多少个相似的个体
2.距离方程,选择哪个距离方程
3.核函数的权值,权值设为多少

那么我们会用到CV,还是同理,最后选择具有较小的EMSPE的相关参数即可。

最后我们来看一下KNN的图像

横坐标为变量2,纵坐标为变量1,K=3,我们来预测下图中问号处是黑色还是浅蓝色。很明显离它最近的三个点均为黑色,那么该问号为黑色点。

KNN的优点:
1.对于高维数据很有效率
2.很容易处理分类和连续变量

KNN缺点:
1.需要很多的参数,例如多少个K,多个邻近,怎样定义相似,核函数的参数
2.不容易解释。

三. 结语

有公式推导错误的或理论有谬误的,请大家指出,我好及时更正,感谢。

数据分析模型 第九章相关推荐

  1. 图片流写出 并带数据_第九章 IO流

    1. 输入流和输出流联系和区别,节点流和处理流联系和区别 首先,你要明白什么是"流".直观地讲,流就像管道一样,在程序和文件之间,输入输出的方向是针对程序而言,向程序中读入东西,就 ...

  2. 数据分析模型 第十一章

    仿真法,自助法 仿真法/统计模拟方法(simulation based methods) 自助法(Bootstrap method) 三. 结语 在最后一章,小弟为大家介绍两个统计方法,说老实话,这两 ...

  3. Laxcus大数据管理系统2.0(11)- 第九章 容错

    第九章 容错 在当前,由于集群庞大的组织体系和复杂性,以及用户普遍要求低成本硬件,使得集群在运行过程中发生的错误概率,远远高于单一且性能稳定的小型机服务器,并且集群在运行过程中几乎是不允许停止的,这就 ...

  4. 数据分析模型 第三章

    参数估计,偏差和评测估计 一. 参数估计 二. 偏差和评测估计 三. 结语 一. 参数估计 参数估计(parameter estimation). 正如第一章模型的介绍中所提到的,一般当我们手上有了一 ...

  5. SRPG游戏开发(四十)第九章 战斗系统 - 二 计算战斗数据(Calculate Combat Data)

    返回总目录 第九章 战斗系统(Combat System) 在SRPG中,大多数情况是指角色与角色之间的战斗.而这种战斗一般有两种模式: 地图中直接战斗: 有专门的战斗场景. 这两种模式的战斗在数据上 ...

  6. 第九章 时序数据-学习笔记+练习题

    第九章 时序数据 # 导入需要的模块 import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotli ...

  7. SRPG游戏开发(四十二)第九章 战斗系统 - 四 计算战斗数据II(Calculate Combat Data II)

    返回总目录 第九章 战斗系统(Combat System) 在SRPG中,大多数情况是指角色与角色之间的战斗.而这种战斗一般有两种模式: 地图中直接战斗: 有专门的战斗场景. 这两种模式的战斗在数据上 ...

  8. VLP-16用户手册 第九章 传感器数据

    第九章 传感器数据 项目用到了VLP-16激光雷达,在看官方源代码时,很多地方不是很清楚,因此查看了用户手册,顺便翻译整理出来.本文翻译自VLP-16用户手册第9章内容,本章是手册的核心,说明了数据的 ...

  9. 《大数据分析原理与实践》——第2章 大数据分析模型

    第2章 大数据分析模型 大数据分析模型讨论的问题是从大数据中发现什么.尽管对大数据的分析方法林林总总,但面对一项具体应用,大数据分析非常依赖想象力.例如,对患者进行智能导诊,为患者选择合适的医院.合适 ...

  10. 机器学习-第九章 聚类

    机器学习-第九章 聚类 D系鼎溜已关注 2020.02.19 10:36:17字数 3,312阅读 375 9.1 聚类任务 在无监督学习任务中,包括了密度估计.异常检测以及聚类等.其中应用最广泛的是 ...

最新文章

  1. 图解法求最优解的例题_【第四章 最优化理论】4.2 带约束最优化
  2. java udp 服务器_Java UDP 服务器与客户端的问题
  3. 读取CSV内容,根据不同的图片标签放到指定文件夹
  4. Spring Cloud Feign - 内部实现细节
  5. 如何判断SAP CDS view的association是inner join还是outer join实现的
  6. [Swift]LeetCode682. 棒球比赛 | Baseball Game
  7. .NET的MVVM框架
  8. C# 自定义类型转换
  9. ICCV2021 | 最新ICCV2021论文抢先看,附全部下载链接!ICCV2021下载
  10. nacos分布式配置中心搭建与使用
  11. 编程实现 无符号减法溢出判断
  12. linux htop详细功能
  13. 每周更新:Element、Vant新版本更新、IntelliJ IDEA 2019.1 发布 RC 候选版、企业级 UI 设计语言Ant Design 3.15.2 发布
  14. 企业网络规划和设计方案
  15. 最全的熬粥方法Word计算机考试怎么做,煮粥方法大全(珍藏版)
  16. Office快捷键大全之四(Frontpage快捷键)
  17. 神舟战神g8r9和g9r9区别对比评测选哪个好
  18. 项目管理甘特图-动态时间轴
  19. 互联网创业如何起步(一)
  20. 树莓派3B+ 人脸识别(OpenCV)

热门文章

  1. 小米论坛php,黑橙新版小米社区discuz模板
  2. 学习java第15天
  3. 基于PHP的华为手机商城系统(完整前后台)
  4. NVIDIA驱动安装(arm64平台可用)
  5. vs2017 git 操作重置、还原、挑拣对比
  6. hosts文件的作用
  7. IT 行业的创新 - 创新的迷思 (7-8)
  8. 发送邮件被退回,提示: Helo command rejected: Invalid name 错误
  9. Java温习——基本语法
  10. matlab irandon函数,在路上●我的年青●悠忽两年