`
AngelAndAngel
  • 浏览: 234304 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

聚类算法之单链接算法java实现

 
阅读更多
      聚类算法中基于链接的算法大致有三种:单链接算法(single link),平均链接算法(average link),最小生成数算法(minimum spanning tree)。现在实现单链接算法,其他算法以后再续吧。
       单链接算法的过程是 首先生成各个元素的距离矩阵,根据距离和阀值的比对来控制生成的聚类个数,阀值越大,生成的聚类越少,直到同属一类。
       下面例子实现了根据经纬度来实现城市的聚类。
 
   
    package singlelink;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class SingleLinkTest {

	public static void main(String[] args) {

		List<City> citys = new ArrayList<City>();
		
		City city0 = new City();
		city0.setName("北 京");
		city0.setX(116.28);
		city0.setY(39.54);
		citys.add(city0);
		
		
		City city1 = new City();
		city1.setName("上 海");
		city1.setX(121.29);
		city1.setY(31.14);
		citys.add(city1);
		
		City city2 = new City();
		city2.setName("天 津");
		city2.setX(117.11);
		city2.setY(39.09);
		citys.add(city2);
		
		City city3 = new City();
		city3.setName("重 庆");
		city3.setX(106.32);
		city3.setY(29.32);
		citys.add(city3);
		
		
		City city4 = new City();
		city4.setName("哈尔滨");
		city4.setX(126.41);
		city4.setY(45.45);
		citys.add(city4);
		
		
		City city5 = new City();
		city5.setName("长 春");
		city5.setX(125.19);
		city5.setY(43.52);
		citys.add(city5);
		
		
		City city6 = new City();
		city6.setName("南 京");
		city6.setX(118.50);
		city6.setY(32.02);
		citys.add(city6);
		
		City city7 = new City();
		city7.setName("武 汉");
		city7.setX(114.21);
		city7.setY(30.37);
		citys.add(city7);
		
		
		City city8 = new City();
		city8.setName("台 北");
		city8.setX(121.31);
		city8.setY(25.03);
		citys.add(city8);
		
		City city9 = new City();
		city9.setName("香 港");
		city9.setX(114.10);
		city9.setY(22.18);
		citys.add(city9);
		
		SingleLink sing = new SingleLink(citys);
		List<Set<City>> list = sing.compute();
		for (Set<City> list0 : list) {
			System.out.println("=============");
			for (City city : list0) {
				System.out.println(city.getName() + " : (" + city.getX()+","+city.getY()+")");
			}
		}
	}

}

/**
 * 聚类之 单链接算法
 * 
 * @author duyf
 * 
 */
class SingleLink {

	private List<City> data;

	// 默认阀值
	private double distanceX = 8;

	public SingleLink(List<City> list) {
		data = list;
	}

	public List<Set<City>> compute() {
		List<Set<City>> list = new ArrayList<Set<City>>();

		// 距离矩阵
		double[][] ds = new double[data.size()][data.size()];

		for (int i = 0; i < data.size(); i++) {
			City city1 = data.get(i);
			for (int j = i + 1; j < data.size(); j++) {
				City city2 = data.get(j);
				ds[i][j] = getDistance(city1, city2);
				// 矩阵 对称性
				ds[j][i] = ds[i][j];
			}
			ds[i][i] = 0.0;
		}

		for (int i = 0; i < ds.length; i++) {
			for (int j = 0; j < ds.length; j++) {
				System.out.print((int) ds[i][j] + ",");
			}
			System.out.println();
		}
		
		boolean[] hasUsed = new boolean[ds.length];
		for (int i = 0; i < ds.length; i++) {
			Set<City> setDs = new HashSet<City>();
			if (hasUsed[i]) {
				continue;
			}
			for (int j = i; j < ds.length; j++) {
				if (ds[i][j] <= distanceX && hasUsed[j]==false) {
					setDs.add(data.get(j));
					hasUsed[j] = true;
				}
			}
			if (setDs.size() > 0) {
				list.add(setDs);
			}

		}
		return list;
	}

	// 计算空间距离
	private double getDistance(City city1, City city2) {
		 double  distance=Math.pow(city1.getX()-city2.getX(),2)+Math.pow(city1.getY()-city2.getY(),2);
		 return Math.sqrt(distance);
		 
	}

}

/**
 * 城市
 * 
 * @author duyf
 * 
 */
class City {

	private String name;
	// 经度
	private double x;

	// 纬度
	private double y;

	public double getX() {
		return x;
	}

	public void setX(double x) {
		this.x = x;
	}

	public double getY() {
		return y;
	}

	public void setY(double y) {
		this.y = y;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public boolean equals(Object obj) {
		if (obj == null) {
			return false;
		}
		if (this == obj) {
			return true;
		}
		City other = (City) obj;
		if (this.getX() == other.getX() && this.getY() == other.getY()) {
			return true;
		}
		return false;
	}
}
    



By 阿飞哥 转载请说明
腾讯微博:http://t.qq.com/duyunfeiRoom
新浪微博:http://weibo.com/u/1766094735
分享到:
评论

相关推荐

    详解Java实现的k-means聚类算法

    Java语言是实现k-means聚类算法的不二之选。 在学习k-means聚类算法之前,需要了解一些基本概念: 1. 聚类分析:聚类分析是指对数据进行分类,将相似的数据点聚类到一起,形成不同的簇。 2. 无监督学习:无监督...

    java实现聚类算法,Kmeans

    K-means聚类算法是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象...

    DBSCAN聚类算法java实现

    java版的DBSCAN聚类算法实现,是典型的算法思路实现,遍历未访问的所有点,如果是核心点,就新建一个簇,然后遍历其邻域内的所有点集A,不断扩展,如果簇内的点时核心点,就将其邻域所有点纳入点集A,并从点集移除已...

    java实现FCM聚类算法

    java实现FCM聚类算法java实现FCM聚类算法java实现FCM聚类算法java实现FCM聚类算法

    用java实现的基于网格的聚类算法

    在这个场景中,我们讨论的是使用Java编程语言实现的一种基于网格的聚类算法。 1. **Java编程基础** Java是一种广泛使用的面向对象的编程语言,具有跨平台性、高效性和丰富的库支持。在处理大数据和算法实现时,...

    欧式距离实现的聚类算法

    聚类算法,使用欧氏距离实现,可通过文件对算法功能进行测试

    K-means聚类算法JAVA程序实现

    K-means聚类算法是一种广泛应用的数据挖掘方法,用于无监督学习中的分类问题。它通过将数据点分配到最近的聚类中心来组织数据,从而自动发现数据的分组结构。在JAVA程序实现中,K-means算法的关键步骤包括初始化、...

    kmeans聚类算法的java实现

    综上所述,Java实现的KMeans聚类算法可以很好地处理数据库中的字段聚类,通过与MySQL的结合,能有效地对数据进行分析和整理,从而为业务决策提供有力支持。在实际应用中,我们需要关注算法的性能优化和结果的准确性...

    算法深入浅出聚类算法:原理、应用与Java实现

    本文将介绍聚类算法的原理、应用场景以及如何在Java中实现一个简单的聚类算法。 聚类算法在多个领域有着广泛的应用,以下是一些常见的应用场景: (1)图像处理:聚类算法可用于图像分割、图像检索等场景。 (2)...

    mahout聚类算法

    Mahout 聚类算法 Mahout 聚类算法是数据挖掘和机器学习领域中的一种重要算法,它可以将相似的数据点聚集在一起,以便更好地理解和分析数据。Mahout 聚类算法可以分为多种类型,如 Canopy、KMeans、Fuzzy-KMeans、...

    ap聚类算法(java实现版本)

    AP聚类算法,即Affinity Propagation(亲和传播)算法,是由Michael E. Fisher、David M. Bickel和Seth S. Meyer等人在2007年提出的一种无中心、非层次的聚类方法。它不同于传统的K-means或层次聚类,AP算法不需要...

    hadoop实现聚类算法

    ### Hadoop 实现聚类算法 #### 一、引言 在大数据处理领域,Hadoop已经成为了一种不可或缺的工具。其核心组件包括分布式文件系统HDFS(Hadoop Distributed File System)和并行处理框架MapReduce。这些技术为数据...

    K均值聚类算法的Java实现

    这是一种数据挖掘中的k均值聚类算法的简单实现,基于Java语言

    层次聚类算法的java实现

    本项目实现了层次聚类算法的Java版本,下面将详细介绍其关键概念和技术。 首先,层次聚类分为两种类型:凝聚型(Agglomerative)和分裂型(Divisive)。凝聚型是从单个数据点开始,逐步合并成更大的簇,直到满足...

    多维k-means聚类算法java实现,导入直接运行

    通过上述解释,我们可以看出,"多维k-means聚类算法java实现,导入直接运行"项目提供了一个方便的数据聚类工具,用户只需运行指定的Java程序,即可对多维数据进行有效的分类。文件89d2e98083ce4138aaa151e6efde2e00...

    java 代码实现聚类算法

    网上很多python的聚类算法有很多,找的Java的,里面是个jar,直接调用就好了

    聚类算法DBSCAN的实现

    DBSCAN聚类算法的实现,对图片内的物体进行分类,综合考虑了像素和像素点的位置,运行速度较慢。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    聚类算法使用numpy实现的聚类算法(包括时空聚类算法).zip

    【聚类算法】使用numpy实现的聚类算法(包括时空聚类算法).zip 介绍 1.1 数据介绍 data/cluster_time:按时间顺序排列的用户行为轨迹 data/cluster_unix_time:按时间顺序(时间已经转换为时间戳)排列的用户行为...

    一种聚类算法的改进算法Canopy算法

    《Canopy算法:改进聚类算法的探索与实践》 在大数据分析领域,聚类算法是一种重要的无监督学习方法,其目标是将数据集中的对象按照相似性进行分组,形成不同的类别。然而,传统的聚类算法如K-means、DBSCAN等在...

Global site tag (gtag.js) - Google Analytics