画的类图如下:

aaarticlea/png;base64,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" alt="" width="782" height="392" />

分为两个类kMeans和pointClass类,kMeans两个成员变量:节点总个数和最终聚类个数。pointClass类包含结构体point。

具体代码如下:

kMeans.h

class kMeans{
protected:
int numOfPoint, numOfCenter;
public:
kMeans();
void k_means();
};

kMeans.cpp

#include "kMeans.h"
#include "point.h"
#include <iostream>
using namespace std; kMeans::kMeans()
{
cout << "分别输入数据点和最终聚类的个数: ";
cin >> numOfPoint >> numOfCenter;
} void kMeans::k_means()
{
pointClass pc(numOfPoint, numOfCenter);
pc.InitCenter(numOfPoint, numOfCenter);
bool b = true;
while (b){
pc.setPoint(numOfPoint, numOfCenter);
if (pc.getError()){
break;
}
pc.getNewCenter(numOfPoint, numOfCenter);
b = pc.IsEnd(numOfCenter);
pc.resetCenterOld(numOfCenter);
}
if (b) {
cout << "聚类操作无法完成!!" << endl;
}else{
pc.ExportData(numOfPoint, numOfCenter);
}
}

point.h

struct point{
double x1, x2, x3, x4;
int flag;
}; class pointClass{
protected:
double errorOld, errorNew;
point *pList, *centerListNew, *centerListOld;
double GetDistance(point point1, point point2);
bool GetExist(int xm, int centerList[], int n);
public:
pointClass (int numOfPoint, int numOfCenter);
void InitCenter (int numOfPoint, int numOfCenter);
void setPoint (int numOfPoint, int numOfCenter);
bool getError();
void getNewCenter (int numOfPoint, int numOfCenter);
bool IsEnd (int numOfCenter);
void ExportData (int numOfPoint, int numOfCenter);
void resetCenterOld (int numOfCenter);
~pointClass ();
};

point.cpp

#include <iostream>
#include <fstream>
#include <cmath>
#include <ctime>
#include "point.h"
using namespace std; double pointClass::GetDistance(point point1, point point2)
{
return pow(pow(point1.x1 - point2.x1, ) + pow(point1.x2 - point2.x2, ) + pow(point1.x3 - point2.x3, ) + pow(point1.x4 - point2.x4, ), 0.5);
} bool pointClass::GetExist(int xm, int CentIndex[], int n)
{
bool b = false;
for (int i = ; i < n; i++){
if (xm == CentIndex[i]){
b = true;
break;
}
}
return b;
} pointClass::pointClass(int numOfPoint, int numOfCenter)
{
pList = new point[numOfPoint];
centerListOld = new point[numOfCenter];
centerListNew = new point[numOfCenter];
ifstream ifile("D:\\IrisData.txt");
if (!ifile.is_open()){
cerr << "file" << endl;
exit();
}
int i = ;
while (i < numOfPoint){
ifile >> pList[i].x1 >> pList[i].x2 >> pList[i].x3 >> pList[i].x4;
pList[i].flag = ;
i++;
}
ifile.close(); errorNew = , errorOld = ;
for (i = ; i < numOfCenter; i++){
centerListOld[i].x1 = ;
centerListOld[i].x2 = ;
centerListOld[i].x3 = ;
centerListOld[i].x4 = ;
centerListNew[i].x1 = ;
centerListNew[i].x2 = ;
centerListNew[i].x3 = ;
centerListNew[i].x4 = ;
centerListNew[i].flag = ;
centerListOld[i].flag = ;
}
} void pointClass::InitCenter(int numOfPoint, int numOfCenter)
{
int xm, i;
int *CenterIndex = new int[numOfCenter];
srand((unsigned)time());
for (i = ; i < numOfCenter; i++){
do {
xm = rand() % numOfPoint;
} while (GetExist(xm, CenterIndex, i));
CenterIndex[i] = xm;
} for (i = ; i < numOfCenter; i++){
centerListOld[i] = pList[CenterIndex[i]];
}
} void pointClass::setPoint(int numOfPoint, int numOfCenter)
{
errorNew = ;
for (int i = ; i < numOfPoint; i++){
int flagi = ;
double distance = GetDistance(pList[i], centerListOld[]);
for (int j = ; j < numOfCenter; j++){
double tmp = GetDistance(pList[i], centerListOld[j]);
if (tmp < distance){
tmp = distance;
flagi = j;
}
}
pList[i].flag = flagi;
errorNew = GetDistance(pList[i], centerListOld[flagi]);
}
} bool pointClass::getError()
{
bool b = false;
if (errorOld != && errorNew >= errorOld){
b = true;
}
return b;
} void pointClass::getNewCenter(int numOfPoint, int numOfCenter)
{
for (int i = ; i < numOfCenter; i++){
centerListNew[i].x1 = ;
centerListNew[i].x2 = ;
centerListNew[i].x3 = ;
centerListNew[i].x4 = ;
centerListNew[i].flag = ;
}
for (int i = ; i < numOfPoint; i++){
centerListNew[pList[i].flag].x1 += pList[i].x1;
centerListNew[pList[i].flag].x2 += pList[i].x2;
centerListNew[pList[i].flag].x3 += pList[i].x3;
centerListNew[pList[i].flag].x4 += pList[i].x4;
centerListNew[pList[i].flag].flag++;
}
for (int i = ; i < numOfCenter; i++){
centerListNew[i].x1 = centerListNew[i].x1 / centerListNew[i].flag;
centerListNew[i].x2 = centerListNew[i].x2 / centerListNew[i].flag;
centerListNew[i].x3 = centerListNew[i].x3 / centerListNew[i].flag;
centerListNew[i].x4 = centerListNew[i].x4 / centerListNew[i].flag;
centerListNew[i].flag = ;
}
} void pointClass::resetCenterOld(int numOfCenter)
{
for (int i = ; i < numOfCenter; i++){
centerListOld[i] = centerListNew[i];
}
} bool pointClass::IsEnd(int numOfCenter)
{
bool b = false;
for (int i = ; i < numOfCenter; i++){
if (GetDistance(centerListNew[i],centerListOld[i]) > ){
b = true;
break;
}
}
return b;
} void pointClass::ExportData(int numOfPoint, int numOfCenter)
{
ofstream ofile("D:\\kMeansResult.txt");
cout << "本次误差是:" << errorNew << endl;
ofile << "本次误差是:" << errorNew << endl;
for (int j = ; j < numOfCenter; j++){
ofile << "第" << j+ <<"类:" << endl;
for (int i = ; i < numOfPoint; i++){
if (pList[i].flag == j){
ofile << pList[i].x1 << " " << pList[i].x2 << " " << pList[i].x3 << " " <<pList[i].x4 << endl;
}
}
}
} pointClass::~pointClass()
{
delete[] pList;
delete[] centerListOld;
delete[] centerListNew;
}

主函数main.cpp

#include <iostream>
#include "kMeans.h"
using namespace std; int main()
{
kMeans km;
km.k_means();
return ;
}

k_means算法C++实现,改为面向对象的更多相关文章

  1. k_means算法的C++实现

    首先画出k_means算法的流程图:

  2. k_means算法+python实现

    文章目录 一.原理 二.算法步骤 三.实例如下: 四.python代码实现: 一.原理 K均值算法使用的聚类准则函数是误差平方和准则,通过反复迭代优化聚类结果,使所有样本到各自所属类别的中心的距离平方 ...

  3. JAVA学习:面向对象编程

    "算法+数据结构=程序"是一句经典名言,这句话很直接的说明了程序的本质:处理数据.产生结果.即便是最简单的HelloWorld程序,我们也可以将字符串"HelloWorl ...

  4. Java数据结构和算法 - 数组

    Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new ...

  5. js面向对象

    什么事面向对象 用对象的思想去写代码,就是面向对象编程 面向对象编程(OOP)的特点 抽象:抓住核心问题 封装:只能通过对象来访问方法 继承:从已有对象上继承出新的对象 多态:多对象的不同形态 对象的 ...

  6. 面向过程 vs 面向对象

    从网上摘录了一些面向过程vs.面向对象的分析,先简单记录如下,稍后会继续整理. 为什么会出现面向对象分析方法? 因为现实世界太复杂多变,面向过程的分析方法无法实现. 面向过程 采用面向过程必须了解整个 ...

  7. JavaScript 面向对象(二) —— 案例篇

    看案例前可以先看看基础篇:JavaScript 面向对象(一) —— 基础篇 案例——面向对象的选项卡:把面向过程的程序一步步改成面向对象的形式,使其能够更加的通用(但是通用的东西,一般会比较臃肿). ...

  8. JAVA的面向对象编程--------课堂笔记

    面向对象主要针对面向过程. 面向过程的基本单元是函数.   什么是对象:EVERYTHING IS OBJECT(万物皆对象)   所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么 ...

  9. 【转】三十分钟学会STL算法

    转载自: http://net.pku.edu.cn/~yhf/UsingSTL.htm 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把 ...

随机推荐

  1. nginx 配置ajax跨域访问php接口

    在nginx.conf里面,找到server项,并在里面添加如下配置 location ~ \.php?($|/) { #try_files $uri =; #handel cosr by mao a ...

  2. go_结构体和方法

    面向对象:go语言仅支持封装不支持继承和多态 所以go语言没有class,只有struct(结构体) 无论地址还是结构本身,一律用 . 来访问成员 go语言编译器可以自动区分是值传递还是指针传递,值传 ...

  3. 39. Combination Sum (Back-Track)

    Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...

  4. PLSQL Developer工具的使用

    1.运行 2.字体大小 导入csv文件. 任何工具都有失败的可能, 这个时候,也失败了. 当然还有另一种可能,文件被人为改过了,括号改过了,就即使使用下面的kettle工具也没用了.这时可以导出文件对 ...

  5. UITextFeild银行卡/身份证/电话号任意分割.

    日常开发中可能有个需求, 1.银行卡每4位添加一个空格  2.电话号:3 4 4 比如(138 8888 8888)3.身份证(411111 20171213 1314) 看了网上许多方法都是输入的时 ...

  6. juniper交换机配置

    1.链接串口配置: minicom -s ```bash Serial port setup  A -    Serial Device      : /dev/ttyS1               ...

  7. [Selenium]刷新页面 Refresh page

    5 different ways to refresh a webpage using Selenium Webdriver   Here are the 5 different ways, usin ...

  8. iOS密码输入框的实现

    [iOS密码输入框的实现] 就是一个UITextField,把属性 UITextField.secureTextEntry设置为Yes即可.此种UI效果为iOS默认效果.

  9. 阿里云服务器ECS按ctrl+alt+delete无法登录

    今天在使用阿里云服务器远程桌面的时候发现怎么也进入不了,远程桌面无法连接,于是想到了在阿里云服务器管理控制台可以使用连接管理终端进行远程桌面连接,下面详细介绍阿里云服务器操作经验. 操作步骤如下 登录 ...

  10. foo是什么?

    在英文程序员社区里,foo bar baz这些词是常用于作为占位符而使用的.要查wiki的话,这项更合适:http://en.wikipedia.org/wiki/Metasyntactic_vari ...