k-means聚類的python實作。 k-means 是一種無監督學習技術,嘗試將相似的資料點分組到使用者指定數量的群組中。下面的範例顯示了使用 k-means++ 質心初始化演算法的 Iris 資料集的聚類進展。
k-means 嘗試從一組 N 個 d 維實值向量中辨識使用者指定的 k(<N) 個簇。該演算法透過嘗試最小化從簇中心到簇成員的距離平方和來進行。規範演算法分三個階段進行:
此演算法的輸出是每個資料點的聚類分配以及最終的「失真」等級。此演算法不會產生可證明的最佳解決方案,且初始聚類中心可能會導致演算法陷入明顯次優的局部最佳解決方案(請參閱結果部分中的基本 2d 範例)。
許多研究集中在:
k-means++ 不是像上面的步驟 1 那樣初始化隨機質心,而是機率性地分散初始質心以避免初始配置不佳,演算法為:
該技術優先考慮不靠近另一個初始質心的數據點,並使用讓人想起遺傳演算法中經常使用的輪盤賭(或適應度比例)選擇的選擇策略。
K-Means 在資料探勘的十大演算法中進行了描述;
K-Means 在《資訊理論、推理和學習演算法》中進行了概述,摘錄如下;
卡內基美隆大學的安德魯摩爾教授在這裡有一些很好的筆記;
Edureka 範例,使用犯罪數據
K-Means++,完整論文請點此處
K-Means聚類演算法高效初始化方法的比較研究
SciPy 有 k-means 實作。這項工作的目標是建立一個純 python 實現以用於學習目的,並幫助其他人學習 k-means 演算法。僅具有最少 Python 經驗的有興趣的讀者將能夠閱讀並單步執行此程式碼,而不會增加 SciPy 等函式庫的複雜性。它絕不是用於生產用途:)
使用 python 解釋器運行程式碼:
python kmeans.py ./resources/<config.cfg>
其中 config.cfg 是純文字設定檔。設定檔的格式是一個包含以下欄位的 python 字典:
{
'data_file' : '\resources\iris.csv',
'data_project_columns' : ['sepal_length','sepal_width','petal_length','petal_width','class'],
'k' : 3,
'cluster_atts' : ['sepal_length','sepal_width','petal_length','petal_width'],
'init_cluster_func' : 'kmeans_plus_plus',
'plot_config' :
{'output_file_prefix' : 'iris',
'plots_configs': [
{'plot_atts' : ['sepal_length','sepal_width']},
{'plot_atts' : ['sepal_length','petal_length']},
{'plot_atts' : ['sepal_length','petal_width']},
{'plot_atts' : ['sepal_width','petal_length']},
{'plot_atts' : ['sepal_width','petal_width']},
{'plot_atts' : ['sepal_width','petal_width']}
]
}
}
您必須指定:
Iris 資料集 (iris.config),來自 Lichman, M. (2013)。 UCI 機器學習儲存庫。加州歐文:加州大學資訊與電腦科學學院,是機器學習社群中非常知名的資料集。以下是我的隨機初始聚類的結果:
這些資料是出於調試目的而產生的(請參閱 basic2d.config),並說明了初始隨機簇選擇不當的影響。以下結果展示了初始質心配置,該配置阻止演算法達到明顯的聚類分配。在這種情況下,紅色質心的放置意味著藍色質心捕捉左下象限和右下象限中的所有資料點。
犯罪資料集 (crime.config) 來自 Edureka,此處。