按照計量地理思想,對距離矩陣進行聚類,資料如
60.00.3750.4831.7491.5161.972
0.3750.00.7761.5961.3361.743
0.4830.7760.01.9261.6622.154
1.7491.5961.9260.00.5010.693
1.5161.3361.6620.5010.00.589
1.9721.7432.1540.6930.5890.0
第一行為資料個數,下面為距離矩陣,可以下三角(上三角)全為0。
//#include "stdafx.h"
#include "iostream"
using namespace std;
#include "iomanip"
#include "vector"
#include "string"
typedef struct new_node;
typedef struct dist_node;
void bubble(int *sort,int icount)
} }}int _tmain(int argc, _tchar* argv)
fscanf(fp,"%d",&isamplecount);
m_data = new float *[isamplecount];
for(int i = 0;i < isamplecount;i++)
m_data[i] = new float[isamplecount];
for(int i = 0;i < isamplecount;i++)
for(int j = 0;j < isamplecount;j++)
fscanf(fp,"%f",&m_data[i][j]);
// 原始資料輸出到螢幕
/*for(int i = 0;i < isamplecount;i++)*/
// 儲存初始距離矩陣中的元素
vectorvecdist;
for(int i = 0;i < isamplecount;i++)
} int ivecsize = vecdist.size();
// 獲取距離中的最大值
float flmax = vecdist.at(0).fdist;
for(int i = 0;i < isamplecount;i++)
if(flmax < vecdist.at(i).fdist)
flmax = vecdist.at(i).fdist;
cout << "開始聚類過程" << endl;
vectorvecresult;
vectorvecno;
int ino = 0;
while(true)
// 確定最小值
for(int i = 0;i < ivecsize;i++)
// 根據最小值確定相應的聚類單元
// 儲存聚類單元的編號,有可能重複
for(int i = 0;i < ivecsize;i++)
} ino++; // 為下次聚類準備
vecno.push_back(ino);
// 剔除vecnew中重複的類別號碼
int inewcount = vecnew.size();
int *inewdata = new int[2 * inewcount];
vectorvecnewdel; // 剔除重複的點之後結果
if(inewcount > 1)
// 對inewdata進行氣泡排序
bubble(inewdata,inewcount * 2);
for(int i = 0;i < inewcount * 2;i++)
else
}}
else
// 確定要合併的類之後,更新vecdist棧中的內容
// 首先將未參與聚類的樣本取出,然後再計算新類到其餘樣本之間的距離
vectorvectemp;
for(int i = 0;i < vecdist.size();i++)
}if(!blcluster)
} int iunsize = vectemp.size();
int *iuncluster;
vectorvecuncluster;
if(!vectemp.empty())
bubble(iuncluster,iunsize * 2);
for(int i = 0;i < iunsize * 2;i++)
else}}
else
}if(!blcluster)
}if(bladd)
vecuncluster.push_back(isampleno1);}}
blcluster = false;
for(int j = 0;j < vecnewdel.size();j++)
}if(!blcluster)
}if(bladd)
vecuncluster.push_back(isampleno2);
}}// if(!blcluster)
}} // 計算新類到未參與聚類樣本點之間的距離
isamplecount++; // 標記新的樣本點號
for(int i = 0;i < vecuncluster.size();i++)}}
temp.fdist = ftemp;
vectemp.push_back(temp);
} // 清空vecdist,用vectemp中的內容進行替換
vecdist.clear();
for(int i = 0;i < vectemp.size();i++)
vecdist.push_back(vectemp.at(i));
// 將每次聚類的結果儲存
for(int i = 0;i < vecnew.size();i++)
vecresult.push_back(vecnew.at(i));
}// 輸出每次的聚類結果
for(int i = 0;i < vecno.size();i++)
cout << "結束聚類過程" << endl;
system("pause");
return 0;
}
計量地理 PrincipalCA主成分析
輸入如下 91 0.8140 0.21680.3355 0.1860.54170.42370.0378 0.6547 0.814010.4602 0.6613 0.0874 0.7306 0.3136 0.06340.8749 0.2168 0.460210.6603 0.2394 0.5314 0...
聚類之層次聚類 基於劃分的聚類(
目錄 一層次聚類 層次聚類的原理及分類 層次聚類的流程 層次聚類的優缺點 二劃分聚類法k means kmeans演算法的原理 k均值的優缺點及分類 k means與dbscan的區別 k means注意問題 三基於密度的聚類 dbscan的概念 簇的生成原理及過程 根據資料點的密度分為三類點 db...
k means聚類,密度聚類,層次聚類優缺點
k means 優點 1,簡單,易於理解和實現 2,時間複雜度低 缺點 1,需要對均值給出定義,2,需要指定要聚類的數目 3,一些過大的異常值會帶來很大影響 4,演算法對初始選值敏感 5,適合球形聚類 層次聚類 優點 1,距離和規則的相似度容易定義,限制少 2,不需要預先制定聚類數 3,可以發現類的...