資源簡介
根據網上基于劃分法k-means的聚類算法,我做了改進。可以預設一個最大的類數和一個半徑,自動劃分合適的類。最終將隨機三維點云聚類完成后顯示為不同顏色。

代碼片段和文件信息
function?[?resXresY?resZseedXseedYseedZrecord]?=?FunK_mean3D(?xyzkr)
???while?1
????j?=?1;
????seedX?=?zeros(1k);
????seedY?=?zeros(1k);
????seedZ?=?zeros(1k);
????oldSeedX?=?zeros(1k);
????oldSeedY?=?zeros(1k);
????oldSeedZ?=?zeros(1k);
????resX?=?zeros(klength(x));
????resY?=?zeros(klength(y));
????resZ?=?zeros(klength(z));
????record?=?zeros(1k);??%?用來記錄resX中每一行有效元素的個數
????p=2;
??while?1??
????if?p?==?0
??????break;
????end
????for?i?=?1:k?%?產生k個隨機種子?注意:?隨機種子是來自元素集合
????????seedX(i)?=?x(ceil(rand()*length(resX)));
????????seedY(i)?=?y(ceil(rand()*length(resY)));
????????seedZ(i)?=?z(ceil(rand()*length(resZ)));
????end
???for?j=k:-1:2
??????p=0;
??????for?m=j-1:-1:1
??????????power(seedX(m)-seedX(j)2)+power(seedY(m)-seedY(j)2)+power(seedZ(m)-seedZ(j)2)
?????????if?(power(seedX(m)-seedX(j)2)+power(seedY(m)-seedY(j)2)+power(seedZ(m)-seedZ(j)2)) ????????????p=1
????????????break;
?????????end
??????end
???????if?p==1
??????????break;
???????end
???end
??end
????while?1
????????record(:)?=?0;?%?重置為零
????????resX(:)?=?0;
????????resY(:)?=?0;
????????resZ(:)?=?0;
????????for?i?=?1:length(x)?%?對所有元素遍歷
????????????%?下面是判斷本次元素應該歸為哪一類,這里我們是根據歐幾里得距離進行類別判定
????????????%?k-mean算法認為元素應該歸為距離最近的種子代表的類
????????????distanceMin?=?1;
????????????for?j?=?2:k
????????????????if?(power(x(i)-seedX(distanceMin)2)+power(y(i)-seedY(distanceMin)2)+power(z(i)-seedZ(distanceMin)2))...?
????????????????????>?(power(x(i)-seedX(j)2)?+?power(y(i)-seedY(j)2)+power(z(i)-seedZ(j)2))
????????????????????distanceMin?=?j;
????????????????end
????????????end
????????????%?將本次元素點進行類別歸并
????????????resX(distanceMinrecord(distanceMin)?+1)?=?x(i);
????????????resY(distanceMinrecord(distanceMin)?+1)?=?y(i);
????????????resZ(distanceMinrecord(distanceMin)?+1)?=?z(i);
????????????record(distanceMin)?=?record(distanceMin)?+?1;
????????end
????????oldSeedX?=?seedX;
????????oldSeedY?=?seedY;
????????oldSeedZ?=?seedZ;
????????%?移動種子至其類中心
????????record;
????????for?i?=?1:k
????????????if?record(i)?==?0
????????????????continue;
????????????end
????????????seedX(i)?=?sum(resX(i:))/record(i);
????????????seedY(i)?=?sum(resY(i:))/record(i);
????????????seedZ(i)?=?sum(resZ(i:))/record(i);
????????end
????maxPos?=?max(record);
????resX?=?resX(:1:maxPos);
????resY?=?resY(:1:maxPos);
????resZ?=?resZ(:1:maxPos);
??????%?如果本次得到的種子和上次的種子一致,則認為分類完畢。
????????if?mean([seedX?==?oldSeedX&seedY?==?oldSeedY&seedZ?==?oldSeedZ])?==?1?
????????????%?這句話所想表達的意思就是?if?seedX?==?oldSeedX?&&?seedY?==?oldSeedY
????????????break;
????????end
????end????????
record(?find(record==0))=[];
?????if?length(record)?==?k
????????break;
?????end
??end
end
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????1439??2018-07-23?11:08??Unti
?????文件????????2915??2018-07-23?11:07??FunK_mean3D.m
- 上一篇:牛頓迭代法matlab程序
- 下一篇:蒙特卡洛算法計算電力系統可靠度matlab程序
評論
共有 條評論