小弟我写的Ap聚类备忘

我写的Ap聚类备忘
1. StartDriver.java是程序入口,只需运行这个程序即可
ApClusterParameters.java是程序的一些参数设置。必须由你自己重新设定的是“pointsTotalNum”=总共多少个点,“inputSARFilePath”=包含similarity/availability/responsibility的输入文件。 可以*设定(不一定重新设定)的参数是“expectedInputFileNum”= inputSequenceFiles的个数(程序把pointIndexes 均匀地写入这些文件中,格式为<pointIndex,"">...expectedInputFileNum实际上等于map.task.num,所以你想要多少个maptasks的话就设这个数expectedInputFileNum为多少), “iterateNum”=迭代计算responsibility&availability的次数,"lam"=收敛系数,不知道怎么设定,按论文的先设定为0.5

其他参数不用管

2.注意我原来的输入文件(inputSARFile即Data_25,可参照package的底下Data_25这个文件)的格式(保留原来hyp的格式): rowIndex/columnIndex:similarity/availability/responsibility ...如果你要用自己的输入格式,ok,只需模仿着去改ApUtil.java中的putSARIntoHBaseTable函数,把similarity和availability(初始为0)和responsibility(初始为0)的值放进hbase即可。一定注意存在hbase中一行(一个row_key)的responsibility是实际中的responsiblity这个矩阵的一列(即按列存到hbase里面)为什么要按列存,因为计算一列avail的时候是要取一列respo的。

3.所有mapreduce的任务的输入文件路径都是ApClusterParameters.inputSequenceFilePath.文件中只存point index<new IntWritable(pointIndex), new Text("")>,真正计算是到hbase里拿值,计算,存值到hbase

4.CalResponsibility(Driver/Mapper):计算responsibility(参照论文的公式1),一个map函数计算一行(第ith行)responsiblity(需要取出第ith行 similairty 和第ith行availability).注意比论文的公式中多了一个lam 收敛系数,见论文本的第9页matlab代码

5.CalAvailability(Driver/Mapper):计算availability(参照论文公式2(i==k),公式3(i!=k)).一个map函数计算一列(第kth列)availability(需要取出第kth列的respo(所以一开始时resposibility按列存,可以一次性取出一列)).注意也比论文的公式中多了一个lam[/color] 收敛系数

所以注意CalResponsibility时map函数是按行计算的。CalAvailability时map是按列计算的

6. FindClusters(Driver/Mapper/Reducer)是找出中心,矩阵a+r中对角元素大于0的可以作为中心center.

7.AssignPointsToCluster(Driver/Mapper/Reducer)是把各个点赋到各个中心上去。对于点i,寻找a+r这一行中使a(i,center)+r(i,center)最大值的那个center作为i的中心。

8.cluster result输出格式为sequenceFile,只是打印出来,如要把结果输出到文本格式中,请自行处理一下。