当前位置:Gxlcms > mysql > Mahout–Clustering(聚类篇)

Mahout–Clustering(聚类篇)

时间:2021-07-01 10:21:17 帮助过:18人阅读

什么是Mahout?" Apache Mahout? project's goal is to build a scalable machine learning library "我来拓展一下:(1) Mahout 是Apache旗下的开源项目,集成了大量的机器学习算法。(2) 大部分算法,可以运行在Hadoop上,具有很好的拓展性,使得大数据上的

什么是Mahout? " Apache Mahout? project's goal is to build a scalable machine learning library " 我来拓展一下: (1) Mahout 是Apache旗下的开源项目,集成了大量的机器学习算法。 (2) 大部分算法,可以运行在Hadoop上,具有很好的拓展性,使得大数据上的机器学习成为可能。 本篇主要探讨 Mahout 0.9 中的聚类(Clustering)工具的用法。 一、数据准备 Mahout聚类算法的输入为List,即需要将每个待聚类的文档,表示为向量形式。 在本文中,我们选择经典的 Reuters21578?文本语料。尝试对新闻内容进行文本聚类。 1、下载数据 [crayon-53b01de37e087548071658/] 2、解压缩数据 [crayon-53b01de37e08d580286630/] 解压缩之后,reuters-sgm下,包含了若干*.sgm文件,每个文件中又包含了若干下属结构化文档: [crayon-53b01de37e092370305269/] 在下文中,我们主要使用和<BODY>中的文本。即标题+正文。 <strong>3、抽取</strong> Mahout中内置了对上述Reuters预料的抽取程序,我们可以直接使用。 [crayon-53b01de37e097623779753/] 如上所述,抽取好的结果在./reuters-out文件夹下面,每篇<REUTERS>文档,变成了一个独立的文件。 一共有21578个txt,即数据集中含有21578篇文档:-) 说下命名规则吧,例如:文件名:./reuters-out/reut2-006.sgm-246.txt,表示来自于./reuters-sgm/reut2-006.sgm中的第246篇文档,下标从0开始。 <strong>4、转换成SequenceFile</strong> 对于传统的文本聚类算法而言,下一步应该是:将文本转化为词的向量空间表示。 然而,不要太着急哦。 由于Mahout运行在Hadoop上,HDFS是为大文件设计的。如果我们把上述21578个txt都拷贝上去,这样是非常不合适的 设想下:假设对1000万篇新闻进行聚类,难道要拷贝1000w个文件么?这会把name node搞挂的。 因此,Mahout采用SequenceFile作为其基本的数据交换格式。 内置的seqdirectory命令(这个命令设计的不合理,应该叫directoryseq才对),可以完成 文本目录->SequenceFile的转换过程。 [crayon-53b01de37e09b762719714/] 上述命令蕴含了2个大坑,在其他文档中均没有仔细说明: (1) -xm sequential,表示在本地执行,而不是用MapReduce执行。如果是后者,我们势必要将这些小文件上传到HDFS上,那样的话,还要SequenceFile做甚…… (2) 然而seqdirectory在执行的时候,并不因为十本地模式,就在本地文件系统上寻找。而是根据-i -o的文件系统前缀来判断文件位置。也就是说,默认情况,依然十在HDFS上查找的……所以,这个file://的前缀是非常有必要的。 其他2个参数: <ul> <li>-c UTF8:编码。</li> <li>-chunk 64:64MB一个Chunk,应该和HDFS的BLOCK保持一致或者倍数关系。</li> </ul> <strong>5、转换为向量表示</strong> 为了适应多种数据,聚类算法多使用向量空间作为输入数据。 由于我们先前已经得到了处理好的SequenceFile,从这一步开始,就可以在Hadoop上进行啦。 [crayon-53b01de37e0a0174103784/] 开始text->Vector的转换: [crayon-53b01de37e0a4989317262/] 输入和</script></pre>输出不解释了。在Mahout中的向量类型可以称为sparse。 参数说明如下: <ul> <li>-ow( 或?--overwrite):即使</script></pre>输出目录存在,依然覆盖。</li> <li>--weight(或 -wt) tfidf:权重公式,大家都懂的。其他可选的有tf (当LDA时建议使用)。</li> <li>--maxDFPercent(或 -x) 85:过滤高频词,当DF大于85%时,将不在作为词特征</script></pre>输出到向量中。</li> <li>--namedVector (或-nv):向量会</script></pre>输出附加信息。</li> </ul> 其他可能有用的选项: <ul> <li>--analyzerName(或-a):指定其他分词器。</li> <li>--minDF:最小DF阈值。</li> <li>--minSupport:最小的支持度阈值,默认为2。</li> <li>--maxNGramSize(或-ng):是否创建ngram,默认为1。建议一般设定到2就够了。</li> <li>--minLLR(或 -ml):The minimum Log Likelihood?<span style="line-height: 1.714285714; font-size: 1rem;">Ratio。默认为1.0。</span>当设定了-ng > 1后,建议设置为较大的值,只过滤有意义的N-Gram。</li> <li>--logNormalize(或 -lnorm):是否对</script></pre>输出向量做Log变换。</li> <li>--norm(或 -n):是否对</script></pre>输出向量做p-norm变换,默认不变换。</li> </ul> 看一下产出: [crayon-53b01de37e0a8438258109/] 说明各个文件的用途: <ul> <li>dictionary.file-0:词文本 -> 词id(int)的映射。词转化为id,这是常见做法。</li> <li>frequency.file:词id -> 文档集词频(cf)。</li> <li>wordcount(目录): 词文本 -> 文档集词频(cf),这个应该是各种过滤处理之前的信息。</li> <li>df-count(目录): 词id -> 文档频率(df)。</li> <li>tf-vectors、tfidf-vectors (均为目录):词向量,每篇文档一行,格式为{词id:特征值},其中特征值为tf或tfidf。有用采用了内置类型VectorWritable,需要用命令"mahout vectordump -i <path>"查看。</li> <li>tokenized-documents:分词后的文档。</li> </ul> <strong><span style="line-height: 1.714285714; font-size: 1rem;">二、KMeans</span></strong> <strong>1、运行K-Means</strong> [crayon-53b01de37e0ad260803464/] 参数说明如下: <ul> <li>-i:输入为上面产出的tfidf向量。</li> <li>-o:每一轮迭代的结果将</script></pre>输出在这里。</li> <li>-k:几个簇。</li> <li>-c:这是一个神奇的变量。若不设定k,则用这个目录里面的点,作为聚类中心点。否则,随机选择k个点,作为中心点。</li> <li>-dm:距离公式,文本类型推荐用cosine距离。</li> <li>-x :最大迭代次数。</li> <li>--clustering:在mapreduce模式运行。</li> <li>--convergenceDelta:迭代收敛阈值,默认0.5,对于Cosine来说略大。</li> </ul> </script></pre>输出1,初始随机选择的中心点: [crayon-53b01de37e0b1701364962/] </script></pre>输出2,聚类过程、结果: [crayon-53b01de37e0b5761109176/] 其中,clusters-k(-final)为每次迭代后,簇的20个中心点的信息。 而clusterdPoints,存储了 簇id -> 文档id 的映射。 <strong>2、查看簇结果</strong> 首先,用clusterdump,来查看k(20)个簇的信息。 [crayon-53b01de37e0b9933747704/] 要说明的是,clusterdump似乎只能在本地执行……所以先把数据下载到本地吧。 参数说明: <ul> <li>-i :我们只看最终迭代生成的簇结果。</li> <li>-d :使用 词 -> 词id 映射,使得我们</script></pre>输出结果中,可以直接显示每个簇,权重最高的词文本,而不是词id。</li> <li>-dt:上面映射类型,由于我们是seqdictionary生成的,so。。</li> <li>-o:最终产出目录</li> <li>-n:每个簇,只</script></pre>输出20个权重最高的词。</li> </ul> 看看dump结果吧: 一共有20行,表示20个簇。每行形如: [crayon-53b01de37e0bd439905248/] 其中前面的12722是簇的ID,n=1305即簇中有这么多个文档。c向量是簇中心点向量,格式为 词文本:权重(点坐标),r是簇的半径向量,格式为 词文本:半径。 下面的Top Terms是簇中选取出来的特征词。 <strong>3、查看聚类结果</strong> 其实,聚类结果中,更重要的是,文档被聚到了哪个类。 遗憾的是,在很多资料中,都没有说明这一点。前文我们已经提到了,簇id -> 文档id的结果,保存在了clusteredPoints下面。这也是mahout内置类型存储的。我们可以用seqdumper命令查看。 [crayon-53b01de37e0c3990690636/] 其中,-d和-dt的原因同clusterdump。 如果不指定-o,默认</script></pre>输出到屏幕,</script></pre>输出</script></pre>结果为形如: [crayon-53b01de37e0c7109527914/] 其实,这个</script></pre>输出是一个SequenceFile,大家自己写程序也可以读出来的。 Key是ClusterID,上面clusterdump的时候,已经说了。 Value是文档的聚类结果:wt是文档属于簇的概率,对于kmeans总是1.0,/reut2-000.sgm-0.txt就是文档标志啦,前面seqdirectionary的-nv起作用了,再后面的就是这个点的各个词id和权重了。 <strong>三、Fuzzy-KMeans</strong> KMeans是一种简单有效的聚类方法,但存在一些缺点。 例如:一个点只能属于一个簇,这种叫做硬聚类。而很多情况下,软聚类才是科学的。例如:《哈利波》属于小说,也属于电影。Fuzzy-Kmeans 通过引入“隶属度”的方式,实现了软聚类。 <strong>1、算法简介</strong> 详细的介绍转载自:http://home.deib.polimi.it/matteucc/Clustering/tutorial_html/cmeans.html <p style="text-align: center;"><img alt="Clustering - Fuzzy C-means" class=" wp-image-4201 aligncenter" height="795" src="https://img.gxlcms.com//Uploads-s/new/2019-09-30-201930/0U11W101-0.png" width="1399" /></p> <strong>2、工具用法</strong> 执行Fuzzy-KMeans [crayon-53b01de37e0cc813279082/] 新增算法的柔软参数m,若m接近于1则接近于KMeans;随着m增加,会有越来越多的聚簇重叠(越多的点同时属于多个聚簇)。 <strong>3、查看隶属度</strong> 如上文所述,在Fuzzy-KMeans中,点以一定的 “概率” 隶属于聚簇。 我们可以用seqdumper查看隶属度: [crayon-53b01de37e0d0577023900/] 其中的 w: xxx.xxx表示了 隶属度,应当是 0~1之间的数。 <strong>四、Canopy</strong> KMeans算法还有一个缺陷: k需要预先给定,在很多场景下,聚类形状都是预先无法知道的,k更无从谈起。因此,往往先用别的算法进行粗略聚类,同时确定初始值,然后再用KMeans算法。 <strong>1、算法简介</strong> Canopy Clustering 算法提出于2000年。优点是计算速度快,缺点是结果准确性较低。 尽管如此,其结果依然可以大致描述 聚类中心的位置。因此,常用来与KMeans算法配合使用。 (1) 将数据集向量化得到一个list后放入内存,选择两个距离阈值:T1和T2,其中T1 > T2,对应上图,实线圈为T1,虚线圈为T2,T1和T2的值可以用交叉校验来确定; (2) 从list中任取一点P,用低计算成本方法快速计算点P与所有Canopy之间的距离(如果当前不存在Canopy,则把点P作为一个Canopy),如果点P与某个Canopy距离在T1以内,则将点P加入到这个Canopy; (3) 如果点P曾经与某个Canopy的距离在T2以内,则需要把点P从list中删除,这一步是认为点P此时与这个Canopy已经够近了,因此它不可以再做其它Canopy的中心了; (4) 重复步骤2、3,直到list为空结束。 我再来简单概括一下:阈值T1 > T2。到簇中心点的距离 < T2的点,必须属于本聚簇(硬)。T2 < 到簇中心点距离 < T1的点,可以属于多个聚簇(软)。在后续计算可以被合并。 <strong>2、聚类用法</strong> 执行Canopy聚类 [crayon-53b01de37e0d6300925810/] 如上所述,在距离的计算方面,我们选择了欧式距离。阈值T1=150, t2=75。 </script></pre>输出结果,也可以用ClusterDump查看。 [crayon-53b01de37e0d9194884494/] 这是一个粗略、大致的结果。在实际应用中,经常被用来作为K-Means的初始聚簇中心,来代替随机选择的K个中心点。这一做法有2个优点: (1) 无需决定K,因为我们的预设往往是不准的。 (2) 使用Canopy的聚类结果,是一个大致准确的中心点。而随机选择很可能陷入局部最优。 在执行k-means时,若我们不指定k,则会使用-c的路径作为初始聚簇中心点,并跳过随机选择的过程。 [crayon-53b01de37e0dd402255813/] <strong>3、参数选择</strong> 最后,我们讨论以下Canopy的参数T1和T2。 <ul> <li>T1 > T2,具体值是文档及距离计算公式而定。</li> <li>若T1过大,会使得许多点属于多个Canopy,造成各个簇的中心点距离比较近,使得簇之间的区分不明显。</li> <li>若T2过大,强标记数据点的数量会增加,从而减少簇个数。</li> <li>若T2过小,会增加簇的个数,以及计算时间。</li> </ul> 网上有人给出了这个做法,仅供参考: <ol> <li>对数据进行采样。</li> <li>计算所有文档之间的平均距离(使用要在Canopy中用的距离公式)。</li> <li>T1 = 平均距离 * 2;T2 = 平均距离。</li> </ol> 上述做法有一定道理,但我认为,以下更加合理: <ol> <li>对数据进行采样。</li> <li>选择一个T2,T1 = 2 * T1。</li> <li>进行聚类,并评测聚类效果,可使用k-fold交叉验证。</li> <li>迭代选择下一个T2。</li> <li>直到找到最优的T1 T2。</li> </ol> <strong>五、Spectral</strong> <strong>1、谱聚类算法简介</strong> 谱聚类算法,参考了文章《Mahout Spectral聚类》。 谱聚类算法是一种较为现代的图聚类算法。与K-Means等传统聚类相比,它具有以下特点: <ol> <li>可以对非欧式距离空间的点进行聚类。传统K-Means将点视为向量,并计算距离。而<strong><span style="color: #ff0000;">谱聚类算法要求直接给出两样本间相似度的矩阵</span></strong>。使得一些不便于在欧式空间计算的多特征聚类问题,有了更好的解法。(例如,性别,年龄2个特征,在欧式空间中就没有显著意义)。</li> <li>上面的这一更宽泛的约束条件,使得谱聚类对样本空间的形状无限制,并能收敛于全局最优解(无需使用)。</li> </ol> 一种典型的谱聚类算法的大致流程是: <ol> <li>构建样本集的相似度矩阵W。</li> <li>对相似度矩阵W进行稀疏化,形成新的相似度矩阵A。</li> <li>构建相似度矩阵A的拉普拉斯矩阵L。</li> <li>计算拉普拉斯矩阵L的前k个特征值与特征向量,构建特征向量空间。</li> <li>将前k个特征向量(列向量)组合成N*k的矩阵,每一行看成k维空间的一个向量,利用K-means或其它经典聚类算法对该矩阵进行聚类。</li> </ol> 其中,转化为拉普拉斯矩阵实际是一个降维的过程。正是这一特点,使得谱聚类能够处理超大规模的数据。 <strong>2、Mahout中的谱聚类</strong> 上文已经提到: <ul> <li>传统K-Means等聚类中,需要将每个样本转化为一个向量。</li> <li>谱聚类中,则需要直接给一个矩阵,其中存储了任意两个样本之间的相似度。</li> </ul> 例如: <img alt="2013081119022654" class="attachment-medium" height="111" src="http://www.coder4.com/wp-content/uploads/2014/04/20130811190226546-300x111." width="300" /> 在实际应用中,相似矩阵(affinity matrix)是相当稀疏的。所以,Mahout采用了邻接矩阵的输入格式,即(i, j, affinity)表示第i个样本与第j个样本的相似度是affinity。 同时,还需要输入矩阵的维度。原因应该是很好理解的。 如上图中的数据,转化完毕后,就是: [crayon-53b01de37e0e4242100190/] Mahout中,将谱聚类与KMeans进行了整合,执行命令: [crayon-53b01de37e0e8224631814/] 参数说明: <ul> <li>-i :输入的相似度矩阵,邻接矩阵。</li> <li>-k:目标聚成2个簇。</li> <li>-o:聚簇中间结果。</li> <li>-d:相似度矩阵维度为6,也即样本共6个。</li> <li>-x:100,最多迭代100次。</li> <li>-cd:收敛阈值,默认0.5</li> </ul> 其他可选参数: <ul> <li>-ssvd:使用svd矩阵分解降维。</li> <li>-q:svd相关。</li> </ul> </script></pre>输出的目录结构,与K-Means等相似: [crayon-53b01de37e0ec354492758/] 说明一下: <ul> <li>sc-spectral/clusters-0:初始聚簇。</li> <li>sc-spectral/kmeans_out/clusteredPoints:最终结果,样本->聚簇映射。</li> <li>sc-spectral/kmeans_out/clusters-1-final:最终聚簇的信息。</li> </ul> 先看一下聚簇映射: [crayon-53b01de37e0f0022291383/] 如上所示,这个顺序,是按照输入样本顺序来的。Key 1表示属于第2个簇,0表示第1个簇。distance是点与簇的相似距离。 然后来看一下簇中心: [crayon-53b01de37e0f5188247652/] </script></pre>输出结果: [crayon-53b01de37e0f9805498536/] 于 K-Means一样,VL-XX是簇名称,n代表簇中含有几个元素。c是簇中心,r是簇半径。 然而奇怪的是,我们可以发现,上面的n都是错的,而下面簇中点的打印是对的不知道是什么Bug... <strong><span style="line-height: 1.714285714; font-size: 1rem;">六、LDA</span></strong> LDA是一种主题模型,它是一种考虑了词贡献的,较为高级的“聚类”算法,主要功能为: <ol> <li>给定主题数k,</script></pre>输出文档属于每个主题的概率(越大表示越贴近该主题)。</li> <li></script></pre>输出每个主题中,权重最大的几个词。相当于传统聚类之后的Tag。</li> </ol> 关于算法、原理方面,本文就不做过多的介绍了,感兴趣的可以查看相关论文。 考虑到LDA的特性,提取特征的时候,我们需要使用tf而非tfidf: [crayon-53b01de37e0ff989623009/] Mahout实现的LDA有个大坑:tf的vector,词必须是Ingeter类型,即要我们把word转换成wordid。 [crayon-53b01de37e103542436583/] 生成的有2个子目录,我们只用下面这个matrix: [crayon-53b01de37e106258174359/] LDA训练: [crayon-53b01de37e10a495964197/] 上述参数,说明一下: <ul> <li>-k 主题数20</li> <li>-dt:</script></pre>输出的?</li> <li>-o:</script></pre>输出的?</li> <li>-x:迭代100次,其实对于LDA,1000~2000次是比较合理的。</li> <li>-nt:词的数量,即dictionary.file-0的大小。</li> </ul> PS:Mahout这个LDA,执行效率真心不高,也可能是我的数据太小,机器太少。 <strong>文档->主题的概率</strong> [crayon-53b01de37e10e726233742/] </script></pre>输出共21578行,代表了文档集合中的所有文档。 <ul> <li>Key是文档id,与文件的对应关系可以在/user/coder4/reuters-cvb-vectoers/docIndex中查看。</li> <li>Value是文档属于Topic 0~19的概率。按照值Sort一下,就能知道文档属于哪个主题的概率最大。</li> </ul> [crayon-53b01de37e112067009078/] <strong>主题->词的概率</strong> [crayon-53b01de37e116215799178/] <ul> <li>一共有20行有效</script></pre>输出,Key 0~19,代表了20个主题。</li> <li>每个Value中有41806个词的权重。表示了词属于当前主题的权重。</li> </ul> 本来有个LDAPrintTopics,可以直接打印Topic对应的词的,但是年久失修,已经不能用在新版的cvb的LDA上了。大家可以写程序对上免每个Topic中词的权重进行排序,从而获得每个主题的代表词。     <p class="copyright"> 原文地址:Mahout – Clustering (聚类篇), 感谢原作者分享。 </div> <div class=""> <ul class="m-news-opt fix"> <li class="opt-item"> <a href='/mysql-318354.html' target='_blank'><p>< 上一篇</p><p class="ellipsis">MySQLTPCH测试工具简要手册</p></a> </li> <li class="opt-item ta-r"> <a href='/mysql-318356.html' target='_blank'><p>下一篇 ></p><p class="ellipsis">MySQL5.1分区技术初探(四)</p></a> </li> </ul> </div> </div> </div> <div class="g-title fix"> <h2 class="title-txt">人气教程排行</h2> </div> <div class="m-rank u-dashed mb40"> <ul> <li class="rank-item"> <a href="/mysql-462732.html" title='对数据库模式进行规范化处理,是在数据库设计的什么阶段?' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">355次</span> <span class="g-sort-num top">1</span> 对数据库模式进行规范化处理,是在数据库设计的什么阶段? </a> </li> <li class="rank-item"> <a href="/mysql-380346.html" title='mysql如何删除多个表格数据库数据' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">355次</span> <span class="g-sort-num second">2</span> mysql如何删除多个表格数据库数据 </a> </li> <li class="rank-item"> <a href="/mysql-345368.html" title='Oracle购买价格和服务费计算方式' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">355次</span> <span class="g-sort-num third">3</span> Oracle购买价格和服务费计算方式 </a> </li> <li class="rank-item"> <a href="/mysql-339781.html" title='MYSQL查看和新增表分区' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">355次</span> <span class="g-sort-num ">4</span> MYSQL查看和新增表分区 </a> </li> <li class="rank-item"> <a href="/mysql-345027.html" title='TRACE32调试技巧' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">354次</span> <span class="g-sort-num ">5</span> TRACE32调试技巧 </a> </li> <li class="rank-item"> <a href="/mysql-320236.html" title='Oracle数据库教程:ORA-01031:权限不足' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">353次</span> <span class="g-sort-num ">6</span> Oracle数据库教程:ORA-01031:权限不足 </a> </li> <li class="rank-item"> <a href="/mysql-319270.html" title='Oracle物化视图失效的几种情况及测试' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">353次</span> <span class="g-sort-num ">7</span> Oracle物化视图失效的几种情况及测试 </a> </li> <li class="rank-item"> <a href="/mysql-306127.html" title='mysql-sql语句查询多个字段不等于零怎么写?' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">352次</span> <span class="g-sort-num ">8</span> mysql-sql语句查询多个字段不等于零怎么写? </a> </li> <li class="rank-item"> <a href="/mysql-306897.html" title='如何提高mysql大批量数据更新(update)的效率?' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">351次</span> <span class="g-sort-num ">9</span> 如何提高mysql大批量数据更新(update)的效率? </a> </li> <li class="rank-item"> <a href="/mysql-464754.html" title='mysql如何从ibd文件恢复数据' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">350次</span> <span class="g-sort-num ">10</span> mysql如何从ibd文件恢复数据 </a> </li> <li class="rank-item"> <a href="/mysql-345209.html" title='ORACLEROLLUP和CUBE函数' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">350次</span> <span class="g-sort-num ">11</span> ORACLEROLLUP和CUBE函数 </a> </li> <li class="rank-item"> <a href="/mysql-344534.html" title='IBMDB2赋权[SQL0551N]' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">350次</span> <span class="g-sort-num ">12</span> IBMDB2赋权[SQL0551N] </a> </li> <li class="rank-item"> <a href="/mysql-288264.html" title='mysql不等于符号写法' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">350次</span> <span class="g-sort-num ">13</span> mysql不等于符号写法 </a> </li> <li class="rank-item"> <a href="/mysql-303705.html" title='redhat8mysql安装具体过程_MySQL' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">349次</span> <span class="g-sort-num ">14</span> redhat8mysql安装具体过程_MySQL </a> </li> <li class="rank-item"> <a href="/mysql-290023.html" title='SQLServer出现Error:1326错误(管理器无法连接远程数据库)问题解决方案' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">349次</span> <span class="g-sort-num ">15</span> SQLServer出现Error:1326错误(管理器无法连接远程数据库)问题解决方案 </a> </li> <li class="rank-item"> <a href="/mysql-367580.html" title='centos下配置mysql数据库自动备份' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">348次</span> <span class="g-sort-num ">16</span> centos下配置mysql数据库自动备份 </a> </li> <li class="rank-item"> <a href="/mysql-289513.html" title='MySQL中使用SQL语句对字段进行重命名' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">348次</span> <span class="g-sort-num ">17</span> MySQL中使用SQL语句对字段进行重命名 </a> </li> <li class="rank-item"> <a href="/mysql-337773.html" title='数据库中的表以行和列来组织数据,每一行称为每一列称为' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">347次</span> <span class="g-sort-num ">18</span> 数据库中的表以行和列来组织数据,每一行称为每一列称为 </a> </li> <li class="rank-item"> <a href="/mysql-306268.html" title='windowsservice-mysql安装出错,远程调用失败' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">347次</span> <span class="g-sort-num ">19</span> windowsservice-mysql安装出错,远程调用失败 </a> </li> <li class="rank-item"> <a href="/mysql-316621.html" title='SQL连接查询语法及使用' class="item-name ellipsis" target="_blank"> <span class="g-art-count fr">346次</span> <span class="g-sort-num ">20</span> SQL连接查询语法及使用 </a> </li> </ul> </div> </div> </div> <!-- / 教程内容页 --> </div> </div> <!-- 页尾 --> <div class="footer"> 本站所有资源全部来源于网络,若本站发布的内容侵害到您的隐私或者利益,请联系我们删除!</div> <!-- / 页尾 --> <script type="text/javascript" src="/kan/js/read.js"></script> <div style="display:none"> <div class="login-box" id="login-dialog"> <div class="login-top"><a class="current" rel="nofollow" id="login1" onclick="setTab('login',1,2);" >登录</a></div> <div class="login-form" id="nav-signin"> <!-- <div class="login-ico"><a rel="nofollow" class="qq" id="qqlogin" target="_blank" href="/user-center-qqlogin.html"> QQ </a></div> --> <div class="login-box-form" id="con_login_1"> <form id="loginform" action="/user-center-login.html" method="post" onsubmit="return false;"> <p class="int-text"> <input class="email" id="username" name="username" type="text" value="用户名或Email" onfocus="if(this.value=='用户名或Email'){this.value='';}" onblur="if(this.value==''){this.value='用户名或Email';};" ></p> <p class="int-text"> <input class="password1" type="password" id="password" name="password" value="******" onBlur="if(this.value=='') this.value='******';" onFocus="if(this.value=='******') this.value='';" > </p> <p class="int-info"> <label class="ui-label"> </label> <label for="agreement" class="ui-label-checkbox"> <input type="checkbox" value="" name="cookietime" id="cookietime" checked="checked" value="2592000"> <input type="hidden" name="notforward" id="notforward" value="1"> <input type="hidden" name="dosubmit" id="dosubmit" value="1">记住我的登录 </label> <a rel="nofollow" class="aright" href="/user-center-forgetpwd.html" target="_blank"> 忘记密码? </a></p> <p class="int-btn"><a rel="nofollow" id="loginbt" class="loginbtn"><span>登录</span></a></p> </form> </div> <form id="regform" action="/user-center-reg.html" method="post"> <div class="login-reg" style="display: none;" id="con_login_2"> <input type="hidden" name="t" id="t"/> <p class="int-text"> <input id="email" name="email" type="text" value="Email" onfocus="if(this.value=='Email'){this.value='';}" onblur="if(this.value==''){this.value='Email';};"></p> <p class="int-text"> <input id="uname" name="username" type="text" value="用户名或昵称" onfocus="if(this.value=='用户名或昵称'){this.value='';}" onblur="if(this.value==''){this.value='用户名或昵称';};"></p> <p class="int-text"> <input type="password" id="pwd" name="password" value="******" onBlur="if(this.value=='') this.value='******';" onFocus="if(this.value=='******') this.value='';"> </p> <p class="int-text1"><span class="inputbox"> <input id="validate" name="validate" type="text" value="验证码" onfocus="if(this.value=='验证码'){this.value='';}" onblur="if(this.value==''){this.value='验证码';};"> </span><span class="yzm-img"><img src="/user-checkcode-index" alt="看不清楚换一张" id="indexlogin"></p> <p class="int-info"> <label> <input value="" name="agreement" id="agreement" CHECKED="checked" type="checkbox"> 我已阅读<a rel="nofollow" href="/user-center-agreement.html">用户协议</a>及<a rel="nofollow" href="/user-center-agreement.html">版权声明</a></label> </p> <p class="int-btn"><input type="hidden" name="dosubmit"/> <a rel="nofollow" class="loginbtn" id="register"><span>注册</span></a></p> </div> </form> </div> </div> </div> </div> <script type="text/javascript" src="/kan/js/foot_js.js"></script> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?6dc1c3c5281cf70f49bc0bc860ec24f2"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script type="text/javascript" src="/layui/layui.js"></script> <script> layui.use('code', function() { layui.code({ elem: 'pre', //默认值为.layui-code about: false, skin: 'notepad', title: 'php怎么实现数据库验证跳转代码块', encode: true //是否转义html标签。默认不开启 }); }); </script> </body> </html>