在研究大量的数据之中,哪几组数据比较接近的时候(如哪几个城市的消费习惯比较接近)可以选用这个多分类算法。笔者在观看清风的数模教程以后,总结如下要点:

文章目录

  • k-means操作流程
  • k-means的优缺点
    • 优点
    • 缺点
    • c++代码实现
  • k-means++:k-means的改进算法
    • 基本原则
    • 基本原则的实现
    • 为什么能实现?
    • 代码实现
  • 均值聚类算法的两个讨论

k-means操作流程

  1. 选择分类数量k、设置算法的迭代次数
  2. 选定初始的k个聚类中心
  3. 将所有数据按照距离划分给这k个聚类中心
  4. 调整聚类中心的位置(调整为其下所属数据的中心)
  5. 重复上述3-4步直到中心位置不再变化或达到迭代次数为止

    在实际建模论文中,算法流程描述推荐使用流程图的形式来简化冗余的复述、避免查重

k-means的优缺点

优点

  1. 简单、快速
  2. 高效处理大数据集

缺点

  1. 事先给定的类数k完全由用户指定,过于主观缺乏可靠标准
  2. 初值敏感
  3. 孤立点敏感

c++代码实现

为了简化距离计算的过程,使用一维的模拟数据:
先看随机初值的三分类效果:

指定初值(低于正常值,高于正常值和正常值三种初值)的分类结果:

代码:

#include<iostream>
#include<vector>
#include<windows.h>
#include<time.h>
using namespace std;
#define random(x) (rand()%x)
#define N 100
vector<double> v;
vector<double> v1, v2, v3;
double abs(double a){if(a >=0)return a;return (-1)*a;
}
void kmeans(){double c1 = 1.0*random(100)/10, c2, c3;Sleep(1);srand((unsigned)clock());c2 = 1.0*random(100)/10;Sleep(1);srand((unsigned)clock());c3 = 1.0*random(100)/10;cout<<"质心:\n";cout<<c1<<' '<<c2<<' '<<c3<<endl;int times = 0;//迭代次数int tol = 10;//不用太大,几次就能出结果while(times++ < tol){//分类:for(int i = 0; i < v.size(); i++){double t1 = abs(c1-v[i]), t2 = abs(c2-v[i]), t3=abs(c3-v[i]);if(t1 > t2)if(t2 > t3) v3.push_back(v[i]);else v2.push_back(v[i]);elseif(t1 > t3) v3.push_back(v[i]);else v1.push_back(v[i]);}double sum = 0;for(int i = 0; i < v1.size(); i++)sum += v1[i];c1 = sum / v1.size();sum = 0;for(int i = 0; i < v2.size(); i++)sum += v2[i];c2 = sum / v2.size();sum = 0;for(int i = 0; i < v3.size(); i++)sum += v3[i];c3 = sum / v3.size();cout<<"质心:\n";cout<<c1<<' '<<c2<<' '<<c3<<endl;if(times < tol){v1.clear();v2.clear();v3.clear();}}
}
void printCluster(vector<double> c){for(int i = 0; i < c.size(); i++)cout<<c[i]<<',';cout<<endl;
}
int main()
{for(int i = 0; i < N; i++){srand((unsigned)clock());Sleep(1);if(i % 10 == 0){//模拟偏差数据v.push_back(10 + (random(200) - 99) / 10.0);}else{//模拟真实数据v.push_back(10 + (random(20) - 9) / 10.0);}}int i = 0;while(i++<1){kmeans();cout<<"第一类\n";printCluster(v1);cout<<"第二类\n";printCluster(v2);cout<<"第三类\n";printCluster(v3);}return 0;
}

k-means++:k-means的改进算法

为了尽可能避免上述缺点,提出k-means++算法。

基本原则

选取初始聚类中心的时候,使其间距离尽可能地大

基本原则的实现

其改进的地方只在于聚类中心的选取,选取方法如下:

  1. 随机选择一个初始聚类中心
  2. 计算各个数据点到已有中心的最短距离,以此作为权值来计算下一个聚类中心【轮盘法】
  3. 重复第二步,直到选出k个聚类中心为止

为什么能实现?

第二步选取下一个聚类中心的时候,当前数据点距离第一个中心的距离越大,权值就越大,这个数据点的附近就越有可能被选为第二个聚类中心。即:实现了第二个聚类中心距离第一个尽可能远!

代码实现

先看效果:

代码:

#include<iostream>
#include<vector>
#include<windows.h>
#include<time.h>
using namespace std;
#define random(x) (rand()%x)
#define oo 9999999
vector<double> v;
vector<double> v1, center;
vector<vector<double> > cluster;
double abs(double a){if(a >=0)return a;return (-1)*a;
}
void printV(vector<double> c){for(int i = 0; i < c.size(); i++)cout<<c[i]<<',';cout<<endl;
}
void kmeansPlus(int k){int i, n = v.size();double c = v[random(n)];cout<<"第1个聚类中心:"<<c<<endl;center.push_back(c);while(center.size() < k){//找出k个聚类中心为止double sum = 0;for(int j = 0; j < v.size(); j++){double minDis = oo;for(i = 0; i < center.size(); i++){minDis = min(minDis, abs(v[j] - center[i]));}if(j)//制作轮盘v1.push_back(v1[j-1] + minDis);elsev1.push_back(minDis);sum += minDis;}Sleep(1);srand((unsigned)clock());double p = random(100)/100.0*v1[n-1];//轮盘指针for(i = 0; i < v1.size() && v1[i] < p; i++);i--;printf("第%d个聚类中心:%.2f\n",center.size()+1,v[i]);center.push_back(v[i]);//下一个聚类中心v1.clear();}//聚类cluster.resize(k);for(i = 0; i < n; i++){double minDis = oo;int clu;for(int j = 0; j < k; j++){if(minDis > abs(center[j]-v[i])){minDis = abs(center[j]-v[i]);clu = j;}}cluster[clu].push_back(v[i]);}
}
int main()
{for(int i = 0; i < 100; i++){srand((unsigned)clock());Sleep(1);if(i % 10 == 0)//模拟偏差数据v.push_back(10 + (random(200) - 99) / 5.0);else//模拟真实数据v.push_back(10 + (random(20) - 10) / 20.0);}int i = 0, k = 3;kmeansPlus(k);for(int i = 0; i < k; i++){printf("第%d类\n", i+1);printV(cluster[i]);}return 0;
}

均值聚类算法的两个讨论

  1. 我们希望将数据划分为k类,那这个k怎么确定?

    一般根据题目判断,分为几类会比较好描述,就分几类。

    比如“哪几个城市的消费习惯比较接近”这个问题,取k=2或3都比较合适。k=2时描述可以是:第一类城市消费水平较高,第二类消费水平较低。k=3时则将各个城市的消费水平分为高、中、低三档。

  2. 数据量纲不一致怎么办?

    比如我们遇到了一组物什的性质描述数据,其中一个数据量纲是长度(m)一个为重量(t),二者差异太大/直接计算的数据没有意义怎么办?

    使用公式Xi−X平均X标准差\frac{X_i-X_{平均}}{X_{标准差}}X标准差​Xi​−X平均​​对数据进行标准化。再使用标准化以后的数据来聚类即可。

【聚类模型①】k均值聚类算法相关推荐

  1. 聚类之K均值聚类和EM算法

    这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means) ...

  2. 多元统计分析--聚类分析(系统性聚类、K均值聚类)

    摘要 系统聚类分为Q型聚类与R型聚类.前者对样品进行聚类,后者对变量进行聚类.在本文中,我们探讨对样品的分类. 文章目录 摘要 主要思想 相似性的度量 系统聚类 K均值聚类 主要思想 聚类,在样品没有 ...

  3. 机器学习-聚类之K均值(K-means)算法原理及实战

    K-means算法 前言 机器学习方法主要分为监督学习和非监督学习两种.监督学习方法是在样本标签类别已知的情况下进行的,可以统计出各类样本的概率分布.特征空间分布区域等描述量,然后利用这些参数进行分类 ...

  4. 两种聚类方法——K均值聚类(K-means)算法和模糊C均值聚类(FCM)算法的简述与在MATLAB中的实现

    目录 1.K-means算法 1.1算法流程 1.2程序实现 1.3实验结果 原始数据集 聚类结果 2.FCM算法 2.1算法流程 2.2程序设计 FCM子函数 主函数 2.3实验结果 原始数据集 聚 ...

  5. matlab编程实现k_means聚类(k均值聚类)

    1. 聚类的定义 以下内容摘抄自周志华<机器学习> 根据训练数据是否拥有标记信息,机器学习任务可以大致分为两大类:"监督学习"(supervised learning) ...

  6. 《统计学习方法》—— 聚类方法(层次聚类和K均值聚类)

    转载:https://www.cnblogs.com/nku-wangfeng/p/7642745.html 所谓聚类,就是将相似的事物聚集在一 起,而将不相似的事物划分到不同的类别的过程,是数据分析 ...

  7. Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法

    聚类的分割 1.K-均值聚类 (1)K-均值聚类介绍 k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心 ...

  8. Python,OpenCV中的K均值聚类——K-Means Cluster

    Python,OpenCV中的K均值聚类 1. 效果图 2. 原理 2.1 什么是K均值聚类? 2.2 K均值聚类过程 2.3 cv2.kmeans(z, 2, None, criteria, 10, ...

  9. 聚类分析 | MATLAB实现k-Means(k均值聚类)分析

    目录 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k-均值聚类简介 相关描述 程序设计 学习小结 参考资料 致谢 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k ...

  10. Kmeans K均值聚类,OpenCV实现

    Clustering 聚类 kmeans  k均值聚类 Finds centers of clusters and groups input samples around the clusters. ...

最新文章

  1. Spring Boot 前后端配合及接口化测试学习记录[3]
  2. 一不小心又把应用发挂了,复盘一下这十几分钟的黑暗时刻
  3. “混”的中层们,你们的下一站是?
  4. 【MM模块】Contract 采购合同简介
  5. php视频文件上传到服务器,上传和下载图片和视频到服务器
  6. 数据挖掘十大算法之—C4.5
  7. Spark _02SparkCore_RDD
  8. 如何理解 Objective-C Delegate
  9. php语句结束标记,PHP结束标记“?”
  10. 【Java】计算二进制数中1的个数
  11. 字节跳动算法工程师总结:中高级java开发面试题
  12. JavaScript浏览器对象模型概述(1)
  13. casio计算器计算统计数据
  14. 【行测】图形找规律类题目
  15. css样式实现居中对齐
  16. springboot返回对象报No serializer found for class xxx and no properties discovered to create BeanSerializ
  17. 《黃帝內經》第一章《上古天真論》
  18. 利用这5个办法成为自由职业者,通过远程赚钱,开心旅行、轻松赚钱!
  19. namespace 命名空间
  20. java基础实战练习_JAVA入门第三季第七章实战练习

热门文章

  1. 2018人工智能发展盘点:国内各行业拥抱AI,总体呈现八大特点
  2. 关于飞信的协议以及验证码
  3. pinterest类网站差异化发展 时光轴成稀饭网突围利器
  4. Safari浏览器兼容性问题处理
  5. ffmpeg截取jpg图_使用ffmpeg进行视频封面截取
  6. hp 816、817 墨盒计数器清零图文教程
  7. 当程序员变成软件项目经理
  8. android adb am start,Android adb shell am start命令总结
  9. HttpClient4.X发送Get请求的url参数拼接
  10. matlab双线性插值图像处理,数字图像处理:双线性插值