聚類演算法的實現 k means(一)

2021-09-06 07:07:39 字數 3011 閱讀 8105

說來這個聚類演算法的實現是資料探勘課程的第三次作業了,前兩次的作業都是利用別人的軟體,很少去自己實現乙個演算法,第乙個利用sqlserver2008的商業智慧型工具實現乙個資料倉儲,資料處理,倉庫模型的建立繞,維度表,事實表的建立,不過考試的時候應該也會有資料倉儲常用模型的建立吧;第二次利用weka的分類和關聯規則演算法跑一些提供的資料,其實那些演算法的引數原理都不曉得;

不過這次的聚類作業竟然是實現乙個自己的演算法針對提供的資料進行聚類,先描述一下提供的要聚類的資料,主要是兩個資料集:

針對資料集1能夠很清楚的看出聚類的意圖,但是資料集2不太明白資料聚類的意圖;針對資料集1可以看出利用歐幾里得距離可以利用k-means演算法進行聚類,但是當第乙個寫完了之後發現效果也不是很好,並且k-means好像不能夠對第二個資料集進行聚類,感覺到要重寫的節奏,但是這裡還是描述一下第乙個資料集進行寫程式的過程;

資料的設定,當初設計程式的時候考慮到了相容性,資料集1和2,就設計了乙個父類,然後資料集1和2分別整合父類,這樣就可以利用多型性了,資料裡可以直接存放父類的指標,這樣就不用考慮存放的具體的是資料集1或者2,但是現在考慮到第二個資料集不能利用k-means;演算法需要修改,但是這個結構可以保留;

繼承的層次如下:

父類為乙個抽象類,定義了幾個子類繼承重寫的幾個抽象方法,如下:

其中方法的作用主要是計算距離;計算準則收斂函式;重新計算均值;畫圖函式;屬性值有顏色值和聚類類別標示;

兩個子類實現以上方法並且存在自己的屬性,主要如下:

這次程式設計過程中程式不是基於dialog的,而是選擇的mfc提供的單文件結構,包含view、doc、frame類,其中讀檔案部分重寫doc類中的onopendocument函式即可;

bool cdataminingexample1doc::onopendocument(lpctstr lpszpathname)

else

}else

}return true;

}

接著是想要在聚類繪製點的過程中重新整理螢幕動態的顯示點的顏色的變化,一開始選擇在介面的執行緒中執行演算法,然後開執行緒invalidate更新介面,但是後來發現這樣每次執行演算法的時候介面就卡著了,後來發現實現這種方式,應該是介面不停的重新整理,然後開闢新的執行緒不斷的更新介面要顯示的內容,即後台的資料,所以這裡應該開闢乙個執行緒執行演算法,然後介面僅僅負責根據資料繪製即可;

然而invalidate繪製會出現一閃一閃的情況,所以這裡要利用雙緩衝,但是這個技術還不知道怎麼用,所以這裡先保留一下;

其實k-means的演算法比較簡單,也正是比較簡單,當時選擇了這個演算法,但是好像第二個資料集的特徵不適合這個演算法,這個演算法適合圓形簇和球形簇的結構的發現;k-means的演算法如下:

void cluster::kmeans(vectorinitkmeans)

}} //計算準則函式

newfunction=m_datapoints[0]->calculatee(m_datapoints,tmpkmeans);

if (fabs(lastfunction-newfunction)>0.00001)

else

//重新計算均值k

tmpkmeans.clear();

tmpkmeans=m_datapoints[0]->calculatemeans(m_datapoints,k);

sleep(2000);

initkmeans=tmpkmeans;

//檢測收斂後跳出迴圈

}}

還有一些體會就是,物件導向的思想運用到程式中就是設計乙個點的類,繪製應該也是這個類自己事情,所以物件應該有繪製自己的方法~其他的一些就是程式中在任何地方可以利用一下一段**獲得view類:

cdataminingexample1view* pmainview=(cdataminingexample1view*)(pmainframe->getactiveview());

view類這裡就是負責顯示的乙個類,其實doc類和view類這裡都可以互相獲得對方的指標的,所以這些知識還要是積累一下;

下面擷取一張聚類的結果圖,效果不怎麼好:

第二個根據點的座標資料集的k-means演算法的聚類如下,結果不如人意,所以k-means演算法對於這個資料集的聚類分析不是很有效,接下來如果實現了更有效的方法會進行更新比較:

修正:第二題目預處理的時候這裡忽略了一些資料的問題,所以第二個資料集聚類出效果不是很好,這裡修正一下,不只是取出白色的點,這裡過濾條件增強,去除稍微淺色的點,這裡暫時設定如下:

if (ncr>235&&ncg>235&&ncb>235)

這樣處理還有乙個好處就是過濾了一部分點,點的數量降低了,演算法的運算速度增加了,能夠比較快的得出結果了,後面的dbscan時間還是相對來說比較慢,不知道索引如何建立,所以鄰域的計算還是要進行所有點的遍歷;  

這樣就可以得到乙個比較清晰的影象了,截圖如下,這裡圖形進行了放大,所以顯示出來有部分沒有顯示:

聚類演算法的實現 k means(一)

說來這個聚類演算法的實現是資料探勘課程的第三次作業了,前兩次的作業都是利用別人的軟體,很少去自己實現乙個演算法,第乙個利用sqlserver2008的商業智慧型工具實現乙個資料倉儲,資料處理,倉庫模型的建立繞,維度表,事實表的建立,不過考試的時候應該也會有資料倉儲常用模型的建立吧 第二次利用weka...

Matlab實現k means聚類演算法

k means是聚類中的乙個十分經典的演算法,具體的思想可以參考andrew ng的講義 the k means clustering algorithm 這裡不再贅述。需要用到matlab中的核心函式kmeans,具體用法可以參考matlab命令 doc kmeans idx kmeans x,k...

MATLAB實現Kmeans聚類演算法

這是我練習的第乙個機器學習的演算法,寫的比較簡單,肯定也有一些小錯誤。也參看了很多其他人的 現在貼出來算是我學習的乙個歷程啦。clear all close all clc data1 normrnd 0,0.25,100,2 生成符合 data2 normrnd 1.25,0.5,100,2 da...