system: [SYSTEM]

user: 3. 结果与讨论 3.1. Canopy优化K-means聚类 Mahout的K-means聚类算法中随机生成的初始中心点集会使聚类结果产生随机误差，改变这一现状 的最好方式就是使用合适的初始中心点来替换随机产生的点集，既使用Canopy近似聚类来生成初始的点中心；本文使用mahout中封装的Canopy聚类脚本命令来运行Canopy聚类，其命令如下： 该命令其他参数可输入mahout Canopy-help查看。 在经过多次试验，最佳参数选择为：距离测度选择欧式距离，针对本文的样本集，t1和t2的值在经过测试可以选择在0到100之间，过大的t1和t2会使样本集只有一个Canopy，过小时Canopy则会很多，在多次测试后得到Canopy的最佳取值分别为83和42，共生成32个Canopy；Canopy聚类的结果是sequencefile格式的文件，可以使用seqdumper命令将其转换成文本进行查看，如图2所示。 图中key为Canopy的ID，value为Canopy值，因为该值为向量形式，须使用vectordump查看，该处显示为向量所在地址的哈希值；针对文章中样本集选择的不同Canopy算法参数生成的Canopy数如表1所示。 图1. 实验流程图 图2. Seqdumper输出Canopy 将Canopy聚类结果的clusters-0-final文件作为K-means聚类的-c参数输入，则可得到经过Canopy优化的K-means(文章后续内容称为C-means算法)聚类结果，其详细的结果参数如表2所示。 以上参数是忽略了Canopy算法的运行时间的结果，在经过Canopy优化以后的K-means聚类质量得到一定提高，簇间距离更加明显，使得类簇间的区别变大，能够降低一个话题多个类簇情况出现的几率。使用clusterdump命令查看聚类结果，得到的部分结果如表3所示。 表中的类簇id为mahout随机分配，从聚类结果来看，大部分类别都带着较为明确的话题，而使用K-means亦或Canopy + K-means对类簇的话题并不会产生太大的影响，簇间距离的扩大能够有效的将类簇区分开，可是簇内密度的小幅变化难以对类簇话题产生影响。但是样本簇内距离的大小可以用作微博用户相似性的评价指标，为向用户推荐好友做决策。 使用聚类结果对各个类簇进行话题的总结。话题总结的最好方式是依据类簇中的高权重词建立决策树，可以将决策树的输出作为话题，对类簇中的样本所属用户进行广告推送，或者对类簇中的样本所属用户进行簇内距离计算，将一定阈值内的用户看做相似用户进行好友推荐。 K-means和C-means算法在算法收敛速度、簇间最大距离、簇间最小距离的对比，如图3。 3.2. 文本相似性计算 针对聚类结果中聚类样本所在的clusteredPoints目录，以其中单个样本为目标，计算目标样本所在类 Table 1 Canopy number corresponding to Canopy algorithm parameter T1 (欧式距离) T2 (欧式距离) 收敛速度 Canopy个数 100 50 3537 ms 1 85 40 3686 ms 11 83 42 6164 ms 32 70 35 184，462 ms 113 表1. Canopy算法的参数对应的Canopy个数 Table 2 Canopy optimized K-means clustering parameter 收敛系数 0.3 0.1 0.01 收敛速度(C-means) 18，430 ms 47，904 ms 138，076 ms 迭代次数(C-means) 2 3 9 簇间最大距离(C-means) 0.870353 0.901472 0.972938 簇间最小距离(C-means) 0.437512 0.487238 0.520349 表2. Canopy优化的K-means聚类参数 Table 3 Canopy + K-means clustering result 类簇id 簇内10个最高权重词(top terms) 20136 普宁 机芯 表 机械 钢 表带 石英 机械 男士 镜面 19658 效果 反馈 皮肤 好了 面膜 补水 肌肤 毛孔 改善 产品 21179 商圈 北京 成都 吃 杭州 花园 漳州 苏州 江滨 香港 4738 运动 金牌 夺金 脚力 步 勋章 收获 跑步 挑战 行走 17938 琼海 十里 昆明 桃花 三世 三生 电视剧 卫视 大年 剧 表3. Canopy + K-means聚类结果 图3. (a) K-means与C-means算法收敛速度对比；(b) K-means与C-means算法簇间最大距离对比；(c) K-means与C-means算法簇间最小距离对比 簇中与其距离相近的样本点，将它们作为目标样本的潜在近似用户，然后通过经纬度过滤掉空间位置上距离较远的近似用户，剩下的就是与目标用户为中心，在地理位置和兴趣主题上都较为相似的用户，将它们看成一个相似簇，则可以在该簇中的样本所对应的用户之间进行好友推荐的操作。伪代码如下： 计算样本相似度伪代码： 其中距离计算使用的是余弦距离，T值的选择应该较小，本文实验使用的T值是0.3，结果查看使用clusterdumper类以目标样本为中心点，相似簇为类簇，dictionary.file-0为映射输入；部分内容如图4所示： 其中distance为样本与目标间的余弦距离，后边为样本分词后的每个词在对应维度上的值。距离测度方式可按照好友推荐的精度进行调节；当聚类结果优秀时可对整个类簇中的样本进行好友推荐的操作。在计算出文本相似的用户以后使用针对这些微博用户使用欧式距离来计算它们之间的地域邻近性，就可以得到文本相似与地域邻近的相似用户。 3.3. 基于聚类结果的热点分析——以商圈主题类簇为例 ArcGIS是一个功能强大的GIS桌面应用系统，本文中聚类生成的类簇里包含着几千甚至上万条与类簇主题相对应的微博，这些微博在空间上呈现一种“特殊的离散”状态，然而这些离散样本中其实隐含着类簇主题的分布规律；这些隐含的规律难以用肉眼识别，也难以使用简单的计算方式得到，因此我们需要选择一些强大的工具来帮我们发现这其中的规律；ArcGIS强大的空间分析工具可以帮助我们来完成这个复杂的计算过程，使用ArcGIS中的核密度分析、渔网栅格化分析来对样本类簇进行分析，将样本中隐含的规律以直观的方式展现在我们眼前。 3.3.1. 核密度分析 核密度分析，是一种对输出象元附近或者邻域内的点要素或线要素的密度进行计算的分析方法，本文针对的是样本点进行核密度分析，所以主要介绍点的核密度分析过程。 点的核密度分析其关键所在是计算核表面的值；核表面是笼罩在点要素之上的平滑曲面，一个点要素对应的核表面的最大值是在该要素的正上方，核表面的值随着与点要素的距离增大而减小；核密度分析的过程是计算叠加在输出象元中心点之上的所有核表面值的和，在ArcGIS中核表面与底部平面相交组成的空间的体积记录为Population要素，此要素在为空值时体积为1。单点核密度计算公式如式1所示： 图4. 查看相似簇 p ( x ) = 1 n h ∑ i = 1 n { K [ d ( x ， x i ) h ] } (公式1) 式中的K()为核函数，h为阈值距离，n为样本数量；在本小节的实验中对商圈类簇进行核密度分析，针对北京市中心城区使用核密度分析挖掘出该区域的热门商圈，实验数据只保留微博正文的签到信息，如表4所示。 实验大致流程如下： 1) 将样本点导入ArcGIS中，从全国县级矢量地图中选出北京市中心城区的矢量要素，建立新图层。 2) 使用北京城区图层为范围裁剪样本点，去除不在范围内的样本点，得到结果4千多个北京市中心城区样本点，如图5所示。 3) 使用ArcToolBox中的核密度分析工具来分析，输入数据为裁剪后剩余的样本点；处理后结果如图6所示。 经过核密度分析，可以明显的看出北京市中心城区的核心商圈分布情况，其中热点最高的是北京CBD核心区、工体、建外SOHO、交大商圈。 3.3.2. 渔网栅格化分析 离散的位置数据点呈现在地图上时很难发现他们之间的空间信息，而商圈对周围区域的辐射影响使 Table 4 Experimental dat 微博ID 经纬度 签到位置 5a0d643dd56d0f10648a90f6 116.45749， 39.91401 北京CBD 5a0d6740d56d0f10648a9730 116.46146， 39.90721 北京建外SOHO 5a0d656fd56d0f10648a91d2 116.44234， 39.93321 北京工体 表4. 实验数据 图5. 样本点 图6. 核密度分析 图7. 栅格化商圈热点图 得商圈的分布通常呈现临近性，因此选择使用栅格格网来覆盖样本点，以使空间上离散的样本点变成空间上相互临近的栅格格网。 每一个栅格格网的热度受其涵盖的点的数量的影响，大致流程如下： 1) 仍以北京市中心城区矢量图为底图，裁剪后的样本点为输入数据。 2) 使用ArcToolBox中的fishnet工具创建栅格格网，依据样本分布特征建立对应大小的渔网栅格。 3) 计算每个渔网栅格的属性值为栅格单元中包含的样本点个数；得到的结果如图7所示。 如图6所示，栅格化处理后的商圈的热度与核密度分析的结果相类似，但是在栅格化分析的结果中，可以较清晰的看出商圈的临近性，以及对商圈周边区域的影响，在两个商圈之间的过渡区域呈现热度下降，但是受附近商圈的影响仍然有一定的人气。