計量地理 聚類

2021-08-20 11:48:59 字數 3168 閱讀 8601

按照計量地理思想,對距離矩陣進行聚類,資料如

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,可以發現類的...