【机器学习算法1】——kmeans聚类的设计与实现

本文介绍了k-means聚类算法的基本思想和实现步骤,包括初始化质心、样本分配、质心更新等,强调了算法的非监督学习特性。通过计算类内散度判断算法收敛,并提供了C++代码示例。同时讨论了初试质心选择对算法效果的影响,建议多次试验选取最优结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(本博客主要用于记录自己学习过程中的一些感悟和体会,如有错误之处希望大家帮忙指正,也希望跟大家共同学习共同进步。)
kmeans算法属于非监督学习算法,因为在原始的数据集中没有类别标号。简单回顾一下kmeans聚类算法的思想:
给定k的值,将原始的样本分为k个簇,使每个簇内的散度最小,簇与簇之间的散度最大。我们这里用J=这里写图片描述最小;所以具体的实现思路是:
(1)由给定的聚类数初始化一个k维的数组,作为初始的k个均值记为mean[u1,u2,u3,u4…..,uk];其中ui又是一个d维的向量(样本维数是d);

(2)将所有样本(n个) ,以x(i)为其中一个d维的样本为例,分别计算x(i)到k个不同均值(质心)即u1,u2,……,uk 的欧式距离(简单的每个维度相减然后求平方和,再做开方,因为优快云的编辑器写公式很不方便,简单的叙述了);选择一个距离最小的质心uj作为其中心,该样本点也被划分为cluster[j]这个新的数组空间里(也可以理解为给这个样本增加了一个属性标号label,label=j);重复,直到所有样本都划分完毕。

(3)计算总的类内散步(就是每个簇里面的样本到质心的欧式距离的和)记为oldVar;根据每个cluster里面的划分的样本计算新的质心(简单的求平均),更新mean[k]数组;然后将所有样本重复第二步的过程,计算与新的质心的距离,选择新的聚类,更新cluster[j],j从1到k的元素,或者理解为更改原始样本的属性标号label。

(4)由上述计算新的方差newVar(上面提到的总的类内散度的和),与oldVar相比较。如果变化很小就表明收敛。如果变化很大就继续上述的(2)、(3)步过程。直到收敛。或者指定迭代的次数(即质心更新的次数,达到一定的次数就跳出循环)。

考虑到初试样本对收敛速度以及收敛精度的影响。可以采用不同的初试质心多做几次试验,选择newVar最小的一次作为聚类的结果;

下面是具体C++代码实现的过程(我个人编程能力很一般,这里参考的是http://blog.youkuaiyun.com/qll125596718/article/details/8243404/这篇文章,我觉得代码写的非常规范,我只是根据自己的需要改动了一小部分,但是主要思路还是源于上篇文章)

#include <iostream>  
#include <sstream>  
#include <fstream>  
#include <vector>  
#include <math.h>  
#include <stdlib.h>  
#include<time.h>
#define k 3//簇的数目  
using namespace std;
//存放元组的属性信息  
typedef vector<double> Tuple;//存储每条数据记录  

int dataNum;//数据集中数据记录数目  
int dimNum;//每条记录的维数  

//计算两个元组间的欧几里距离  
double getDistXY(const Tuple& t1, const Tuple& t2)
{
    double sum = 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值