亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

k均值算法c++語言實現代碼

2020-01-26 15:42:56
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:

//k-mean.h
 #ifndef KMEAN_HEAD
 #define KMEAN_HEAD


 #include <vector>
 #include <map>


 //空間點的定義
 class Node
 {
     public:
        double pos_x;
        double pos_y;
        double pos_z;
      Node()
      {
          pos_x = 0.0;
          pos_y = 0.0;
          pos_z = 0.0;
      }
      Node(double x,double y,double z)
      {
          pos_x = x;
          pos_y = y;
          pos_z = z;
      }
       friend bool operator < (const Node& first,const Node& second)
       {
          //對x軸的比較
          if(first.pos_x < second.pos_x)
          {
             return true;
          }
        else if (first.pos_x > second.pos_x)
          {
              return false;
        }
         //對y軸的比較
      else
      {
        if(first.pos_y < second.pos_y)
             {
                 return true;
             }
             else if (first.pos_y > second.pos_y)
             {
                return false;
             }
             //對z軸的比較
         else
         {
             if(first.pos_z < second.pos_z)
                 {
                     return true;
                 }
                 else if (first.pos_z >=  second.pos_z)
                 {
                    return false;
                 }
             }
      }
       }

       friend bool operator == (const Node& first,const Node& second)
       {
             if(first.pos_x == second.pos_x && first.pos_y == second.pos_y && first.pos_z == second.pos_z)
             {
                 return true;
             }
             else
             {
                 return false;
             }
       }
 };

 class KMean
 {
 private:
     int cluster_num;//生成的簇的數量。
     std:: vector<Node> mean_nodes;//均值點
     std:: vector<Node> data;//所有的數據點
     std:: map <int , std:: vector<Node> > cluster;//簇,key為簇的下標,value為該簇中所有點


     void Init();//初始化函數(首先隨即生成代表點)
     void ClusterProcess();//聚類過程,將空間中的點分到不同的簇中
     Node GetMean(int cluster_index);//生成均值
     void NewCluster();//確定新的簇過程,該函數會調用ClusterProcess函數。
     double Kdistance(Node active,Node other);//判斷兩個點之間的距離

     public:
     KMean(int c_num,std:: vector<Node> node_vector);
     void Star();//啟動k均值算法

 };
#endif // KMEAN_HEAD

復制代碼 代碼如下:

//k-mean.h
 #ifndef KMEAN_HEAD
 #define KMEAN_HEAD


 #include <vector>
 #include <map>


 //空間點的定義
 class Node
 {
     public:
        double pos_x;
        double pos_y;
        double pos_z;
      Node()
      {
          pos_x = 0.0;
          pos_y = 0.0;
          pos_z = 0.0;
      }
      Node(double x,double y,double z)
      {
          pos_x = x;
          pos_y = y;
          pos_z = z;
      }
       friend bool operator < (const Node& first,const Node& second)
       {
          //對x軸的比較
          if(first.pos_x < second.pos_x)
          {
             return true;
          }
        else if (first.pos_x > second.pos_x)
          {
              return false;
        }
         //對y軸的比較
      else
      {
        if(first.pos_y < second.pos_y)
             {
                 return true;
             }
             else if (first.pos_y > second.pos_y)
             {
                return false;
             }
             //對z軸的比較
         else
         {
             if(first.pos_z < second.pos_z)
                 {
                     return true;
                 }
                 else if (first.pos_z >=  second.pos_z)
                 {
                    return false;
                 }
             }
      }
       }

       friend bool operator == (const Node& first,const Node& second)
       {
             if(first.pos_x == second.pos_x && first.pos_y == second.pos_y && first.pos_z == second.pos_z)
             {
                 return true;
             }
             else
             {
                 return false;
             }
       }
 };

 class KMean
 {
 private:
     int cluster_num;//生成的簇的數量。
     std:: vector<Node> mean_nodes;//均值點
     std:: vector<Node> data;//所有的數據點
     std:: map <int , std:: vector<Node> > cluster;//簇,key為簇的下標,value為該簇中所有點


     void Init();//初始化函數(首先隨即生成代表點)
     void ClusterProcess();//聚類過程,將空間中的點分到不同的簇中
     Node GetMean(int cluster_index);//生成均值
     void NewCluster();//確定新的簇過程,該函數會調用ClusterProcess函數。
     double Kdistance(Node active,Node other);//判斷兩個點之間的距離

     public:
     KMean(int c_num,std:: vector<Node> node_vector);
     void Star();//啟動k均值算法

 };
#endif // KMEAN_HEAD

復制代碼 代碼如下:

 #include "k-mean.h"
 #include <vector>
 #include <map>
 #include <ctime>
 #include <cstdlib>
 #include <algorithm>
 #include <cmath>
 #include <iostream>

 using namespace std;
 #define MAXDISTANCE 1000000


 KMean::KMean(int c_num,vector<Node> node_vector)
 {
       cluster_num = c_num;
       data = node_vector;
       srand((int)time(0));
       Init();
 }

 void KMean::Init()//初始化函數(首先隨即生成代表點)
 {
      for(int i =0 ;i<cluster_num;)
      {
            int pos = rand() % data.size();

            bool insert_flag = true;

            //首先判斷選中的點是否是中心點
            for(unsigned int j = 0;j<mean_nodes.size();j++)
            {
                if(mean_nodes[j] ==  data[i])
                {
                    insert_flag = false;
                    break;
                }
            }

            if(insert_flag )
            {
                  mean_nodes.push_back(data[pos]);
                  i++;
            }
      }
      ClusterProcess();//進行聚類過程
 }

  void KMean::ClusterProcess()//聚類過程,將空間中的點分到不同的簇中
  {
             //遍歷空間上所有的點
             for( unsigned int i = 0 ; i < data.size();i++)
             {
                  //忽略中心點
                 bool continue_flag = false;
                 for(unsigned int j = 0;j<mean_nodes.size();j++)
                     {
                         if(mean_nodes[j] ==  data[i])
                         {
                                 continue_flag = true;
                                 break;
                         }
                     }
                 if(continue_flag)
                     {
                         continue;
                     }

                  //下面是聚類過程
                  //首先找到離當前點最近的中心點,并記錄下該中心點所在的簇
                  int min_kdistance = MAXDISTANCE;
                  int index = 0 ;
                  for(unsigned int j = 0;j < mean_nodes.size();j++)
                  {
                      double dis = Kdistance(data[i],mean_nodes[j]);
                      if(dis < min_kdistance)
                      {
                          min_kdistance = dis;
                          index = j;
                      }
                  }

                   //先將當前點從原先的簇中刪除
                   map<int,vector<Node> >::iterator iter;
         //搜索所有的簇
                   for(iter = cluster.begin();iter != cluster.end();++iter)
                   {

                vector<Node>::iterator node_iter;
                      bool jump_flag = false;
                      //對每個簇中的vector進行搜索
                      for(node_iter = iter->second.begin();node_iter != iter->second.end();node_iter++)
                   {
                   if(*node_iter == data[i])
                  {
                             //如果當前點就在更新的簇中,則忽略后面的操作
                       if(index == iter->first)
                            {
                           continue_flag = true;
                             }
                             else
                             {
                           iter->second.erase(node_iter);
                             }
                       jump_flag = true;
                       break;
                    }
                }
                    if(jump_flag)
                    {
                     break;
                    }
                     }

                   if(continue_flag)
               {
                     continue;
                   }
                   //將當前點插入到中心點所對應的簇中
                   //查看中心點是否已經存在map中
                  bool insert_flag = true;
                  for(iter = cluster.begin(); iter != cluster.end();++iter)
                  {

                     if(iter->first == index)
                  {
                          iter->second.push_back(data[i]);
                          insert_flag = false;
                       break;
                   }
                  }
                  //不存在則創建新的元素對象
                  if(insert_flag)
                  {
                      vector<Node> cluster_node_vector;
                      cluster_node_vector.push_back(data[i]);
                      cluster.insert(make_pair(index,cluster_node_vector));
                  }
             }
  }


  double KMean::Kdistance(Node active,Node other)
  {
         return sqrt(pow((active.pos_x-other.pos_x),2) + pow((active.pos_y - other.pos_y),2) + pow((active.pos_z - other.pos_z),2));
  }


  Node KMean::GetMean(int cluster_index)
  {
      //對傳入的參數進行判斷,查看是否越界
      if( cluster_num <0 || unsigned (cluster_index) >= mean_nodes.size() )
      {
          Node new_node;
          new_node.pos_x = -1.0;
          new_node.pos_y = -1.0;
          new_node.pos_z = -1.0;
          return new_node;
      }

      //求出簇中所有點的均值
      Node sum_node;
      Node aver_node;
        for(int j = 0;j < cluster[cluster_index].size();j++)
         {
           sum_node.pos_x += cluster[cluster_index].at(j).pos_x;
            sum_node.pos_y += cluster[cluster_index].at(j).pos_y;
           sum_node.pos_z += cluster[cluster_index].at(j).pos_z;
        }
         aver_node.pos_x = sum_node.pos_x*1.0/ cluster[cluster_index].size();
         aver_node.pos_y = sum_node.pos_y*1.0 / cluster[cluster_index].size();
         aver_node.pos_z = sum_node.pos_z*1.0 / cluster[cluster_index].size();

       //找到與均值最近的點
      double min_dis = MAXDISTANCE;
      Node new_mean_doc;

      for(unsigned int i  = 0;i< cluster[cluster_index].size();i++)
      {
            double dis = Kdistance(aver_node,cluster[cluster_index].at(i));
            if(min_dis > dis)
            {
                  min_dis = dis;
                  new_mean_doc = cluster[cluster_index].at(i);
            }
      }
      return new_mean_doc;
  }


  void KMean::NewCluster()//確定新的中心點
  {
       for (unsigned int i = 0;i < mean_nodes.size();i++)
       {
            Node new_node =GetMean(i);
            mean_nodes[i] = new_node;
       }
       ClusterProcess();
  }


 void KMean::Star()
 {
     for (int i = 0;i<100;i++)
     {
         NewCluster();
         cout << "no:"<< i<<endl;
         for(int j = 0;j < mean_nodes.size();j++)
     {
         cout << cluster[j].size()<<endl;
     }

     }
 }

復制代碼 代碼如下:

#include <iostream>
#include <vector>
#include "k-mean.h"
#include <ctime>
#include <cstdlib>

using namespace std;
int main()
 {
     srand((int) time(0));

     vector<Node> data;

     for(int i =0;i<100;i++)
     {
          Node node;
          node.pos_x = (random() % 17 )*1.2;
          node.pos_y = (random() % 19 )*1.2;
          node.pos_z = (random() % 21) *1.2;
          data.push_back(node);
     }

     KMean kmean(3,data);
     kmean.Star();

     return 0;
 }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内外成人免费激情在线视频网站| 成人黄色av网站| 一区二区在线免费视频| 国产成人91久久精品| 国产日韩欧美中文在线播放| 久久久免费在线观看| 亚洲天堂男人天堂女人天堂| 欧美精品九九久久| 日韩中文字幕在线| 亚洲天堂免费观看| 中文字幕亚洲图片| 日韩在线视频免费观看| 亚洲成人性视频| 国产精品网站大全| 4388成人网| 日韩视频在线免费观看| 亚洲片在线观看| 免费97视频在线精品国自产拍| 亚洲第一区在线观看| 日韩精品欧美激情| 中文字幕亚洲激情| 久久久噜噜噜久久| 久久五月天色综合| 亚洲片在线观看| 伦伦影院午夜日韩欧美限制| 色黄久久久久久| 欧美最猛性xxxxx亚洲精品| 性欧美办公室18xxxxhd| 成人免费网站在线看| www.日韩不卡电影av| 欧美大秀在线观看| 国产精品狼人色视频一区| 久久影视三级福利片| 亚洲影院在线看| 久久精品电影网站| 国产精品久久在线观看| 久久久久久久久久久久久久久久久久av| 欧美巨乳美女视频| 在线视频一区二区| 成人午夜高潮视频| 欧美极度另类性三渗透| 国产欧美久久久久久| 久久天天躁狠狠躁夜夜躁| 欧美日韩国产色视频| 成人免费激情视频| 91精品久久久久久久久久另类| 国产女精品视频网站免费| 亚洲最大福利视频网站| 亚洲一区二区三区毛片| 少妇高潮久久久久久潘金莲| 91大神在线播放精品| 欧美一区二区三区免费观看| 欧美成人精品三级在线观看| 中文字幕欧美精品日韩中文字幕| 日韩中文字幕网址| 日韩的一区二区| 亚洲自拍在线观看| 国产日产欧美a一级在线| 国产伊人精品在线| 欧美精品性视频| 欧美国产日韩中文字幕在线| 高清欧美性猛交xxxx黑人猛交| 一区二区三区高清国产| 国产日本欧美在线观看| 国产日韩视频在线观看| 成人黄色生活片| 欧美野外wwwxxx| 一本色道久久综合狠狠躁篇的优点| 亚洲电影在线观看| 日韩电影免费在线观看| 国产suv精品一区二区三区88区| 国产精品亚洲欧美导航| 欧美极品少妇xxxxⅹ免费视频| 欧美大成色www永久网站婷| 欧美激情喷水视频| 97成人超碰免| 亚洲色无码播放| 国产亚洲精品久久久久久牛牛| 91精品久久久久久久久久| 日本国产欧美一区二区三区| 欧美激情极品视频| 欧美激情综合色| 富二代精品短视频| 91精品久久久久久久久久另类| 亚洲欧美精品一区二区| 国产精品福利无圣光在线一区| 高跟丝袜一区二区三区| 尤物tv国产一区| 日本精品久久久久影院| 国产精品高潮粉嫩av| 黑人巨大精品欧美一区二区| 不卡毛片在线看| 成人激情视频小说免费下载| 欧美性猛交丰臀xxxxx网站| 国产91精品最新在线播放| 久久亚洲精品国产亚洲老地址| 亚洲xxxx在线| 91久久精品久久国产性色也91| 久久久久久久久久久久av| 精品久久久久久久久久国产| 久久亚洲综合国产精品99麻豆精品福利| 国产成人精品免费久久久久| 亚洲japanese制服美女| 亚洲成色777777女色窝| 国产精品久久久久91| 亚洲在线第一页| 91理论片午午论夜理片久久| 国产一区二中文字幕在线看| 91国产视频在线播放| 日韩国产高清视频在线| 欧美在线观看网址综合| 1769国产精品| 美日韩精品视频免费看| 欧美国产日韩一区二区| 日韩亚洲精品电影| 欧美激情久久久久久| 日本欧美在线视频| 亚洲电影免费观看高清完整版在线观看| 亚洲激情久久久| 欧美黑人又粗大| 久久97精品久久久久久久不卡| 国产成人一区二区| 日本精品在线视频| 欧美精品亚州精品| 国产免费观看久久黄| 91国内在线视频| 成人激情春色网| 欧美激情18p| 久久影视电视剧免费网站清宫辞电视| 亚洲人a成www在线影院| 日韩亚洲精品电影| 神马久久桃色视频| 亚洲人成在线播放| 黑人精品xxx一区一二区| 国产欧美日韩精品专区| 丁香五六月婷婷久久激情| 91最新国产视频| 亚洲国产成人在线视频| 精品一区二区三区四区| 欧美精品18videos性欧美| 另类色图亚洲色图| 亚洲黄色在线观看| 国产一区二区三区直播精品电影| 日韩成人小视频| 九九久久国产精品| 亚洲天堂一区二区三区| 亚洲欧美在线看| 亚洲第一网站免费视频| 中文字幕亚洲欧美在线| 在线观看欧美www| 国产精品永久免费视频| 自拍偷拍免费精品| 中文字幕免费精品一区高清| 久国内精品在线| 欧美精品九九久久| 色老头一区二区三区在线观看| 动漫精品一区二区| 黄色成人在线免费| 亚洲欧美在线免费| 成人午夜高潮视频| 亚洲精品白浆高清久久久久久| 中文字幕精品久久| 欧美亚洲伦理www| 最近2019中文免费高清视频观看www99|