基于图切分的K-Means算法——Spectral Clustering
第三十七次写博客,本人数学基础不是太好,如果有幸能得到读者指正,感激不尽,希望能借此机会向大家学习。这一篇对聚类中的一个重要算法——Spectral Clustering(谱聚类)进行讲解,算法原理可以参照原论文(链接附在文章下方)或网上的相关原理详解,本文旨在以代码和实验现象解释算法中的某系细节,不做过多纯原理的赘述。文章归档在基于图的聚类算法中,其他算法见《基于图的聚类算法综述(基于图的聚类算法开篇)》中的链接。
代码实现及对比
下面是我自己实现的Spectral Clustering代码,下面会分别将算法中几个重要的参数对实验结果的实际影响可视化出来,之后对这些问题进行原理性分析,为了对主要原理性问题进行分析,代码中的K-Means直接使用sklearn中的实现,也可以替换为我之前在《K-Means++详解》中实现的K-Means++代码。
代码细节
"""
@author: Ἥλιος
@CSDN:https://blog.csdn.net/qq_40793975/article/details/85984937
"""
print(__doc__)
import time
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import normalize
from sklearn.cluster import k_means
from sklearn.cluster import SpectralClustering
from itertools import cycle, islice
# 加载数据集(从文件中)
def load_Data1(filename):
data_set = []
with open(filename) as fi:
for line in fi.readlines():
cur_line = line.strip().split('\t')
flt_line = []
for i in cur_line:
flt_line.append(float(i))
data_set.append(flt_line)
data_mat = np.mat(data_set) # 转化为矩阵形式
return data_mat
# 加载数据集(自建数据集)
def load_Data2(n_samples=1000):
# 带噪声的圆形数据
noisy_circles = datasets.make_circles(n_samples=n_samples, factor=.5, noise=.05)
# 带噪声的月牙形数据
noisy_moons = datasets.make_moons(n_samples=n_samples, noise=.05)
# 随机分布数据
no_structure = np.random.rand(n_samples, 2), np.ones((1, n_samples), dtype=np.int32).tolist()[0]
# 各向异性分布数据(Anisotropicly distributed data)
random_state = 170
X, y = datasets.make_blobs(n_samples=n_samples, random_state=random_state)
transformation = [[0.6, -0.6], [-0.4, 0.8]]
X_aniso = np.dot(X, transformation)
aniso = (X_aniso, y)
# 不同方差的气泡形数据(blobs with varied variances)
varied = datasets.make_blobs(n_samples=n_samples, cluster_std=[1.0, 2.5, 0.5], random_state=random_state)
# 相同方差的气泡形数据
blobs = datasets.make_blobs(n_samples=n_samples, random_state=8)
# 合并数据集
data_sets = [noisy_circles, noisy_moons, no_structure, aniso, varied, blobs]
cluster_nums = [2, 2, 3, 3, 3, 3]
data_mats = []
for i in range(data_sets.__len__()):
X, y = data_sets[i]
X = StandardScaler(