【0】README

0.1)本文描述和源代码均为原创,旨在说明 如何将模板方法模式应用到kmean聚类算法;

0.2)模板方法模式的intro, 参见  模板方法模式

0.3)for kmeans alg source code, please visit  kmeans&templateMethodPattern

【1】intro to kmeans

1.1)准备工作:随机初始化聚类质心(随机更新质心),读取数据等;

1.2)核心算法:

for i in round

step1)为每个样本item分配质心;

step2)更新质心;

step3)打印每轮聚类结果(可选)或重定向到 持久化文件;

public final void cluster() {// 聚类方法randomRefineInitialCentroid(); // 随机初始化聚类质心for (int i = 0; i < ClusterParam.clusterExeTimes; i++) {Arrays.fill(ClusterData.clusterMemberNum, 0); // 清空聚类成员个数记录for (int j = 0; j < ClusterData.rowno; j++){  ClusterData.rownoWithClusterid[j] = assign(j);}clearDoubleArray(ClusterData.centroid); // 清空质心refine();PrintResult.print(i+1);}}

【2】将模板方法模式应用到kmean聚类算法

2.1)intro to 模板方法模式: 一句话说完,模板方法模式就是为 封装算法而生的,主要是在基类 先对 算法的steps 给出 outline, 然后 抽取各个子类的共同 steps 到 基类进行具体实现,其他的都抽象为抽象方法 有子类实现;这样一来,整个alg 的 steps 无比清晰,且易于扩展,特别是对于学术型alg,有很多变体算法,如基于kmeans的 聚类算法就有很多;

2.2) kmeans 聚类算法基类和子类

package com.research.alg2;import static java.lang.System.out;import java.util.Arrays;import com.research.io2.PrintResult;
import com.research.pojo2.ClusterData;
import com.research.pojo2.ClusterParam;public abstract class ClusterAlg {public static String algName;abstract int assign(int index); // 为 第 index 个item 分配质心,返回结果是质心编号indexabstract void refine();// 精炼质心public final void cluster() {// 聚类方法randomRefineInitialCentroid(); // 随机初始化聚类质心for (int i = 0; i < ClusterParam.clusterExeTimes; i++) {Arrays.fill(ClusterData.clusterMemberNum, 0); // 清空聚类成员个数记录for (int j = 0; j < ClusterData.rowno; j++){  ClusterData.rownoWithClusterid[j] = assign(j);}clearDoubleArray(ClusterData.centroid); // 清空质心refine();PrintResult.print(i+1);}}// reset centroid array zerosfinal void clearIntArray(int[][] data) {for (int i = 0; i < data.length; i++)Arrays.fill(data[i], 0);}// reset centroid array zerosfinal void clearDoubleArray(double[][] data) {for (int i = 0; i < data.length; i++)Arrays.fill(data[i], 0);}// randomly update or refine init centroidsfinal void randomRefineInitialCentroid() {int[] initCentorid = generateRandom(ClusterData.rowno, ClusterParam.clusterNum);System.out.println("====  init centroids are as follows:");for (int i = 0; i < initCentorid.length; i++){ClusterData.centroid[i] = ClusterData.items[initCentorid[i]].clone();out.printf("%-8s", "item" + initCentorid[i]);}out.printf("\n============================================================================\n");}/*** fabricate random array* @param volumn , random number upper limit* @param interval , interval number and there is a random number in every interval* @return a random array*/final int[] generateRandom(int volume, int interval) {int[] r_data = new int[interval];int intervalVolume = volume / interval;for (int i = 0; i < interval; i++) {int r = (int) (Math.random() * intervalVolume);r_data[i] = r + intervalVolume * i;}//      r_data[0] = 1;
//       r_data[1] = 101;
//       r_data[2] = 301;
//       r_data[3] = 501;
//       r_data[4] = 701;
//       r_data[5] = 901;return r_data;}
}
package com.research.alg2;import static java.lang.Math.pow;import com.research.pojo2.ClusterData;
import com.research.pojo2.ClusterParam;public class KmeansAlg extends ClusterAlg {/*** compute the centroid the item should be assigned to* @param index refers to item index* @return cluster id whose has the smallest distance between centroid and*         the item*/@Overrideint assign(int index) {double sum = 0;double miniSum = 0;int miniIndex = 0;double[] item = ClusterData.items[index];for (int i = 0; i < ClusterData.dimension; i++)sum += pow(item[i] - ClusterData.centroid[0][i], 2.0);miniSum = sum;for (int i = 1; i < ClusterParam.clusterNum; i++) {sum = 0;for (int j = 0; j < ClusterData.dimension; j++)sum += Math.pow(item[j] - ClusterData.centroid[i][j], 2.0);if (miniSum > sum) {miniSum = sum;miniIndex = i;}}ClusterData.clusterMemberNum[miniIndex]++;return miniIndex;}@Overridevoid refine() {int clusterId;for (int i = 0; i < ClusterData.rowno; i++) {clusterId = ClusterData.rownoWithClusterid[i];for (int j = 0; j < ClusterData.dimension; j++)ClusterData.centroid[clusterId][j] += ClusterData.items[i][j];}// update centroids(refinement procedure)for (int i = 0; i < ClusterParam.clusterNum; i++)for (int j = 0; j < ClusterData.dimension; j++)ClusterData.centroid[i][j] /= ClusterData.clusterMemberNum[i];}
}

将模板方法模式应用到kmeans聚类算法相关推荐

  1. 4.K-MEANS聚类算法

    4.K-MEANS聚类算法 4.1.概述 4.2.算法核心思想 4.3.K-Means原理初探 4.4.传统K-Means算法流程 4.5.K-Means初始化优化K-Means++ 4.7.大样本优 ...

  2. 一步步教你轻松学K-means聚类算法

    一步步教你轻松学K-means聚类算法 (白宁超   2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类 ...

  3. 基于GPU的K-Means聚类算法

    聚类是信息检索.数据挖掘中的一类重要技术,是分析数据并从中发现有用信息的一种有效手段.它将数据对象分组成为多个类或簇,使得在同一个簇中的对象之间具有较高的相似度,而不同簇中的对象差别很大.作为统计学的 ...

  4. 经典的K-means聚类算法

    原理部分主要来自大牛zouxy09和trnadomeet两个人的博客:后面的代码详细讲解为自己精心编写 一.概述          非监督学习的一般流程是:先从一组无标签数据中学习特征,然后用学习到的 ...

  5. 机器学习十大经典算法之K-Means聚类算法

    聚类介绍 聚类在机器学习,数据挖掘,模式识别,图像分析以及生物信息等领域有广泛的应用.聚类是把相似的对象通过静态分类的方法分成不同的组别或者更多的子集(subset),这样让在同一个子集中的成员对象都 ...

  6. 一文搞懂K-means聚类算法

    一步步教你轻松学K-means聚类算法 阅读目录 目录 聚类 K-means(k均值)聚类算法 案例描述 从文件加载数据集 计算两个向量的欧氏距离 构建一个包含 K 个随机质心的集合 K-Means ...

  7. 机器学习算法-KMeans聚类算法解析及伪代码实现。

    机器学习算法-KMeans聚类算法解析及伪代码实现. 徐小狗在文末附上了几条大神们关于KMeans聚类算法的博文,欲详细研究请前往浏览~ 作为初学者,许多地方可能笨拙或有误,希望有大神看到后给予优化和 ...

  8. 机器学习:k-means聚类算法+算法优化

    第六章:机器学习course02:k-means聚类算法 标签(空格分隔): 10-机器学习 $---by:Rianusr$ ##1 课题导入 ###1.1 k-means常见的应用场景 ![imag ...

  9. Kmeans聚类算法及其matlab源码

    本文介绍了K-means聚类算法,并注释了部分matlab实现的源码. K-means算法 K-means算法是一种硬聚类算法,根据数据到聚类中心的某种距离来作为判别该数据所属类别.K-means算法 ...

最新文章

  1. OKRS如何进行目标的对齐?
  2. [Swust OJ 566]--开N方数(牛顿切线法解高次方程)
  3. Codeforces Round #349 (Div. 1) A. Reberland Linguistics 动态规划
  4. 设置行间距_Word涨薪第五十四式:解决无法调整行间距的情况
  5. 深入浅出Spring Boot,你和大神的差距,就只有这份文档的距离
  6. matlab jp2格式,JP2文件扩展名_JP2是什么格式_JP2文件怎么打开-文件百科
  7. JavaScript从入门到放弃 -(四)E5 新增方法
  8. 2021-07-07IF神经元模型
  9. 【Clickhouse】Clickhouse MergeTree家族引擎
  10. about page
  11. 李飞飞力荐:阿里巴巴高可用数据库解决方案
  12. 创建自己的uboot-基于IMX6
  13. Unity动作游戏大全
  14. matlab中codegen是什么,matlab中mcc编译器参数的含义
  15. solr使用 备忘录 草稿
  16. WordPress默认头像修改方法汇总
  17. 晶体管之基本放大电路NPN共发射极电路
  18. 天龙八部服务端Lua脚本系统(转)
  19. android listview 美化,Android界面美化 -- 自定义ListView分割线
  20. 计算机二级考试是考什么?

热门文章

  1. 【CF1338C】Perfect Triples【位运算】【构造】
  2. CF1208F Bits And Pieces(未解决)
  3. [ZJOI2010]网络扩容[网络流24题]
  4. 2020牛客国庆集训派对day8
  5. 2020年首届算法竞赛网络挑战赛直播讲解课程
  6. [TJOI2011] 书架(线段数优化dp + 单调栈)
  7. CF666E-Forensic Examination【广义SAM,线段树合并】
  8. P5488-差分与前缀和【NTT,生成函数】
  9. P7044-[MCOI-03]括号【组合数学】
  10. A*,IDA*—高档次的暴搜