K-Means算法用于实现聚类需求,以K为参数,把N个对象分为个簇,以使簇内具有较高的相似度。

具体实现上主要是一个循环找质心的过程,大体思路是先预处理数据,将所有点看成一个簇,找这个簇的质心,再选取离全局质心最远的一部分点作为最初选取的簇质心,这里课本上用的是随机选取一部分点作为簇质心,但是当点过多时会比较麻烦,具体解释见大佬:https://blog.csdn.net/zhihaoma/article/details/48649489

预处理之后就得到了一部分簇质心,之后就只需要循环遍历就好了,每次都遍历所有点,将点归入簇中,再对簇中的点进行遍历,更新簇质心,直到所有质心在每次遍历中偏移的距离在一定标准之内即可。

实现代码:

#include<bits/stdc++.h>
using namespace std;
int n,k;struct node{ double x;double y;
}s[10005], mean[10005];
//s数组用于存放点的数据,mean数组用于存放质心的数据 struct Node {double dis;int id;
}ss[10005];
//ss数组用于第一次质心的选择vector<int> V[10005];
//存储每个簇中的点 double GetDis(double x1, double y1, double x2, double y2) { return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}bool cmp(struct Node a,struct Node b) {return a.dis > b.dis;
}void K_Means()
{double max_dis = 0.0,limit_dis; printf("输入收敛的误差限度(默认0.05):");scanf("%lf",&limit_dis) ;do {   for(int i = 1; i <= k; ++i)V[i].clear();for(int i = 1; i <= n; ++i) { double dis = -1.0;int tar;for(int j = 1; j <= k; ++j) {double ans = GetDis(s[i].x, s[i].y, mean[j].x, mean[j].y);if(ans > dis) {dis = ans;tar = j;}}V[tar].push_back(i);//遍历所有点,将每个点都放在一个离质心最近的簇中,实现聚类 }for(int i = 1; i <= k; ++i) {double sum_x = 0.0, sum_y = 0.0;for(int j = 0; j < V[i].size(); ++j) {int cnt = V[i][j];sum_x += s[cnt].x;sum_y += s[cnt].y;}double ans_x = sum_x / (double)V[i].size();double ans_y = sum_y / (double)V[i].size();max_dis = min(max_dis, GetDis(mean[i].x, mean[i].y, ans_x, ans_y));mean[i].x = ans_x; mean[i].y = ans_y;}//更新k个簇的质心 }while(max_dis >= limit_dis); }
int main()
{scanf("%d",&n);double init_x = 0.0, init_y = 0.0;for(int i = 1; i <= n; ++i) {scanf("%lf %lf", &s[i].x, &s[i].y);init_x += s[i].x;init_y += s[i].y;}init_x /= (double)n;init_y /= (double)n;//第一次收敛选择全局点构成第一个全局质心 for(int i = 1; i <= n; ++i) {ss[i].dis = GetDis(init_x, init_y, s[i].x, s[i].y);ss[i].id = i;}sort(ss + 1, ss + n + 1, cmp);//第一次选择的全局质心相当于预处理scanf("%d", &k);  for(int i = 1; i <= k; ++i) {int cnt = ss[i].id;mean[i].x = s[cnt].x;mean[i].y = s[cnt].y;//根据具体输入,选择离全局质心最远的点作为第一次的质心 }//数据处理完成,开始算法 K_Means();for(int i = 1; i <= k; ++i) {printf("-------------------------------------------------------\n");printf("(%.2lf, %.2lf)\n",mean[i].x, mean[i].y);for(int j = 0; j < V[i].size(); ++j) {int cnt = V[i][j];printf("(%.2lf, %.2lf)\n", s[cnt].x, s[cnt].y);}}return 0;}

数据挖掘原理与算法 K-Means算法相关推荐

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  3. 09_分类算法--k近邻算法(KNN)、案例、欧氏距离、k-近邻算法API、KNeighborsClassifier、及其里面的案例(网络资料+学习资料整理笔记)

    1 分类算法–k近邻算法(KNN) 定义:如果一个样本在特征空间中**k个最相似(即特征空间中最邻近)**的样本中的大多数属于某一个类别,则该样本也属于这个类别,则该样本也属于这个类别. k-近邻算法 ...

  4. 第4章 最基础的分类算法-k近邻算法

    思想极度简单 应用数学知识少 效果好(缺点?) 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 distances = [] for x_train in X_train ...

  5. python人工智能——机器学习——分类算法-k近邻算法

    分类算法-k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. 来源:KNN算法最早是由Cover和Hart提 ...

  6. 惰性学习算法 ---- k 近邻算法

    惰性学习算法 ---- k 近邻算法 KNN 是惰性学习算法的典型例子.说它具有 惰性 不是因为它看起来简单,而是因为它仅仅对训练数据集有记忆功能,而不会从训练集中通过学习得到一个函数. 这种基于记忆 ...

  7. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

  8. 【机器学习】原理与实现k近邻算法

    文章目录 系列文章目录 前言 一.k近邻算法是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了 ...

  9. kNN算法(k近邻算法,k Nearest Neighbor)

    主要内容: 1.认识kNN算法 2.kNN算法原理 3.应用举例 4.kNN改进方法 1.认识knn算法 "看一个人怎么样,看他身边的朋友什么样就知道了",kNN算法即寻找最近的K ...

  10. 机器学习算法---K近邻算法

    K近邻算法 1. K-近邻算法简介 1.1 什么是K-近邻算法 根据你的"邻居"来推断出你的类别 K Nearest Neighbor算法⼜叫KNN算法,这个算法是机器学习⾥⾯⼀个 ...

最新文章

  1. linux ip add address,linux – ip地址范围参数
  2. 第三章:Java_面向对象编程(一)
  3. ROS系统玩转自主移动机器人(3)-- 开源机器人结构介绍
  4. 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处
  5. 仓库货位卡标识牌_【干货】仓库布局,你想学啊,我教你啊!
  6. emlog-博客定制版lu1.3主题模板
  7. Car-like Robot运动参数分析
  8. 最详细的JavaScript教程(高级篇),深入学习JavaScript
  9. 项目进度管理:活动之间的四种依赖关系
  10. Android音频系统
  11. Total Commander的SFTP插件安装
  12. 快门光圈感光度口诀_光圈快门感光度口诀是什么?
  13. mysql.servers表存在_ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist
  14. Ocata Neutron代码分析(六)——APIRouter的初始化(1)加载core plugin和service plugin...
  15. 关于python的文献综述_关于毕业论文文献综述,史上最全总结.doc
  16. JAVA面试大全(持续更新中...)
  17. 自动阅读是骗人的吗?新手一定要看,避免入坑
  18. 飞链云版图-文字生成图片
  19. html做网页计算bmi,体重指数如何计算?肥胖程度计算公式 BMI 法
  20. 【计算机视觉 | ViT-G】谷歌大脑提出 ViT-G:缩放视觉 Transformer,高达 90.45% 准确率

热门文章

  1. Android 获得view的宽和高
  2. Empire C:Basic 4
  3. hibernate、mysql、中文字符问题
  4. 表单相关标签之textarea,select
  5. 在控制台中操作MYSQL数据库步骤以及一些小问题
  6. hdu 5079 Square
  7. [Z]四种浏览器对 clientHeight、offsetHeight、scrollHeight、clientWidth、offsetWidth 和 scrollWidth 的解释...
  8. asp.net上传到服务器 步骤:
  9. Flex及AIR开发资源集合
  10. [转]2020年4月github上最热门项目-java