資源簡介
k-means離群點剔除法:主要運用聚類均值方法剔除數據中的離群點,增強模型預測的精度等,本文為matlab代碼

代碼片段和文件信息
function?[?res?seedrecord]?=?FunK_meanPolyD(datak?)
%?功能:
%?????實現多維空間k-mean聚類算法
%?輸入:
%?????data是d*n規格的矩陣,其中d代表維度,n代表樣本的數量
%?????k?是分成的類別的數量
%?輸出:
%?????res?是行數為(d*k)?列數為record中最大元素值
%?????對于res的行數為d*k的解釋:?
%???????1:d?是對應著第一類別元素
%???????d+1:2*d?是對應著第二類別元素?
%???????????···?
%???????d*(k-1)+1:d*k?是對應著第k類別元素
%
%?????record規格為1*k記錄著每一類別的有效元素的個數
????j?=?1;
????%?下面是預分配一些空間
????%?seedX?和?seedY?中存放著所有種子
????[h?w]?=?size(data);
????cnt?=?w;?%?輸入元素的數量
????cntOfDimension?=?h;?%?d?中存放著本次處理數據的維度
????%seed?中存放種子,每一行代表種子所在的一個維度,每一列是一個種子向量
????seed?=?zeros(cntOfDimensionk);
????oldSeed?=?zeros(cntOfDimensionk);
????%?結果矩陣res中,數據存放規則:
????%???以d行為一個單位,總共k個d行
????%???第一個d行數據存放著第一類元素集合其他同理
????res?=?zeros(k*cntOfDimensioncnt);?
????%?用來記錄resX中每一行有效元素的個數
????record?=?zeros(1k);?
????r?=?0;
????for?i?=?1:k?%?產生k個隨機種子?注意:?隨機種子是來自元素集合
????????t?=?round(rand()*cnt);
????????%?為保證種子不重疊
????????if?i?>?1?&&?t?==?r
????????????i?=?i?-?1;
????????????continue;
????????end
????????seed(:i)?=?data(:t);
????????r?=?t;
????end
????while?1
????????record(:)?=?0;?%?重置為零
????????res(:)?=?0;
????????for?i?=?1:cnt?%?對所有元素遍歷
????????????%?下面是判斷本次元素應該歸為哪一類,這里我們是根據歐幾里得距離進行類別判定
????????????%?k-mean算法認為元素應該歸為距離最近的種子代表的類
????????????distanceMin?=?1;?%?distanceMin?中存放著最短歐幾里得距離的種子點的下標
????????????for?j?=?2:k
????????????????%?計算高維度的歐幾里得距離
????????????????a?=?0;
????????????????b?=?0;
????????????????for?row?=?1:cntOfDimension
????????????????????a?=?a?+?power(data(rowi)-seed(rowdistanceMin)2);
????????????????????b?=?b?+?power(data(rowi)-seed(rowj)2);
????????????????end
????????????????if?a?>?b
????????????????????distanceMin?=?j;
????????????????end
????????????end
????????????%?將本次元素點進行類別歸并
????????????row?=?(distanceMin-1)*cntOfDimension?+?1;
????????????res(row:row+cntOfDimension-1record(distanceMin)+1)?=?data(:i);
????????????record(distanceMin)?=?record(distanceMin)+1;
????????end
????????%record
????????oldSeed?=?seed;
????????%?移動種子至其類中心
????????for?col?=?1:k
????????????if?record(col)?==?0
????????????????continue;
????????????end
????????????%?計算新的種子位置
????????????row?=?(col-1)*cntOfDimension?+?1;
????????????seed(:col)?=?sum(res(row:row+cntOfDimension-1:)2)/record(col);
????????end
????????%?如果本次得到的種子和上次的種子一致,則認為分類完畢。
????????if?mean(seed?==?oldSeed)?==?1
????????????break;
????????end
????end
????maxPos?=?max(record);
????res?=?res(:1:maxPos);
end
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????2914??2018-04-06?11:19??聚類剔除法模板1\FunK_meanPolyD.m
?????文件???????3706??2018-04-17?09:23??聚類剔除法模板1\shili.m
?????目錄??????????0??2018-04-17?10:15??聚類剔除法模板1
-----------?---------??----------?-----??----
?????????????????6620????????????????????3
- 上一篇:噴泉碼之LT碼的編解碼
- 下一篇:蒙特卡洛模擬電動汽車無序充電日負荷
評論
共有 條評論