聚类算法-Hierarchical(MIN)-C++

程序流程图:

Hierarchical(MIN)核心功能函数,采用vector<vector<float> >::dTable存储两点之间的距离。计算每两个point间的距离并保存到distance table中;判断是否达到需要聚类的cluster数量,若是,将point信息写入clustering文件,程序结束。否则,合并两个具有最小距离的point,将两个point中的所有node全部加入到一个point中,删除拷贝node数组后的多余point,跟新dataset数组。然后更新distance table,删除被合并point对应的distance
table中行与列,进入下一步循环。

/*
	K-means Algorithm
	15S103182
	Ethan
*/
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <iterator>
#include <cmath>
#include <stack>
#include <limits>
using namespace std;

class node{
public:
	float x;
	float y;
	node(float a,float b){
		x = a;
		y = b;
	}
};

class point{
public:
	float x;
	float y;
	vector<node> nds;
	point (float a,float b){
		x = a;
		y = b;
		node t(a,b);
		nds.push_back(t);
	}
};
float stringToFloat(string i){
	stringstream sf;
	float score=0;
	sf<<i;
	sf>>score;
	return score;
}
vector<point> openFile(const char* dataset){
	fstream file;
	file.open(dataset,ios::in);
	if(!file)
    {
        cout <<"Open File Failed!" <<endl;
        vector<point> a;
        return a;
    }
	vector<point> data;
	while(!file.eof()){
		string temp;
		file>>temp;
		int split = temp.find(',',0);
		point p(stringToFloat(temp.substr(0,split)),stringToFloat(temp.substr(split+1,temp.length()-1)));
		data.push_back(p);
	}
	file.close();
	cout<<"Read data successfully!"<<endl;
	return data;
}
float squareDistance(point a,point b){
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void HierarchicalClustering(vector<point> dataset,int clusters){
	//Similarity table:distance table
	vector<vector<float> > dTable;
	for(int i=0;i<dataset.size();i++){
		vector<float> temp;
		for(int j=0;j<dataset.size();j++){
			if(j>i)
				temp.push_back(squareDistance(dataset[i],dataset[j]));
			else if(j<i)
				temp.push_back(dTable[j][i]);
			else
				temp.push_back(0);
		}
		dTable.push_back(temp);
	}
	int len = dataset.size();
	cout<<"len:"<<len<<endl;
	while(dataset.size()>clusters){
		//Merge two closest clusters
		float minDt =INT_MAX;
		int mi,mj;
		for(int i=0;i<dTable.size();i++){
			for(int j=i+1;j<dTable[i].size();j++){
				 if(dTable[i][j]<minDt){
				 	minDt = dTable[i][j];
				 	mi = i;
				 	mj = j;
				 }
			}
		}
		for(int i=0;i<dataset[mj].nds.size();i++){
			dataset[mi].nds.push_back(dataset[mj].nds[i]);
		}
		//rm
		vector<point>::iterator imj = dataset.begin();
		imj += mj;
		dataset.erase(imj);

		//Update the dTable
		for(int j=0;j<dTable.size();j++){
			if(j==mi||j==mj) continue;
			if(dTable[mi][j]>dTable[mj][j]){
				dTable[mi][j] = dTable[mj][j];
				dTable[j][mi] = dTable[mi][j];
			}
		}
		//rm
		vector<vector<float> >::iterator ii = dTable.begin();
		ii += mj;
		dTable.erase(ii);
		for(int i=0;i<dTable.size();i++){
			vector<float>::iterator ij = dTable[i].begin();
			ij += mj;
			dTable[i].erase(ij);
		}
	}
	fstream clustering;
	clustering.open("clustering.txt",ios::out);
	for(int i=0;i<dataset.size();i++){
		for(int j=0;j<dataset[i].nds.size();j++)
			clustering<<dataset[i].nds[j].x<<","<<dataset[i].nds[j].y<<","<<i+1<<"\n";
	}
	cout<<dataset.size();
	clustering.close();
}

int main(int argc, char** argv) {
	vector<point> dataset = openFile("dataset3.txt");
	HierarchicalClustering(dataset,15);
	return 0;
}

数据文件格式:(x,y)

运行结果格式:(x,y,cluster)

具体文件格式见DBSCAN篇:http://blog.csdn.net/k76853/article/details/50440182

图形化展现:

总结:

Hierarchical(MIN)算法能够很好处理非圆形状的数据。但对于噪音和离群点,Hierarchical(MIN)算法具有局限性。由于层次聚类具有不可恢复性,一旦聚类,就难以撤销聚类操作,刚开始编码的时候走了不少弯路,后来果断决定用数组存储node信息,方便cluster合并。对于近邻表的更新,也遇到一点小麻烦,由于二级指针对于行列的删除比较复杂,果断采用动态数组vector来存储距离信息,二级vector对于行的删除非常直接简单,对于列的删除也只需O(n)操作,比较简洁高效。

时间: 2024-10-11 01:41:33

聚类算法-Hierarchical(MIN)-C++的相关文章

聚类算法之K-means 、 K中心点、hierarchical methods

聚类算法有以下几类: 一 层次方法 层次方法创建给定数据对象集的层次分解.根据层次的分解的形成方式,层次的方法又可以分为凝聚和分裂方法. 凝聚法:自底向上.开始将每个对象形成单独的组,然后层次合并相似的组,直到所有的组合合并成一个或者满足某个终止条件. 分裂法:自顶向下.开始将所有对象置于一个簇中,每次迭代,簇分裂成更小的簇,直到每个对象都各在一个簇中或者满足某个终止条件. 二 划分方法 给定n个对象或者数据元组的数据库,划分方法构造数据的k个划分,每个划分为一个簇,k<n.给定要构造的划分数组

挑子学习笔记:两步聚类算法(TwoStep Cluster Algorithm)——改进的BIRCH算法

转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/twostep_cluster_algorithm.html 两步聚类算法是在SPSS Modeler中使用的一种聚类算法,是BIRCH层次聚类算法的改进版本.可以应用于混合属性数据集的聚类,同时加入了自动确定最佳簇数量的机制,使得方法更加实用.本文在学习文献[1]和“IBM SPSS Modeler 15 Algorithms Guide”的基础上,融入了自己的理解,更详尽地叙述两步聚类算法的流程和细节.

机器学习:Python实现聚类算法(三)之总结

考虑到学习知识的顺序及效率问题,所以后续的几种聚类方法不再详细讲解原理,也不再写python实现的源代码,只介绍下算法的基本思路,使大家对每种算法有个直观的印象,从而可以更好的理解函数中参数的意义及作用,而重点是放在如何使用及使用的场景. (题外话: 今天看到一篇博文:刚接触机器学习这一个月我都做了什么?  里面对机器学习阶段的划分很不错,就目前而言我们只要做到前两阶段即可) 因为前两篇博客已经介绍了两种算法,所以这里的算法编号从3开始. 3.Mean-shift 1)概述 Mean-shift

基于位置信息的聚类算法介绍及模型选择

百度百科 聚类:将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异."物以类聚,人以群分",在自然科学和社会科学中,存在着大量的分类问题.聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法.聚类分析起源于分类学,但是聚类不等于分类.聚类与分类的不同在于,聚类所要求划分的类是未知的. 分类和聚类算法一直以来都是数据挖掘,机器学习领域的热门课题,因此产生了众多的

【转】 聚类算法-Kmeans算法的简单实现

1. 聚类与分类的区别: 首先要来了解的一个概念就是聚类,简单地说就是把相似的东西分到一组,同 Classification (分类)不同,对于一个 classifier ,通常需要你告诉它"这个东西被分为某某类"这样一些例子,理想情况下,一个 classifier 会从它得到的训练集中进行"学习",从而具备对未知数据进行分类的能力,这种提供训练数据的过程通常叫做 supervised learning (监督学习),而在聚类的时候,我们并不关心某一类是什么,我们需

学习笔记:聚类算法Kmeans

前记 Kmeans是最简单的聚类算法之一,但是运用十分广泛,最近看到别人找实习笔试时有考到Kmeans,故复习一下顺手整理成一篇笔记.Kmeans的目标是:把n 个样本点划分到k 个类簇中,使得每个点都属于离它最近的质心对应的类簇,以之作为聚类的标准.质心,是指一个类簇内部所有样本点的均值. 算法描述 Step 1. 从数据集中随机选取K个点作为初始质心         将每个点指派到最近的质心,形成k个类簇 Step 2. repeat             重新计算各个类簇的质心(即类内部

《机器学习实战》之二分K-均值聚类算法的python实现

<机器学习实战>之二分K-均值聚类算法的python实现 上面博文介绍了K-均值聚类算法及其用python实现,上篇博文中的两张截图,我们可以看到,由于K-均值聚类算法中由于初始质心的选取,会造成聚类的局部最优,并不是全局最优,因此,会造成聚类的效果并不理想,为克服K-均值算法收敛于局部最小值的问题,就有了二分K-均值算法. 二分K-均值聚类算法 二分K均值算法是基本K均值算法的直接扩充,其基本思想是:为了得到K个簇,首先将所有点的集合分裂成两个簇,然后从这些簇中选取一个继续分裂,迭代直到产生

Spark MLlib KMeans聚类算法

1.1 KMeans聚类算法 1.1.1 基础理论 KMeans算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇.然后按平均法重新计算各个簇的质心,从而确定新的簇心.一直迭代,直到簇心的移动距离小于某个给定的值. K-Means聚类算法主要分为三个步骤: (1)第一步是为待聚类的点寻找聚类中心: (2)第二步是计算每个点到聚类中心的距离,将每个点聚类到离该点最近的聚类中去: (3)第三步是计算每个聚类中所有点的坐标平均值,并将这个平均值作为新的聚类中心: 反复执行(

K-Means 聚类算法

K-Means 概念定义: K-Means 是一种基于距离的排他的聚类划分方法. 上面的 K-Means 描述中包含了几个概念: 聚类(Clustering):K-Means 是一种聚类分析(Cluster Analysis)方法.聚类就是将数据对象分组成为多个类或者簇 (Cluster),使得在同一个簇中的对象之间具有较高的相似度,而不同簇中的对象差别较大. 划分(Partitioning):聚类可以基于划分,也可以基于分层.划分即将对象划分成不同的簇,而分层是将对象分等级. 排他(Exclu