k-means聚类也称k均值算法,自顶而下的聚类算法,根据元素对类的所属是否为而至,又分为硬聚类和软聚类。
在普通的k均值算法中,元素和类用相同的向量形式表达。类是质心,即类中所有元素的均值,初始时可将元素随意(或根据启发性信息)分为k个组,计算出各个组的之心,然后按照以下的算法进行类间元素的调整:
硬k均值聚类算法
1 初始化k个组的质心向量
2 while 还可以继续改进 do
3 for 每个元素(文档)d do
4 找出质心向量与d最相似的组c
5 将d调整到组c之中
6 end for
7 for 每个组c do
8 重新计算质心向量
9 end for
10 end while
软k均值聚类算法
相对于硬k均值聚类,删去3-6步,在第8步计算质心向量时,采用下式计算质心偏移量,注意:每个元素对每个组的偏移量都有贡献, 但贡献的大小不同,离组的质心越近,贡献越大。
相关链接:K-means聚类算法原理和C++实现
学习笔记:
先附上上一段链接中的代码:
#include "stdafx.h"
#include<iostream>
#include<cmath>
#include<vector>
#include<ctime>
using namespace std;
typedef unsigned int uint;
struct Cluster
{
vector<double> centroid;
vector<uint> samples;
};
double cal_distance(vector<double> a, vector<double> b)
{
uint da = a.size();
uint db = b.size();
if (da != db) cerr << "Dimensions of two vectors must be same!!\n";
double val = 0.0;
for (uint i = 0; i < da; i++)
{
val += pow((a[i] - b[i]), 2);
}