基本概念

无监督学习(unsupervised learning) 是利用无标记训练样本的学习来揭示数据的内部性质以及规律。其中聚类(clustering)是其中重要的一类。
聚类是将数据按照一定原则划分为若干个不相交的子集(簇,cluster)。

k均值算法

k均值(k-means)算法的假设是距离相近的两样本在分类上也是相类似的。因为该算法比较简单,直接放伪代码:
输入:样本集D={x1,x2,...,xm}D=\{x_1,x_2,...,x_m\}D={x1​,x2​,...,xm​};
   聚类簇数kkk.
过程
 从DDD中随机选择kkk个样本作为初始均值向量{μ1,μ2,...μk}\{\mu_1,\mu_2,...\mu_k\}{μ1​,μ2​,...μk​}
repeat
  令Ci=ϕ(1≤i≤k)C_i = \phi(1 \leq i \leq k)Ci​=ϕ(1≤i≤k)
  // 划分样本至相应簇
  for j=1,2,...,mj=1,2,...,mj=1,2,...,m do
   计算样本xjx_jxj​和各均值向量μi(1≤i≤k)\mu_i(1 \leq i \leq k)μi​(1≤i≤k)之间的距离:dji=∣∣xj−μi∣∣2d_{ji} = || x_j -\mu_i||_2dji​=∣∣xj​−μi​∣∣2​;
   根据距离最近的均值向量确定xjx_jxj​的簇标记: λj=argmini∈(1,2,...,k)dji\lambda_j =arg min_{i \in (1,2,...,k)} d_{ji}λj​=argmini∈(1,2,...,k)​dji​;
   将样本xjx_jxj​划入相应的簇: Cλj∪{xj}C_{\lambda_j}\cup\{x_j\}Cλj​​∪{xj​};
  end for
  // 根据簇更新均值向量
  for i=1,2,...,ki=1,2,...,ki=1,2,...,k do
   计算新的均值向量μi′=1∣Ci∣∑x∈Cix\mu_i'=\frac{1}{|C_i|}\sum_{x \in C_i}xμi′​=∣Ci​∣1​∑x∈Ci​​x;
   if μi′≠μi\mu_i' \neq \mu_iμi′​​=μi​ then
    将当前μi\mu_iμi​更新为μi′\mu_i'μi′​;
   else
    保持当前均值向量不变
   end if
  end for
until 当前均值向量均未更新或者满足设定的条件
输出:簇划分C={C1,C2,...,Ck}C=\{C_1,C_2,...,C_k\}C={C1​,C2​,...,Ck​}

学习向量量化

学习向量量化(Learning Vector Quantization,LVQ)和k均值算法相似在于二者都假设样本间距离越近分类相同可能性越大,不同在于LVQ假设数据样本带有类别标记,这也意味着LVQ会利用样本的监督信息辅助聚类实现

伪代码见下:
输入:样本集D={(x1,y1),(x2,y2),...,(xm,ym)}D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}D={(x1​,y1​),(x2​,y2​),...,(xm​,ym​)};
   原型向量个数qqq,各个原型向量预设的类别标记{t1,t2,...,tq}\{ t_1,t_2,...,t_q\}{t1​,t2​,...,tq​};
   学习率η∈(0,1)\eta \in(0,1)η∈(0,1).
过程
 初始化一组原型向量{p1,p2,...pq}\{p_1,p_2,...p_q\}{p1​,p2​,...pq​}
repeat
  从样本集DDD中随机选取样本(xi,yj)(x_i,y_j)(xi​,yj​);
  计算样本xjx_jxj​与pi(1≤i≤q)p_i (1 \leq i \leq q)pi​(1≤i≤q)的距离: dji=∣∣xj−pi∣∣2d_{ji}=||x_j-p_i||_2dji​=∣∣xj​−pi​∣∣2​
  找出与xjx_jxj​距离最近的原型向量:pi∗,i∗=argmini∈{1,2,...,q}djip_{i^*},i^*=arg min_{i \in \{ 1,2,...,q\}}d_{ji}pi∗​,i∗=argmini∈{1,2,...,q}​dji​
  if yj=ti∗y_j=t_{i^*}yj​=ti∗​ then
   p′=pi∗+η⋅(xj−pi∗)p' =p_{i^*}+\eta \cdot (x_j-p_{i^*})p′=pi∗​+η⋅(xj​−pi∗​);
  else
   p′=pi∗−η⋅(xj−pi∗)p' =p_{i^*}-\eta \cdot (x_j-p_{i^*})p′=pi∗​−η⋅(xj​−pi∗​);
  end if
  将原型向量更新pi∗p_{i^*}pi∗​为p′p'p′
until满足停止条件
 令Ri=ϕ(1≤i≤q)R_i = \phi (1 \leq i \leq q)Ri​=ϕ(1≤i≤q)
for j=1,2,...,mj=1,2,...,mj=1,2,...,m do
  计算样本xjx_jxj​与pi(1≤i≤k)p_i (1 \leq i \leq k)pi​(1≤i≤k)的距离: dji=∣∣xj−pi∣∣2d_{ji}=||x_j-p_i||_2dji​=∣∣xj​−pi​∣∣2​
  找出与xjx_jxj​距离最近的原型向量:pi∗,i∗=argmini∈{1,2,...,q}djip_{i^*},i^*=arg min_{i \in \{ 1,2,...,q\}}d_{ji}pi∗​,i∗=argmini∈{1,2,...,q}​dji​
  将样本xjx_jxj​划入相应的簇Rti∗=Rti∗∪{xj}R_{t_{i^*}}=R_{t_{i^*}}\cup\{x_j\}Rti∗​​=Rti∗​​∪{xj​}
end for
输出:簇划分R={R1,R2,...,Rq}R=\{R_1,R_2,...,R_q\}R={R1​,R2​,...,Rq​}

对比k均值和LVQ伪代码可以发现:k均值因为样本自身没有标签,故需要利用原型向量不断对于样本进行划分;而LVQ在训练中利用样本标签不断迭代原型向量,到训练完成后才需要对样本进行划分。

高斯混合聚类

高斯混合(Mixture-of-Gaussian)与k均值、LVQ不同在于其是利用概率模型作为聚类的原型。

算法过程

定义高斯混合分布
pM(x)=∑i=1kαi⋅p(x∣μi,Σi)(1)p_M(x)=\sum_{i=1}^k \alpha_i \cdot p(x|\mu_i,\Sigma_i) \tag1 pM​(x)=i=1∑k​αi​⋅p(x∣μi​,Σi​)(1)
该分布是由kkk个混合成分组成,每个混合成分对应一个高斯分布,即为p(⋅)p(\cdot)p(⋅),其中μi,Σi\mu_i,\Sigma_iμi​,Σi​为相应的参数。而αi>0\alpha_i>0αi​>0为相应的混合系数(mixture coefficient),书中解释αi\alpha_iαi​为第iii个混合成分的概率,∑i=1kαi=1\sum_{i=1}^k \alpha_i = 1∑i=1k​αi​=1.
设zj∈{1,2,...,k}z_j \in \{ 1,2,...,k\}zj​∈{1,2,...,k}表示样本xjx_jxj​在高斯混合的输出,则有αi=p(zj=i)\alpha_i =p(z_j = i)αi​=p(zj​=i),根据贝叶斯定理有:
pM(zj=i∣xj)=p(zj=i)⋅pM(xj∣zj=i)pM(xj)=αi⋅p(xj∣μi,Σi)pM(xj)(2)p_M(z_j=i|x_j) = \frac{p(z_j=i)\cdot p_M(x_j|z_j=i)}{p_M(x_j)}= \frac{\alpha_i \cdot p(x_j|\mu_i,\Sigma_i)}{p_M(x_j)} \tag2 pM​(zj​=i∣xj​)=pM​(xj​)p(zj​=i)⋅pM​(xj​∣zj​=i)​=pM​(xj​)αi​⋅p(xj​∣μi​,Σi​)​(2)
将pM(zj=i∣xj)p_M(z_j=i|x_j)pM​(zj​=i∣xj​)记为γji(i=1,2,...,k)\gamma_{ji}(i=1,2,...,k)γji​(i=1,2,...,k),设高斯混合分布将样本集DDD划分为kkk个簇C={C1,C2,...,Ck}C=\{C_1,C_2,...,C_k\}C={C1​,C2​,...,Ck​},每个样本xjx_jxj​的簇标记λj\lambda_jλj​为:
λj=argmaxi∈{1,2,...,k}γji(3)\lambda_j = arg max_{i \in \{1,2,...,k\}}\gamma_{ji} \tag{3} λj​=argmaxi∈{1,2,...,k}​γji​(3)

参数求解

对于(1),可采用极大似然估计来求解其中的参数αi\alpha_iαi​、μi\mu_iμi​和Σi\Sigma_iΣi​。
这里为什么采用极大似然估计呢?
我想主要是因为(1)表示为xjx_jxj​的概率,假设存在i′i'i′使得λj=γji′\lambda_j=\gamma_{ji'}λj​=γji′​(见式3),则有参数(αi′,μi′,Σi′)(\alpha_{i'},\mu_{i'},\Sigma_{i'})(αi′​,μi′​,Σi′​)使得(1)最大,即此时i≠i′i \neq i'i​=i′的项最小,i=i′i = i'i=i′的项最大,则对(1)使用极大似然估计然后对于αi\alpha_iαi​、μi\mu_iμi​和Σi\Sigma_iΣi​求偏导就可以得到相应的参数

(1)的极大似然估计为:
LL(D)=ln(∏j=1mpM(xj))=∑j=1mln(∑i=1kαi⋅p(xj∣μi,Σi))(4)LL(D) = ln(\prod_{j=1}^mp_M(x_j)) = \sum_{j=1}^mln(\sum_{i=1}^k \alpha_i \cdot p(x_j|\mu_i,\Sigma_i)) \tag{4}LL(D)=ln(j=1∏m​pM​(xj​))=j=1∑m​ln(i=1∑k​αi​⋅p(xj​∣μi​,Σi​))(4)
由∂LL(D)∂μi=0\frac{\partial LL(D)}{\partial \mu_i} = 0∂μi​∂LL(D)​=0和∂LL(D)∂Σi=0\frac{\partial LL(D)}{\partial \Sigma_i} = 0∂Σi​∂LL(D)​=0可以求得:
μi=∑j=1mγjixj∑j=1mγji(5)\mu_i = \frac{\sum_{j=1}^m\gamma_{ji}x_j}{\sum_{j=1}^m \gamma_{ji}} \tag{5} μi​=∑j=1m​γji​∑j=1m​γji​xj​​(5)
Σi=∑j=1mγji(xj−μi)(xj−μi)T∑j=1mγji(6)\Sigma_i = \frac{\sum_{j=1}^m\gamma_{ji}(x_j-\mu_i)(x_j-\mu_i)^T}{\sum_{j=1}^m \gamma_{ji}} \tag{6} Σi​=∑j=1m​γji​∑j=1m​γji​(xj​−μi​)(xj​−μi​)T​(6)
而对于混合系数αi\alpha_iαi​来说其还需要满足条件α≥0,∑i=1kαi=1\alpha \geq 0,\sum_{i=1}^k \alpha_i=1α≥0,∑i=1k​αi​=1,则有拉格朗日形式:
LL(D)+λ(∑i=1kαi−1)(7)LL(D)+\lambda(\sum_{i=1}^k \alpha_i-1) \tag7 LL(D)+λ(i=1∑k​αi​−1)(7)
所以有
αi=1m∑j=1mγji(8)\alpha_i = \frac{1}{m} \sum_{j=1}^m \gamma_{ji} \tag8 αi​=m1​j=1∑m​γji​(8)

算法流程

伪代码见下:
输入:样本集D={x1,x2,...,xm}D=\{x_1,x_2,...,x_m\}D={x1​,x2​,...,xm​};
   高斯混合成分个数kkk.
过程
 初始化高斯混合分布的模型参数{(αi,μi,Σi)∣1≤i≤k}\{(\alpha_i,\mu_i,\Sigma_i)| 1\leq i \leq k \}{(αi​,μi​,Σi​)∣1≤i≤k}
repeat
  for j=1,2,...,mj=1,2,...,mj=1,2,...,m do
   根据式2计算γji(1≤i≤k)\gamma_{ji}(1 \leq i \leq k)γji​(1≤i≤k)
  end for
  for i=1,2,...,ki=1,2,...,ki=1,2,...,k do
   根据式5、6、8计算新的模型参数{(αi′,μi′,Σi)′∣1≤i≤k}\{(\alpha_i',\mu_i',\Sigma_i)'| 1\leq i \leq k \}{(αi′​,μi′​,Σi​)′∣1≤i≤k};
  end for
until:满足停止条件
 令Ci=ϕ(1≤i≤k)C_i = \phi (1 \leq i \leq k)Ci​=ϕ(1≤i≤k)
for j=1,2,...,mj=1,2,...,mj=1,2,...,m do
  根据式3确定样本xjx_jxj​的簇标记λj\lambda_jλj​;
  将样本xjx_jxj​划入相应的簇Cλj=Cλj∪{xj}C_{\lambda_j}=C_{\lambda_j}\cup\{x_j\}Cλj​​=Cλj​​∪{xj​}
end for
输出:簇划分C={C1,C2,...,Ck}C=\{C_1,C_2,...,C_k\}C={C1​,C2​,...,Ck​}

书中以分类西瓜举例,各个参数的初始化分别为:

  • k=3k = 3k=3
  • α1=α2=α3=13\alpha_1=\alpha_2=\alpha_3=\frac{1}{3}α1​=α2​=α3​=31​
  • μ1,μ2,μ3\mu_1,\mu_2,\mu_3μ1​,μ2​,μ3​为随机选取的三个样本
  • Σ1=Σ2=Σ3=(0.1000.1)\Sigma_1=\Sigma_2=\Sigma_3=\begin{pmatrix}0.1&0\\0&0.1\end{pmatrix}Σ1​=Σ2​=Σ3​=(0.10​00.1​)

假如μ\muμ选取过近会不会最后重叠从而达不到分类效果呢?

高斯混合聚类模型可以想象为样本空间中存在kkk个高斯分布概率模型来决定某一样本的分类;
式2为该样本上各个模型输出乘以相应参数之和,在参数初始化为相同值情况下,对式2的优化只会使得各个模型在所有样本上的输出尽可能大;
但是不同模型在同一样本上的输出是不同的(初始μ\muμ不同),则不同模型在移动时同一样本的“拉力”不同,这便会使得多次迭代后几个模型相差会越来越大;
当然这可能也意味着当初始值太过于相近时的确有可能使得多个模型重叠?

密度聚类

密度聚类也称为“基于密度的聚类”(density-based clustering),此类算法假设聚类结构能通过样本分布的紧密程度确定。通常情况下,密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。
其中比较著名的密度聚类算法是DBSCAN(Density-Based Spatial Clustering of Application with Noise),它基于一组 “邻域”(neighorhood)参数 (ϵ,MinPts)(\epsilon, MinPts)(ϵ,MinPts)来刻画样本分布的紧密程度。设数据集D={x1,x2,...,xm}D=\{x_1,x_2,...,x_m\}D={x1​,x2​,...,xm​},则定义:

  • ϵ−\epsilon-ϵ−邻域:对xj∈Dx_j \in Dxj​∈D,其ϵ−\epsilon-ϵ−邻域包含样本集DDD中与xjx_jxj​距离不大于ϵ\epsilonϵ的样本,可以记作Nϵ(xj)N_{\epsilon}(x_j)Nϵ​(xj​)
  • 核心对象(core object):若xjx_jxj​的ϵ−\epsilon-ϵ−邻域至少包含MinPtsMinPtsMinPts个样本,则xjx_jxj​为核心对象
  • 密度直达(directly density-reachable):若xjx_jxj​位于xix_ixi​的ϵ−\epsilon-ϵ−邻域中,且xix_ixi​是核心对象,则称xjx_jxj​由xix_ixi​密度直达
  • 密度可达(density-reachable):若xjx_jxj​由某一点密度直达,而该点又由xix_ixi​密度直达,则xjx_jxj​由xix_ixi​密度可达
  • 密度相连(density-connected):若存在xkx_kxk​使得xix_ixi​和xjx_jxj​均由xkx_kxk​密度可达,则称xix_ixi​和xjx_jxj​密度相连

而DBSCAN将簇定义为:由密度可达关系导出的最大的密度相连样本集合。

伪代码见下:
输入:样本集D={x1,x2,...,xm}D=\{x_1,x_2,...,x_m\}D={x1​,x2​,...,xm​};
   邻域参数(ϵ,MinPts)(\epsilon, MinPts)(ϵ,MinPts).
过程
 初始化核心对象集合Ω=ϕ\Omega=\phiΩ=ϕ
//获得所有核心对象
for j=1,2,...,mj=1,2,...,mj=1,2,...,m do
  确定样本xjx_jxj​的ϵ−\epsilon-ϵ−邻域Nϵ(xj)N_{\epsilon}(x_j)Nϵ​(xj​)
  if ∣Nϵ(xj)∣≥MinPts|N_{\epsilon}(x_j)|\geq MinPts∣Nϵ​(xj​)∣≥MinPtsthen
   将样本xix_ixi​加入核心对象集合:Ω=Ω∪{xi}\Omega=\Omega\cup\{x_i\}Ω=Ω∪{xi​}
  end if
end for
//依次访问核心对象
 初始化聚类簇数:k=0k=0k=0
 初始化未访问样本集合:Γ=D\Gamma=DΓ=D
while:Ω≠ϕ\Omega\neq\phiΩ​=ϕ do
  记录当前未访问样本集合:Γold=Γ\Gamma_{old} = \GammaΓold​=Γ
  随机选取一个核心对象o∈Ωo \in \Omegao∈Ω,初始化队列Q=<o>Q=<o>Q=<o>
  Γ=Γ−{o}\Gamma = \Gamma - \{o\}Γ=Γ−{o}
  //将核心对象及其密度直达样本化为一簇,
  //密度直达样本中核心对象的密度直达样本也要划入
  while Q≠ϕQ \neq\phiQ​=ϕ do
   取出队列QQQ中的首个样本qqq;
   if∣Nϵ(q)∣≥MinPts|N_{\epsilon}(q)|\geq MinPts∣Nϵ​(q)∣≥MinPts then
    令Δ=Nϵ(q)∩Γ\Delta=N_{\epsilon}(q)\cap \GammaΔ=Nϵ​(q)∩Γ;
    将Δ\DeltaΔ中的样本加入队列QQQ;
    Γ=Γ−Δ\Gamma = \Gamma-\DeltaΓ=Γ−Δ;
   end if
  end while
  k=k+1k=k+1k=k+1,生成聚类簇Ck=Γold−ΓC_k=\Gamma_{old} - \GammaCk​=Γold​−Γ;
  Ω=Ω−Ck\Omega = \Omega-C_kΩ=Ω−Ck​
end while
输出:簇划分C={C1,C2,...,Ck}C=\{C_1,C_2,...,C_k\}C={C1​,C2​,...,Ck​}

层次聚类

层次聚类(hierarchical clustering)尝试在不同层次对数据集进行划分,从而形成树性的聚类结构。书中介绍的是一种叫做AGNES(AGglomerative NESting)的层次聚类算法。

老实讲我看到AGNES的伪代码的时候感觉这个真的很直观……
开始的时候每一个样本便是一类,然后不断迭代;每次迭代找到距离最近的簇然后合并这两个簇,迭代到只剩指定个簇。

最后

书中对于各个聚类算法介绍也比较表面,并没有太体现其中的数学,我也是初学,先对这些有些了解就好。

书中介绍了五种聚类方法:

  • k均值算法设立均值向量,样本归于离其最近均值向量的簇,然后利用该簇所有样本更新均值向量;
  • LVQ给样本引入标记,使得迭代过程中只需要更新原型向量就可以;
  • 高斯混合聚类创建kkk个概率模型,通过极大似然估计求得概率模型的相应参数;
  • 密度聚类则是将紧密程度较大的设为核心对象,将核心对象与其ϵ−\epsilon-ϵ−邻域内样本归为同一簇;
  • 层次聚类现将所有样本初始化为簇,然后不断迭代合并距离最短的簇,直至簇数目到达指定数目。

《机器学习》笔记:聚类相关推荐

  1. Python机器学习笔记:sklearn库的学习

    自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了,scikit-learn简称sklearn,支持包括分类,回归,降维和聚类四大机器学习算法.还包括了特征提取,数据 ...

  2. 吴恩达机器学习笔记:(一)机器学习方法简介

    吴恩达机器学习笔记 Supervised Learning(监督学习) Unsupervised Learning(无监督学习) clustering 聚类算法 market segments 市场细 ...

  3. 机器学习笔记:Overview

    1)机器学习笔记(1):Introduction 2)机器学习笔记(2):单变量线性回归 3)机器学习笔记(3):线性代数回顾 4)机器学习笔记(4):多变量线性回归 5)机器学习笔记(五):逻辑回归 ...

  4. 机器学习笔记——数据挖掘与机器学习区别以及课程内容

    机器学习笔记 慕课|蒋良孝|中国地质大学 机器学习的定义 机器学习:利用经验改善计算机系统自身的性能 数据挖掘的定义 数据挖掘:识别出巨量数据中有效的.新颖的.潜在有用的.最终可理解的模式的非平凡的过 ...

  5. 机器学习笔记之狄利克雷过程(五)——基于狄利克雷过程的预测任务

    机器学习笔记之狄利克雷过程--基于狄利克雷过程的预测任务 引言 回顾:从概率图角度观察狄利克雷过程 关于随机测度 G \mathcal G G的后验概率分布 从指数族分布角度观察后验分布的性质 关于 ...

  6. 机器学习笔记(3.1)

    机器学习笔记系列文章目录 文章目录 机器学习笔记系列文章目录 第三节 标准库 第三方库 基础模块 机器学习 深度学习平台 使用 pip 安装扩展包 常用镜像源 什么是 Anaconda 为什么要用 A ...

  7. 吴恩达机器学习笔记第一周

    第一周 吴恩达机器学习笔记第一周 一. 引言(Introduction) 1.1 欢迎 1.2 机器学习是什么? 1.3 监督学习 1.4 无监督学习 二.单变量线性回归(Linear Regress ...

  8. 机器学习笔记 (第一周)

    机器学习笔记 (第一周) 目录 机器学习笔记 (第一周) 引言(Introduction) 1.1 什么是机器学习,机器学习能做些什么事情 1.2 机器学习是什么? 1.3 监督学习 1.4 无监督学 ...

  9. 机器学习笔记之狄利克雷过程(四)从概率图角度认识狄利克雷过程

    机器学习笔记之狄利克雷过程--从概率图角度认识狄利克雷过程 引言 关于迪利克雷混合模型 关于后验概率的求解过程 引言 上一节从随机测度 G ( i ) \mathcal G^{(i)} G(i)生成过 ...

  10. 【机器学习笔记11】高斯混合模型(GMM)【上篇】原理与推导

    文章目录 推荐阅读 前言 高斯混合模型简介 GMM与K-mean 高斯混合模型的概率密度函数 几何角度 混合模型角度 可能会弄混的地方 隐变量的分布与隐变量的后验概率分布 极大似然估计 EM算法求近似 ...

最新文章

  1. 目标检测的二十年发展史—从传统方法到深度学习
  2. android系统应用程序,Android系统应用程序基本概念解读
  3. 为什么Google会优先使用while(1); 他们的JSON响应?
  4. 数据结构——栈——中缀表达式和后缀表达式
  5. html表格字数显示,HTML控制实现单元格文字个性化显示
  6. html正则表达式search,正则表达式解析关键字和标签的搜索字段([])
  7. 4由通道检测_十堰城区108处桥隧通道接受全面“体检”将持续至8月底
  8. Python导入CSV短代码(pandas?),以';'分隔 和','全部
  9. u-boot-2012.07 for FL2440
  10. php excel 导入 显示,php Excel 导入
  11. regex_search
  12. C++ 包含目录、库目录、附加依赖项总结
  13. python以20字符宽居中输出,Python 字符串内置方法(一)
  14. java如何判断当前系统是windows还是linux?
  15. java计算器用什么布局_求JAVA语言写的计算器的代码。用GridLayout布局。
  16. 添加源ubuntu_x64 安装 Adobe Reader
  17. WebStorage篇
  18. 2019建模美赛B题(派送无人机)M奖论文
  19. 将在PPT中画的图 导入 word,保存矢量图格式
  20. 京东php分销系统开源,2017Ecshop鸿宇小京东V7.2.3二次开发版分销多用户商城系统微信支...

热门文章

  1. 快速识别手机质量的好坏
  2. [MarkDown] MD文件引用图片和目录
  3. c语言文件操作管理(下)
  4. 学生资助管理系统毕业设计
  5. 习题HTML(web程序设计第8版)
  6. 小学计算机辅助教育,计算机辅助教育 [应用现代教育技术辅助小学数学教学] .doc...
  7. 记一次解析旧版本Excel文件
  8. 【软考|软件设计师】专业英语(软考真题)(2)
  9. 软件测试有多重要?史上十大软件缺陷灾难级事故
  10. css样式大全(整理版)