當前位置:首頁 » 操作系統 » 聚類演算法源碼

聚類演算法源碼

發布時間: 2023-01-11 00:51:04

『壹』 python代碼如何應用系統聚類和K-means聚類法進行聚類分析 然後選擇變數,建立適當的模型

-Means聚類演算法
k-means演算法以k為參數,把n個對象分成k個簇,使簇內具有較高的相似度,而簇間的相似度較低。

隨機選擇k個點作為初始的聚類中心。
對於剩下的點,根據其與聚類中心的距離,將其歸入最近的簇。
對每個簇,計算所有點的均值作為新的聚類中心。
重復2,3直到聚類中心不再發生改變

Figure 1

K-means的應用
數據介紹:
現有1999年全國31個省份城鎮居民家庭平均每人全年消費性支出的八大主要變數數據,這八大變數分別是:食品、衣著、家庭設備用品及服務、醫療保健、交通和通訊、娛樂教育文化服務、居住以及雜項商品和服務。利用已有數據,對31個省份進行聚類。

實驗目的:
通過聚類,了解1999年各個省份的消費水平在國內的情況。

技術路線:
sklearn.cluster.Kmeans

數據實例:

『貳』 手寫體數字圖像聚類實驗代碼怎麼寫

本文所有實現代碼均來自《Python機器學習及實戰》

#-*- coding:utf-8 -*-

#分別導入numpy、matplotlib、pandas,用於數學運算、作圖以及數據分析
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

#第一步:使用pandas讀取訓練數據和測試數據
digits_train = pd.read_csv('https://archive.ics.uci.e/ml/machine-learning-databases/optdigits/optdigits.tra',header=None)
digits_test = pd.read_csv('https://archive.ics.uci.e/ml/machine-learning-databases/optdigits/optdigits.tes',header=None)

#第二步:已知原始數據有65個特徵值,前64個是像素特徵,最後一個是每個圖像樣本的數字類別
#從訓練集和測試集上都分離出64維度的像素特徵和1維度的數字目標
X_train = digits_train[np.arange(64)]
y_train = digits_train[64]
X_test = digits_test[np.arange(64)]
y_test = digits_test[64]

#第三步:使用KMeans模型進行訓練並預測
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=10)
kmeans.fit(X_train)
kmeans_y_predict = kmeans.predict(X_test)

#第四步:評估KMeans模型的性能
#如何評估聚類演算法的性能?
#1.Adjusted Rand Index(ARI) 適用於被用來評估的數據本身帶有正確類別的信息,ARI指標和計算Accuracy的方法類似
#2.Silhouette Coefficient(輪廓系數) 適用於被用來評估的數據沒有所屬類別 同時兼顧了凝聚度和分散度,取值范圍[-1,1],值越大,聚類效果越好
from sklearn.metrics import adjusted_rand_score
print 'The ARI value of KMeans is',adjusted_rand_score(y_test,kmeans_y_predict)
#到此為止,手寫體數字圖像聚類--kmeans學習結束,下面單獨討論輪廓系數評價kmeans的性能

#****************************************************************************************************
#拓展學習:利用輪廓系數評價不同累簇數量(k值)的K-means聚類實例
from sklearn.metrics import silhouette_score
#分割出3*2=6個子圖,並且在1號子圖作圖 subplot(nrows, ncols, plot_number)
plt.subplot(3,2,1)
#初始化原始數據點
x1 = np.array([1,2,3,1,5,6,5,5,6,7,8,9,7,9])
x2 = np.array([1,3,2,2,8,6,7,6,7,1,2,1,1,3])
# a = [1,2,3] b = [4,5,6] zipped = zip(a,b) 輸出為元組的列表[(1, 4), (2, 5), (3, 6)]
X = np.array(zip(x1,x2)).reshape(len(x1),2)
#X輸出為:array([[1, 1],[2, 3],[3, 2],[1, 2],...,[9, 3]])
#在1號子圖作出原始數據點陣的分布
plt.xlim([0,10])
plt.ylim([0,10])
plt.title('Instances')
plt.scatter(x1,x2)
colors = ['b','g','r','c','m','y','k','b']
markers = ['o','s','D','v','^','p','*','+']
clusters = [2,3,4,5,8]
subplot_counter = 1
sc_scores = []

for t in clusters:
subplot_counter += 1
plt.subplot(3,2,subplot_counter)
kmeans_model = KMeans(n_clusters=t).fit(X)
for i,l in enumerate(kmeans_model.labels_):
plt.plot(x1[i],x2[i],color=colors[l],marker=markers[l],ls='None')
plt.xlim([0,10])
plt.ylim([0,10])
sc_score = silhouette_score(X,kmeans_model.labels_,metric='euclidean')
sc_scores.append(sc_score)
#繪制輪廓系數與不同類簇數量的直觀顯示圖
plt.title('K=%s,silhouette coefficient = %0.03f'%(t,sc_score))
#繪制輪廓系數與不同類簇數量的關系曲線

plt.figure() #此處必須空一行,表示在for循環結束之後執行!!!
plt.plot(clusters,sc_scores,'*-') #繪制折線圖時的樣子
plt.xlabel('Number of Clusters')
plt.ylabel('Silhouette Coefficient Score')
plt.show()
#****************************************************************************************************

#總結:
#k-means聚類模型所採用的迭代式演算法,直觀易懂並且非常實用,但是有兩大缺陷
#1.容易收斂到局部最優解,受隨機初始聚類中心影響,可多執行幾次k-means來挑選性能最佳的結果
#2.需要預先設定簇的數量,

『叄』 聚類演算法K-means演算法實現的java源代碼 數據是文件讀入的,跪求!!!!

不會用跟我說,我自己寫的,親測可用

『肆』 用c#實現k-means聚類演算法源代碼

http://www.codeproject.com/KB/recipes/K-Mean_Clustering.aspx

『伍』 誰有 遺傳聚類演算法程序代碼

1、JDK (Java Development Kit)Java開發工具集

從初學者角度來看,採用JDK開發Java程序能夠很快理解程序中各部分代碼之間的關系,有利於理解Java面向對象的設計思想。JDK的另一個顯著特點是隨著Java (J2EE、J2SE以及J2ME)版本的升級而升級。但它的缺點也是非常明顯的就是從事大規模企業級Java應用開發非常困難,不能進行復雜的Java軟體開發,也不利於團體協同開發。

2、Java Workshop

3、NetBeans 與Sun Java Studio 5
4.Borland 的JBuilder jbuilder2006 JBuilder
或者直接用Editplus或者UltraEdit都可以
JBuilder啟動比較費CPU和內存,而且收費,還是全英文界面,不過用熟了還是很好用的。 初學者先用Notepad(寫字板),Ultraedit之類的簡單文本編輯器寫代碼,
用命令行下javac,java編譯執行程序。

明白了這種底層的東西後,再用Jcreator,eclipse啥的
JCreator是一個JAVA集成開發環境(IDE)。它為用戶提供了相當強大的功能,例如項目管理功能,項目模板功能,可個性化設置語法高亮屬性、行數、類瀏覽器、標簽文檔、多功能編繹器,向導功能以及完全可自定義的用戶界面。通過JCreator,你不用激活主文檔而直接編繹或運行你的JAVA程序。JCreator能自動找到包含主函數的文件或包含Applet的Html文件,然後它會運行適當的工具。在JCreator中,你可以通過一個批處理同時編繹多個項目。JCreator的設計接近Windows界面風格,用戶對它的界面比較熟悉。 UltraEdit初級用這一個,這一個比較好的.
你如果想開發比較高級的程序啦..用Jbuilder吧.這一個地球人都知道的. 應該是用什麼來編譯吧?要編寫的話當然是用JAVA語言了,編寫的平台的話就很多了,隨便到網上搜索就可能找到,記事本也可能用來編寫,編譯平台也很多,JDK是少不了,最簡單的就是JDK了,安裝好JDK,然後配置好系統參數JAV_HOME(值為JDK的安裝路徑)JDK_HOME(值為JDK的安裝路徑)還要配置CLASSPATH和PATH,這樣就可以用記事本編寫程序,在命令提示符下編譯了 開始是先學習VB然後用JAVA語言就可以了 UltraEdit 如果不是企業級的開發,選用eclipse是非常不錯的,它是一個開源的軟體可以集成很多插件來幫助你寫java應用程序和客戶端程序。 常見的十四種Java開發工具及其特點 出處:JR
1、JDK (Java Development Kit)Java開發工具集

從初學者角度來看,採用JDK開發Java程序能夠很快理解程序中各部分代碼之間的關系,有利於理解Java面向對象的設計思想。JDK的另一個顯著特點是隨著Java (J2EE、J2SE以及J2ME)版本的升級而升級。但它的缺點也是非常明顯的就是從事大規模企業級Java應用開發非常困難,不能進行復雜的Java軟體開發,也不利於團體協同開發。

2、Java Workshop

3、NetBeans 與Sun Java Studio 5

NetBeans是開放源碼的Java集成開發環境(IDE),適用於各種客戶機和Web應用。Sun Java Studio是Sun公司最新發布的商用全功能Java IDE,支持Solaris、Linux和Windows平台,適於創建和部署2層Java Web應用和n層J2EE應用的企業開發人員使用。

NetBeans是業界第一款支持創新型Java開發的開放源碼IDE。開發人員可以利用業界強大的開發工具來構建桌面、Web或移動應用。同時,通過NetBeans和開放的API的模塊化結構,第三方能夠非常輕松地擴展或集成NetBeans平台。

NetBeans3.5.1主要針對一般Java軟體的開發者,而Java One Studio5則主要針對企業做網路服務等應用的開發者。Sun不久還將推出Project Rave,其目標是幫助企業的開發者進行軟體開發。

NetBeans 3.5.1版本與其他開發工具相比,最大區別在於不僅能夠開發各種台式機上的應用,而且可以用來開發網路服務方面的應用,可以開發基於J2ME的移動設備上的應用等。在NetBeans 3.5.1基礎上,Sun開發出了Java One Studio5,為用戶提供了一個更加先進的企業編程環境。在新的Java One Studio5里有一個應用框架,開發者可以利用這些模塊快速開發自己在網路服務方面的各種應用程序。

4、Borland 的JBuilder

Jbuilder進入了Java集成開發環境的王國,它滿足很多方面的應用,尤其是對於伺服器方以及EJB開發者們來說。下面簡單介紹一下Jbuilder的特點:

1)Jbuilder支持最新的Java技術,包括Applets、JSP/Servlets、JavaBean以及EJB(Enterprise JavaBeans)的應用。

2)用戶可以自動地生成基於後端資料庫表的EJB Java類,Jbuilder同時還簡化了EJB的自動部署功能.此外它還支持CORBA,相應的向導程序有助於用戶全面地管理IDL(分布應用程序所必需的介面定義語言Interface Definition Language)和控制遠程對象。

3)Jbuilder支持各種應用伺服器。Jbuilder與Inprise Application Server緊密集成,同時支持WebLogic Server,支持EJB 1.1和EJB 2.0,可以快速開發J2EE的電子商務應用。

4)Jbuilder能用Servlet和JSP開發和調試動態Web 應用。

5)利用Jbuilder可創建(沒有專有代碼和標記)純Java2應用。由於Jbuilder是用純Java語言編寫的,其代碼不含任何專屬代碼和標記,它支持最新的Java標准。

6)Jbuilder擁有專業化的圖形調試介面,支持遠程調試和多線程調試,調試器支持各種JDK版本,包括J2ME/J2SE/J2EE。

JBuilder環境開發程序方便,它是純的Java 開發環境,適合企業的J2EE開發;缺點是往往一開始人們難於把握整個程序各部分之間的關系,對機器的硬體要求較高,比較吃內存,這時運行速度顯得較慢。

5、Oracle 的JDeveloper

Oracle9i JDeveloper(定為9.0版,最新為10g)為構建具有J2EE功能,XML和Web services的復雜的,多層的 Java應用程序提供了一個完全集成的開發環境。它為運用Oracle9i資料庫和應用伺服器的開發人員提供特殊的功能和增強性能,除此以外,它也有資格成為用於多種用途Java開發的一個強大的工具。

Oracle9i JDeveloper的主要特點如下:

① 具有UML(Unified Modeling Language,一體化建模語言)建模功能。可以將業務對象及e-business應用模型化。

② 配備有高速Java調試器(Debuger)、內置Profiling工具、提高代碼質量的工具「CodeCoach」等。

③ 支持SOAP(Simple Object Access Protocol)「簡單對象訪問協議」、UDDI (Universal Description, Discovery and Integration)「統一描述、發現和集成協議」、WSDL (Web Services Description Language)「WEB服務描述語言」等Web服務標准。

JDeveloper 不僅僅是很好的 Java 編程工具,而且是 Oracle Web 服務的延伸,支 Apache SOAP,以及 9iAS ,可擴充的環境和 XML 和 WSDL 語言緊密相關。Oracle9i Jdeveloper完全利用Java編寫,能夠與以前的 Oracle伺服器軟體以及其他廠商支持J2EE的應用伺服器產品相兼容,而且在設計時著重針對Oracle9i,能夠無縫化跨平台之間的應用開發,提供了業界第一個完整的、集成了J2EE和XML的開發環境,允許開發者快速開發可以通過Web、無線設備及語音界面訪問的Web服務和交易應用,以往只能通過將傳統Java編程技巧與最新模塊化方式結合到一個單一集成的開發環境中之後才能完成J2EE應用開發生命周期管理的事實,從根本上得到改變。缺點就是對於初學者來說,較復雜,也比較難。

6、IBM的Visual Age for Java

Visual Age for Java是一個非常成熟的開發工具,它的特性以於IT開發者和業余的Java編程人員來說都是非常用有用的。它提供對可視化編程的廣泛支持,支持利用CICS連接遺傳大型機應用,支持EJB的開發應用,支持與Websphere的集成開發,方便的bean創建和良好的快速應用開發(RAD)支持和無文件式的文件處理。

IBM為建設Web站點所推出的 WebSphere Studio Advanced Edition及其包含的Visua Age for Java Professional Edition軟體已全面轉向以Java為中心,這樣,Java開發人員對WebSphere全套工具的感覺或許會好了許多。Studio所提供的工具有:Web站點管理、快速開發 JDBC頁向導程序、HTML編輯器和HTML語法檢查等。這確實是個不錯的HTML站點頁面編輯環境。Studio和VisualAge集成度很高,菜單中提供了在兩種軟體包之間快速移動代碼的選項。這就讓使用 Studio的Web頁面設計人員和使用VisualAge的Java程序員可以相互交換文件、協同工作。

Visual Age for Java支持團隊開發,內置的代碼庫可以自動地根據用戶做出改動而修改程序代碼,這樣就可以很方便地將目前代碼和早期版本做出比較。與Visual Age緊密結合的Websphere Studio本身並不提供源代碼和版本管理的支持,它只是包含了一個內置文件鎖定系統, 當編輯項目的時候可以防止其他人對這些文件的錯誤修改,軟體還支持諸如Microsoft Visual SourceSafe這樣的第三方源代碼控制系統。Viual Age for Java完全面向對象的程序設計思想使得開發程序非常快速、高效。你可以不編寫任何代碼就可以設計出一個典型的應用程序框架。Visual Age for Java作為IBM電子商務解決方案其中產品之一,可以無縫地與其他IBM產品,如WebSphere、DB2融合, 迅速完成從設計、開發到部署應用的整個過程。

Visual Age for Java獨特的管理文件方式使其集成外部工具非常困難,你無法讓Visual Age for Java與其他工具一起聯合開發應用。

7、BEA 的 WebLogic Workshop

BEA WebLogic Workshop是一個統一、簡化、可擴展的開發環境,使所有的開發人員都能在 BEA WebLogic Enterprise Platform之上構建基於標準的企業級應用,從而提高了開發部門的生產力水平,加快了價值的實現。

WebLogic Workshop除了提供便捷的Web服務之外,它能夠用於創建更多種類的應用。作為整個 BEA WebLogic Platform的開發環境。不管是創建門戶應用、編寫工作流、還是創建Web應用,Workshop 8.1都可以幫助開發人員更快更好地完成。

WebLogic Workshop的主要特點如下:

① 使 J2EE 開發切實可行,提高開發效率

BEA WebLogic Workshop 使開發人員遠離 J2EE 內在的復雜性,集中精力專注業務邏輯,無須操心單調乏味的基礎結構代碼。這種創新意味著,已被企業驗證的 J2EE 的強大功能,最終被大多數不熟悉 Java 和 J2EE 的應用開發人員所掌握,從而使 IT 部門的工作效率提高一個數量級。

可視化設計器以及直觀的概念,如事件、屬性和控制項等,實現了基於事件的開發。Workshop 簡化的程序設計模型,使開發人員不必掌握復雜的 J2EE API 和面向對象的程序設計原理。所有開發人員,包括 J2EE 專家和具有可視化和過程化語言技能的應用開發人員在內,都可以共同工作在 BEA WebLogic Enterprise Platform 之上。Workshop 的可視化開發環境,創建帶有代碼注釋的標准 Java 文件,用來說明由運行時框架實施的企業級需求。J2EE 和其他高級開發人員,藉助功能強大的代碼編輯功能,可以訪問 Java 源代碼,從而彌補了可視化設計器的不足。

② 構建企業級應用

通過在可伸縮、安全可靠的企業級架構上實施各種應用,BEA WebLogic Workshop 大大降低了開發風險。而且,所有應用的創建都使用標準的 J2EE 組件,既保護了您的技術投資,又保持了最大的靈活性。 BEA WebLogic Workshop 運行框架,是統一整個架構的匯聚層,使單一、簡化的程序設
計模型擴展到所有的 BEA WebLogic Enterprise Platform 應用類型。通過解釋設計時創建的注釋代碼,運行時框架可以實現必要的 J2EE 組件,並且提取出與 J2EE 應用開發有關的所有底層細節。

③ 降低 IT 復雜性

BEA WebLogic Workshop 提供各種 Java 控制項,使得與 IT 資源的連接更輕而易舉。另外,在構建任何 BEA WebLogic Platform 的應用中,Java 控制項不僅可擴展而且完全相同。這種強大、有效的方法能夠:降低 IT 技術的復雜性,優化信息的可用性,推動包含"最佳業務方案"的可重用服務的開發,使開發人員能以更低的成本、更短的時間實現更大的產出。

利用 BEA WebLogic Workshop,任何開發人員都能以最大的生產效率,構建各種Web 服務、Web 應用、門戶和集成項目。 BEA WebLogic Workshop是BEA的產品戰略核心,它幫助客戶接觸和利用面向服務架構(SOA)的強大功能。 BEA Weblogic Workshop 8.1極大簡化了當前實際企業集成環境中企業級應用和服務的構建,並成為全面支持關鍵企業級應用(如非同步、真正松耦合和粗粒度消息傳送等)的自然選擇。它的缺點就是過於復雜,對於初學者來說,理解起來較為困難。

8、WebGain 的Visual Cafe for Java

Visual Cafe 是只能在Symantec公司的Java虛擬機、Netscape公司的Java虛擬機和Microsoft虛擬機上工作的調試器。這對於開發者來講是一個重要的特性,因為用戶開發的Java代碼中的許多軟體bug就可能中會在某種特定的虛擬機上起作用。

在修改後進行編譯基繼續進行調試時,Visual Cafe會自動將文件存檔,使用Visual Cafe創建的原生應用具有許多特點。除了明顯的速度提高之外,Symantec使類庫的二進制方式比正常的JDK小Visual Cafe為所指定的關系自動生成或更新必要的Java代碼。利用 Visual Cafe,用戶可以從一個標准對象資料庫中集合完整的Java應用程序和Applet,而不必再編寫源代碼。Visual Cafe還提供了一個擴充的源代碼開發工具集。

Visual Cafe綜合了Java軟體的可視化源程序開發工具,它允許開發人員在可視化視圖和源視圖之間進行有效地轉換。在可視化視圖中進行的修改立即反映在源代碼中。對源代碼的改變自動更新可視化視圖。

Visual Cafe具有許多源文件方面的特性,如全局檢索和替換。絕大多數Java開發工具的文獻的問題在於簡單地挨個介紹開發工具的每部分組件,但用戶在開應用時還需要一個面向任務的手冊,利用這個手冊你可以不必知道工具每一部分的特定功能就可以開始創建自己的應用。Visual Cafe提供了非常全面的用戶指南,它對最開始的安裝到創建第一個Java應用和Applet都提供了全面的幫助,Visual Cafe將自動生成所指明關系的必要 Java代碼。Visual Cafe可以在Windows 95和Windows NT平台下運行,Symantec公司為Java開發工作提供一個在 Macintosh操作系統下可以運行的RAD工具。Visual Cafe編譯器速度很快,在國際化支持方面比較突出;缺點就是對於初學者來說,較復雜,也比較難。

9、Macromedia的JRUN

Macromedia公司的JRun是一個具有最廣闊適用性的Java引擎,用於開發及實施由Java Servlets和JavaServer Pages編寫的伺服器端 Java應用。JRun是第一個完全支持JSP 1.0 規格書的商業化產品,全球有超過80,000名開發人員使用JRun在他們已有的Web伺服器上添加伺服器端Java的功能。其中Web伺服器包括了Microsoft IIS,Netscape Enterprise Server,Apache 等。

JRun是開發實施伺服器端Java的先進引擎。如果我們希望在我們的Web應用中添加伺服器端Java功能,那麼JRun將成為我們的正確選擇。

JRun目前有3個版本,它是第一個支持Java Server Pages(JSP)規格書1.0的商業化產品。JSP是一種強大的伺服器端技術,它是用於創建復雜Web應用的一整套快速應用開發系統。JRun可以使我們開始開發並測試Java應用。它最多接受5個並發的連接並且包括全部 Java Servlet API,支持JavaServer Pages(JSP),支持所有主要的Web servers和計算機平台。 JRun Pro能夠在生產環境下承受大訪問量的負載,幫助我們實施應用、服務或Web站點(包括內聯網)。JRun Pro 支持無限量並發式連接運行多個Jav
a虛擬機,包括多個並發的Java虛擬機(JVM)。提供一個遠程管理applet以及一個遠程可再分布式的管理applet。JRun Pro Unlimited包括了所有JRun Pro的功能,除次以外,還可以運行無限量的,並發的JVM。

JRun依靠其內置的JRun Web Server可以單獨運行。使用伺服器端Java,用戶可以開發出復雜的商業應用系統。最重要的一點是,由於 servlets的平台獨立性,以及更加簡單的開發、更快速的實施、更經濟的維護成本,它是CGI(Common Gateway Interface) 或Perl scripts的極佳的替代產品。缺點就是對於初學者來說,較復雜,也比較難。

10、JCreator

JCreator 是一個Java程序開發工具,也是一個Java集成開發環境(IDE)。無論你是要開發Java應用程序或者網頁上的Applet元件都難不倒它。在功能上與Sun公司所公布的JDK等文字模式開發工具相較之下來得容易,還允許使用者自訂義操作窗口界面及無限Undo/Redo等功能。

JCreator為用戶提供了相當強大的功能,例如項目管理功能,項目模板功能,可個性化設置語法高亮屬性、行數、類瀏覽器、標簽文檔、多功能編繹器,向導功能以及完全可自定義的用戶界面。通過JCreator,我們不用激活主文檔而直接編繹或運行我們的JAVA程序。

JCreator能自動找到包含主函數的文件或包含Applet的Html文件,然後它會運行適當的工具。在JCreator中,我們可以通過一個批處理同時編繹多個項目。JCreator的設計接近Windows界面風格,用戶對它的界面比較熟悉。其最大特點是與我們機器中所裝的JDK完美結合,是其它任何一款IDE所不能比擬的。它是一種初學者很容易上手的java開發工具,缺點是只能進行簡單的程序開發,不能進行企業J2EE的開發應用。

還有的字太多,貼不上,請到下面的網址去看

http://www.javaresearch.org/article/showarticle.jsp?column=91&thread=24920 <br/><br/><font color=#0556A3>參考文獻:</font>http://www.javaresearch.org/ 我現在也在學.
建議是用JCreate
軟體小且適用於初寫者
JBuild9.0太大,機子的性能也要求很大. 我用日蝕

Eclipse 只要普通的文本編輯器就可以了,因為java文件本身是文本文檔,不過如果開發的話可以使用eclipse,jbuilder,intellJ IDEA,Netbeans,這些幫你把一些常用的工作都做了。 jdev 記事本 +jdk

『陸』 spark機器學習-聚類

spark機器學習-聚類
聚類演算法是一種無監督學習任務,用於將對象分到具有高度相似性的聚類中,聚類演算法的思想簡單的說就是物以類聚的思想,相同性質的點在空間中表現的較為緊密和接近,主要用於數據探索與異常檢測,最常用的一種聚類演算法是K均值(K-means)聚類演算法

演算法原理
kmeans的計算方法如下:
1 選取k個中心點
2 遍歷所有數據,將每個數據劃分到最近的中心點中
3 計算每個聚類的平均值,並作為新的中心點
4 重復2-3,直到這k個中線點不再變化(收斂了),或執行了足夠多的迭代
演算法的時間復雜度上界為O(n*k*t), 其中k為輸入的聚類個數,n為數據量,t為迭代次數。一般t,k,n均可認為是常量,時間和空間復雜度可以簡化為O(n),即線性的
spark ml編碼實踐
可在spark-shell環境下修改參數調試以下代碼,可以用實際的業務數據做測試評估,業務數據一般是多列,可以把維度列用VectorAssembler組裝成向量列做為Kmeans演算法的輸入列,考慮現實的應用場景,比如做異常數據檢測,正常數據分為一類,異常數據分為幾類,分別統計正常數據與異常數據的數據量,求百分比等
<span style="font-size:18px;">import org.apache.spark.ml.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors

val dataset = sqlContext.createDataFrame(Seq(
(1, Vectors.dense(0.0, 0.0, 0.0)),
(2, Vectors.dense(0.1, 0.1, 0.1)),
(3, Vectors.dense(0.2, 0.2, 0.2)),
(4, Vectors.dense(9.0, 9.0, 9.0)),
(5, Vectors.dense(1.1, 1.1, 0.1)),
(6, Vectors.dense(12, 14, 100)),
(6, Vectors.dense(1.1, 0.1, 0.2)),
(6, Vectors.dense(-2, -3, -4)),
(6, Vectors.dense(1.6, 0.6, 0.2))
)).toDF("id", "features")

// Trains a k-means model
val kmeans = new KMeans().setK(3).setMaxIter(20).setFeaturesCol("features").setPredictionCol("prediction")
val model = kmeans.fit(dataset)

// Shows the result
println("Final Centers: ")
model.clusterCenters.foreach(println)
model.clusterCenters.zipWithIndex.foreach(println)

val myres = model.transform(dataset).select("features","prediction")
myres.show()</span>
聚類演算法是一類無監督式機器學習演算法,聚類效果怎麼評估,模型訓練參數怎麼調優,是否能用管道來訓練模型來比較各種不同組合的參數的效果,即網格搜索法(gridsearch),先設置好待測試的參數,MLLib就會自動完成這些參數的不同組合,管道搭建了一條工作流,一次性完成了整個模型的調優,而不是獨立對每個參數進行調優,這個還要再確認一下,查看SPARK-14516好像目前還沒有一個聚類效果通用的自動的度量方法
像這種代碼(不過現在這個代碼有問題):
<span style="font-size:18px;">import org.apache.spark.ml.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.ml.tuning.{ ParamGridBuilder, CrossValidator }
import org.apache.spark.ml.{ Pipeline, PipelineStage }

val dataset = sqlContext.createDataFrame(Seq(
(1, Vectors.dense(0.0, 0.0, 0.0)),
(2, Vectors.dense(0.1, 0.1, 0.1)),
(3, Vectors.dense(0.2, 0.2, 0.2)),
(4, Vectors.dense(9.0, 9.0, 9.0)),
(5, Vectors.dense(1.1, 1.1, 0.1)),
(6, Vectors.dense(12, 14, 100)),
(6, Vectors.dense(1.1, 0.1, 0.2)),
(6, Vectors.dense(-2, -3, -4)),
(6, Vectors.dense(1.6, 0.6, 0.2))
)).toDF("id", "features")

val kmeans = new KMeans().setK(2).setMaxIter(20).setFeaturesCol("features").setPredictionCol("prediction")
//主要問題在這里,沒有可用的評估器與label列設置
val evaluator = new BinaryClassificationEvaluator().setLabelCol("prediction")
val paramGrid = new ParamGridBuilder().addGrid(kmeans.initMode, Array("random")).addGrid(kmeans.k, Array(3, 4)).addGrid(kmeans.maxIter, Array(20, 60)).addGrid(kmeans.seed, Array(1L, 2L)).build()
val steps: Array[PipelineStage] = Array(kmeans)
val pipeline = new Pipeline().setStages(steps)

val cv = new CrossValidator().setEstimator(pipeline).setEvaluator(evaluator).setEstimatorParamMaps(paramGrid).setNumFolds(10)
// Trains a model
val pipelineFittedModel = cv.fit(dataset)</span>

『柒』 聚類(Clustering)

無監督學習(Unsupervised learning) :訓練樣本的標記信息是未知的,目標是為了揭露訓練樣本的內在屬性,結構和信息,為進一步的數據挖掘提供基礎。

· 聚類(clustering)

· 降維(dimensionality rection)

· 異常檢測(outlier detection)

· 推薦系統(recommendation system)

監督學習(supervised learning) :訓練樣本帶有信息標記,利用已有的訓練樣本信息學習數據的規律預測未知的新樣本標簽

· 回歸分析(regression)

· 分類(classification)

聚類 :物以類聚。按照某一個特定的標准(比如距離),把一個數據集分割成不同的類或簇,使得同一個簇內的數據對象的相似性盡可能大,同時不再同一個簇內的數據對象的差異性也盡可能的大。

簇 (或類cluster):子集合。最大化簇內的相似性;最小化簇與簇之間的相似性。

聚類可以作為一個單獨過程,用於尋找數據內在分布結構,也可以作為其他學習任務前驅過程。

聚類和分類的區別:聚類是無監督學習任務,不知道真實的樣本標記,只把相似度搞得樣本聚合在一起;分類是監督學習任務,利用已知的樣本標記訓練學習器預測未知樣本的類別。

聚類相似度度量: 幾何距離

幾種距離度量方法:

· 歐式距離(Euclidean distance):p=2的Minkowski距離, 

· Minkowoski距離:

  · 曼哈頓距離 (Manhattan distance):p=1的Minkowski距離 

· 夾角餘弦 :

` 相關系數 (Pearson correlation coefficient): ,等式右面的x其實是 (x方向的均值),y其實是 (y方向的均值),對於這個表達式很不友好,所以在此說明一下。

聚類類別:

· 基於劃分的聚類(partitioning based clustering):k均值(K-means), Mean shift

· 層次聚類(hierarchical clustering):Agglomerative clustering, BIRCH

· 密度聚類(density based clustering):DBSCAN

· 基於模型的聚類(model based clustering):高斯混合模型(GMM)

· Affinity propagation

 · Spectral clustering

聚類原理:

劃分聚類(partition based clustering):給定包含N個點的數據集,劃分法將構造K個分組;每個分組代表一個聚類,這里每個分組至少包含一個數據點,每個數據點屬於且只屬於一個分組;對於給定的K值,演算法先給出一個初始化的分組方法,然後通過反復迭代的的方法改變分組,知道准則函數收斂。

K均值演算法(Kmeans):

` 給定樣本集:D={ , .... }, k均值演算法針對聚類所得簇:C={ , ... }

` 最小化平方差: ,其中:  簇 的質心,上面的2代表平方,下面的2代表范數2.

具體的K均值演算法過程 :

1. 隨機選擇K個對子女給,每個對象出事地代表了一個簇的質心,即選擇K個初始質心;2. 對剩餘的每個對象,根據其與各簇中心的距離,將它賦給最近的簇;3. 重新計算每個簇的平均值。這個過程不斷重復,直到准則函數(誤差的平方和SSE作為全局的目標函數)收斂,直到質心不發生明顯的變化。

初始質心優化:Kmeans++:

輸入:樣本集D={ , ... } 聚類簇的數量K

選取初始質心的過程:

1. 隨機從m個樣本點中選擇一個樣本作為第一個簇的質心C1;2. 計算所有的樣本點到質心C1的距離: ;3. 從每個點的概率分布  中隨機選取一個點作為第二個質心C2。離C1越遠的點,被選擇的概率越大;4. 重新計算所有樣本點到質心的距離;5. 重復上述過程,直到初始的K個質心被選擇完成  ;按照Kmeans的演算法步驟完成聚類。

輸出:C= { , ... }

K均值演算法(Kmean)的優缺點 :

優點:1. 簡單直觀,抑鬱理解實現;2. 復雜度相對比較低,在K不是很大的情況下,Kmeans的計算時間相對很短;3. Kmean會產生緊密度比較高的簇,反映了簇內樣本圍繞質心的緊密程度的一種演算法。

缺點:1. 很難預測到准確的簇的數目;2. 對初始值設置很敏感(Kmeans++);3. Kmeans主要發現圓形或者球形簇,對不同形狀和密度的簇效果不好;4. Kmeans對雜訊和離群值非常敏感(Kmeadians對雜訊和離群值不敏感)

層次聚類(hierarchical clustering) :

· 主要在不同層次對數據集進行逐層分解,直到滿足某種條件為止;

· 先計算樣本之間的距離。每次將距離最近的點合並到同一個類,然後再計算類與類之間的距離,將距離最近的類合並為一個大類。不停的合並,直到合成一個類。

· 自底向上(bottom-up)和自頂向下(top-down)兩種方法:

top-down: 一開始每個個體都是一個初始的類,然後根據類與類之間的鏈接(linkage)尋找同類,最後形成一個最終的簇

bottom-up:一開始所有樣本都屬於一個大類,然後根據類與類之間的鏈接排除異己,打到聚類的目的。

類與類距離的計算方法 :

最短距離法,最長距離法,中間距離法,平均距離法

最小距離:

最大距離:

平均距離:

單鏈接(single-linkage):根據最小距離演算法

全連接(complete-linkage):根據最大距離演算法

均鏈接(average-linkage):根據平均距離演算法

凝聚層次聚類具體演算法流程:

1. 給定樣本集,決定聚類簇距離度量函數以及聚類簇數目k;2. 將每個樣本看作一類,計算兩兩之間的距離;3. 將距離最小的兩個類合並成一個心類;4.重新計算心類與所有類之間的距離;5. 重復(3-4),知道達到所需要的簇的數目

層次聚類的優缺點:

優點:1.可以得到任意形狀的簇,沒有Kmeans對形狀上的限制;2. 可以發現類之間的層次關系;3.不要制定簇的數目

缺點:1. 通常來說,計算復雜度高(很多merge/split);2.雜訊對層次聚類也會產生很大影響;3.不適合打樣本的聚類

密度聚類(density based clustering) :

  ` 基於密度的 方法的特點是不依賴於距離,而是依賴於密度,從而客服k均值只能發現「球形」聚簇的缺點

· 核心思想:只要一個區域中點的密度大於某個閾值,就把它加到與之相近的聚類中去

· 密度演算法從樣本密度的角度來考察樣本的可連接性,並基於可連接樣本不斷擴展聚類簇以獲得最終的聚類結果

· 對雜訊和離群值的處理有效

· 經典演算法:DBSCAN(density based spatial clutering of applications with noise)

DBSCAN 基於近鄰域(neighborhood)參數( )刻畫樣本分布的 緊密程度的一種演算法。

基本概念:

· 樣本集: D={ }

` 閾值: 

·  :對樣本點 的 包括樣本集中與 距離不大於 的樣本

· 核心對象(core object):如果 的 至少包含MinPts個樣本,那麼 就是一個核心對象 ,

假設MinPts=3,虛線標識為

·密度直達(directly density-reachable):如果 位於 的 中,並且 是和新對象,那麼 由 密度直達

· 密度可達(density-reachable):對 ,如果存在一串樣本點p1,p2.....pn =  ,pn =  ,且 由

` 密度直達,則稱 由 密度可達

· 密度相連:存在樣本集合中一點o,如果 和 均由O密度可達,那麼 和 密度相連

上圖中: 是核心對象,那麼從 出發, 由 密度直達; 由 密度可達; 與 密度相連。

DBSCAN演算法的過程:

1. 首先根據鄰域參數( )確定樣本集合D中所有的核心對象,存在集合P中。加入集合P的條件為 有不少於MinPts的樣本數。

2. 然後從核心對象集合P中任意選取一個核心對象作為初始點,找出其密度可達的樣本生成聚類簇,構成第一個聚類簇C1。

3. 將C1內多有核心對象從P中去除,再從更新後的核心對象集合任意選取下一個種子樣本。

4. 重復(2-3),直到核心對象被全部選擇完,也就是P為空集。

聚類演算法總結:

基於劃分的聚類:K均值(kmeans),kmeans++

層次聚類:Agglomerative聚類

密度聚類:DBSCAN

基於模型 的聚類:高斯混合模型(GMM),這篇博客里咩有介紹

雖然稀里糊塗,但是先跟下來再說吧:

『捌』 聚類(Clustering)

首先我們先來認識一下什麼是聚類任務。
聚類是「無監督學習(unsupervised learning)」中重要的一種。其目標是:通過對無標記的訓練樣本學習,來揭示數據內在的性質以及規律,為進一步的數據分析做基礎。聚類的結果是一個個的簇(Cluster)。所以來說,聚類通常作為其他學習演算法的先導,比如在分類問題中,常常先做聚類,基於聚類的不同簇來進行分類模型的訓練。
我們先來認識一下聚類演算法涉及到兩個基本問題:性能度量 & 距離計算。後面我們再具體講解聚類的經典演算法。

由於聚類演算法是無監督式學習,不依賴於樣本的真實標記。所以聚類並不能像監督學習例如分類那樣,通過計算對錯(精確度/錯誤率)來評價學習器的好壞或者作為學習器的優化目標。一般來說,聚類有兩類性能度量指標:外部指標和內部指標

所謂外部,是將聚類結果與某個參考模型的結果進行比較, 以參考模型的輸出作為標准,來評價聚類的好壞。 假設聚類給出的結果為 λ,參考模型給出的結果是λ*,則我們將樣本進行兩兩配對,定義:

內部指標不依賴任何外部模型,直接對聚類的結果進行評估。直觀來說: 簇內高內聚,簇間低耦合 。定義:

我們從小學的距離都是歐氏距離。這里介紹幾種其他的距離度量方法:

這里對於無需屬性我們用閔可夫斯基距離就不能做,需要用VDM距離進行計算,對於離散屬性的兩個取值a和b,定義:

所以在計算兩個樣本的距離時候,將兩種距離混合在一起進行計算:

原型聚類即「基於原型的聚類(prototype-based clustering)」,原型指的是樣本空間中具有代表性的點(類似於K-Means 選取的中心點)。通常情況下來說,演算法現對原型進行初始化,然後對原型進行迭代更新求解。而不同的初始化形式和不同的求解方法,最終會得到不同的演算法。常見的 K-Means 便是基於簇中心來實現聚類;混合高斯聚類則是基於簇分布來實現聚類。下面我們具體看一下幾種算聚類演算法:

K-Means 聚類的思想十分簡單, 首先隨機指定類中心,根據樣本與類中心的遠近劃分類簇;然後重新計算類中心,迭代直至收斂。 實際上,迭代的過程是通過計算得到的。其根本的優化目標是平方誤差函數E:

其中 u_i 是簇 C_i 的均值向量。直觀上來看,上式刻畫了簇內樣本圍繞簇均值向量(可以理解為簇中心)的緊密程度,E值越小,則簇內樣本的相似度越高。
具體的演算法流程如下:

書上還給出了基於具體西瓜樣本集的計算過程說明。可以看一下。

LVQ 也是基於原型的聚類演算法,與K-Means 不同的是, LVQ使用樣本的真實類標記來輔助聚類 。首先,LVQ根據樣本的類標記,從各類中分別隨機選出一個樣本作為該類簇的原型,從而形成了一個 原型特徵向量組 ,接著從樣本集中隨機挑選一個樣本,計算其與原型向量組中每個向量的距離,並選取距離最小的向量所在的類簇作為該樣本的劃分結果,再與真實類標比較:

可以看到,K-Means 和 LVQ 都是以類中心作為原型指導聚類,而高斯混合聚類則採用 高斯分布 來描述原型。現在假設每個類簇中的樣本都服從一個多維高斯分布,那麼空間中的樣本可以看做由K個多維高斯分布混合而成。
多維高斯的概密為:

密度聚類是基於密度的聚類,它從個樣本分布的角度來考察樣本之間的 可連接性 ,並基於可連接性(密度可達)不斷拓展疆域(類簇)。最著名的就是DBSCAN(Density-Based Spatial Clustering of Applications with Noise),首先我們需要明白以下概念:

層次聚類試圖在不同層次對數據集進行劃分,從而形成屬性的聚類結構。
這里介紹一種「自底向上」結合策略的 AGNES(AGglomerative NESting)演算法。假設有N個待聚類的樣本,AGNES演算法的基本步驟如下:

可以看出其中最關鍵的一步就是 計算兩個類簇的相似度 ,這里有幾種度量方法:
(1)單鏈接(singal-linkage):取類間最小距離

『玖』 遺傳演算法改進的模糊C-均值聚類MATLAB源碼範例

function [BESTX,BESTY,ALLX,ALLY]=GAFCM(K,N,Pm,LB,UB,D,c,m)
%% 此函數實現遺傳演算法,用於模糊C-均值聚類
%% 輸入參數列表
% K 迭代次數
% N 種群規模,要求是偶數
% Pm 變異概率
% LB 決策變數的下界,M×1的向量
% UB 決策變數的上界,M×1的向量
% D 原始樣本數據,n×p的矩陣
% c 分類個數
% m 模糊C均值聚類數學模型中的指數
%% 輸出參數列表
% BESTX K×1細胞結構,每一個元素是M×1向量,記錄每一代的最優個體
% BESTY K×1矩陣,記錄每一代的最優個體的評價函數值
% ALLX K×1細胞結構,每一個元素是M×N矩陣,記錄全部個體
% ALLY K×N矩陣,記錄全部個體的評價函數值
%% 第一步:
M=length(LB);%決策變數的個數
%種群初始化,每一列是一個樣本
farm=zeros(M,N);
for i=1:M
x=unifrnd(LB(i),UB(i),1,N);
farm(i,:)=x;
end
%輸出變數初始化
ALLX=cell(K,1);%細胞結構,每一個元素是M×N矩陣,記錄每一代的個體
ALLY=zeros(K,N);%K×N矩陣,記錄每一代評價函數值
BESTX=cell(K,1);%細胞結構,每一個元素是M×1向量,記錄每一代的最優個體
BESTY=zeros(K,1);%K×1矩陣,記錄每一代的最優個體的評價函數值
k=1;%迭代計數器初始化
%% 第二步:迭代過程
while k<=K
%% 以下是交叉過程
newfarm=zeros(M,2*N);
Ser=randperm(N);%兩兩隨機配對的配對表
A=farm(:,Ser(1));
B=farm(:,Ser(2));
P0=unidrnd(M-1);
a=[A(1:P0,:);B((P0+1):end,:)];%產生子代a
b=[B(1:P0,:);A((P0+1):end,:)];%產生子代b
newfarm(:,2*N-1)=a;%加入子代種群
newfarm(:,2*N)=b;???
for i=1:(N-1)
A=farm(:,Ser(i));
B=farm(:,Ser(i+1));
P0=unidrnd(M-1);
a=[A(1:P0,:);B((P0+1):end,:)];
b=[B(1:P0,:);A((P0+1):end,:)];
newfarm(:,2*i-1)=a;
newfarm(:,2*i)=b;
end
FARM=[farm,newfarm];
%% 選擇復制
SER=randperm(3*N);
FITNESS=zeros(1,3*N);
fitness=zeros(1,N);
for i=1:(3*N)
Beta=FARM(:,i);
FITNESS(i)=FIT(Beta,D,c,m);
end
for i=1:N
f1=FITNESS(SER(3*i-2));
f2=FITNESS(SER(3*i-1));
f3=FITNESS(SER(3*i));
if f1<=f2&&f1<=f3
farm(:,i)=FARM(:,SER(3*i-2));
fitness(:,i)=FITNESS(:,SER(3*i-2));
elseif f2<=f1&&f2<=f3
farm(:,i)=FARM(:,SER(3*i-1));
fitness(:,i)=FITNESS(:,SER(3*i-1));
else
farm(:,i)=FARM(:,SER(3*i));
fitness(:,i)=FITNESS(:,SER(3*i));
end
end
%% 記錄最佳個體和收斂曲線
X=farm;
Y=fitness;
ALLX{k}=X;
ALLY(k,:)=Y;
minY=min(Y);
pos=find(Y==minY);
BESTX{k}=X(:,pos(1));
BESTY(k)=minY;???
%% 變異
for i=1:N
if Pm>rand&&pos(1)~=i
AA=farm(:,i);
BB=GaussMutation(AA,LB,UB);
farm(:,i)=BB;
end
end
disp(k);
k=k+1;
end
%% 繪圖
BESTY2=BESTY;
BESTX2=BESTX;
for k=1:K
TempY=BESTY(1:k);
minTempY=min(TempY);
posY=find(TempY==minTempY);
BESTY2(k)=minTempY;
BESTX2{k}=BESTX{posY(1)};
end
BESTY=BESTY2;
BESTX=BESTX2;
plot(BESTY,'-ko','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',2)
ylabel('函數值')
xlabel('迭代次數')
grid on

忘記寫了,這個是源代碼!謝謝謝謝!

『拾』 k-means聚類演算法的java代碼實現文本聚類

K-MEANS演算法:
k-means 演算法接受輸入量 k ;然後將n個數據對象劃分為 k個聚類以便使得所獲得的聚類滿足:同一聚類中的對象相似度較高;而不同聚類中的對象相似度較小。聚類相似度是利用各聚類中對象的均值所獲得一個「中心對象」(引力中心)來進行計算的。

k-means 演算法的工作過程說明如下:首先從n個數據對象任意選擇 k 個對象作為初始聚類中心;而對於所剩下其它對象,則根據它們與這些聚類中心的相似度(距離),分別將它們分配給與其最相似的(聚類中心所代表的)聚類;然後再計算每個所獲新聚類的聚類中心(該聚類中所有對象的均值);不斷重復這一過程直到標准測度函數開始收斂為止。一般都採用均方差作為標准測度函數. k個聚類具有以下特點:各聚類本身盡可能的緊湊,而各聚類之間盡可能的分開。

具體如下:
輸入:k, data[n];
(1) 選擇k個初始中心點,例如c[0]=data[0],…c[k-1]=data[k-1];
(2) 對於data[0]….data[n], 分別與c[0]…c[n-1]比較,假定與c[i]差值最少,就標記為i;
(3) 對於所有標記為i點,重新計算c[i]=/標記為i的個數;
(4) 重復(2)(3),直到所有c[i]值的變化小於給定閾值。

演算法實現起來應該很容易,就不幫你編寫代碼了。

熱點內容
c語言自考 發布:2025-05-15 07:52:42 瀏覽:500
壓縮的玉 發布:2025-05-15 07:51:22 瀏覽:789
android的控制項 發布:2025-05-15 07:50:36 瀏覽:552
南崗法院伺服器ip地址 發布:2025-05-15 07:46:02 瀏覽:287
實況如何退出賬號安卓 發布:2025-05-15 07:45:56 瀏覽:918
深入編譯器 發布:2025-05-15 07:41:35 瀏覽:878
電信手機號服務密碼怎麼查 發布:2025-05-15 07:40:10 瀏覽:613
python全局變數文件 發布:2025-05-15 07:35:06 瀏覽:954
位元組和存儲位元組 發布:2025-05-15 07:32:10 瀏覽:521
linux應用開發工程師 發布:2025-05-15 07:32:07 瀏覽:261