图聚类

图聚类

基于图的聚类。注意这里的图指的不是图片,而是顶点+边构成的图

将样例用图表示,则通过对图中顶点的划分完成聚类。

图的表示

  • 顶点:样本点
  • 聚类:顶点的划分
  • 边:样本点的相似度

 G(V,E)表示无向图,V=\left \{ v_{1},v_{2},..,{v_{m}} \right \}为点的集合,E为边集,W为权重,W_{ij}表示节点v_{i} 、v_{j} 之间相似度

图的划分

图的划分是将图完全划分成若干个子图,个子图无交集。

 

划分要求

  • 同子图内的点相似度高
  • 不同子图间的点相似度低

损失函数

由划分要求,我们给出损失函数为 ,所以我们的目标就是最小化这个损失函数。

图的划分两种常用方法

  • 谱聚类:连续优化方法。通过分析特征向量与特征值,获得聚类结果。
  • 最小割:离散优化方法。将最小割转化为最大网络求解。

这里着重讲解一下谱聚类算法。

谱聚类

是一种基于图论的聚类方法,通过对样本数据的拉普拉斯矩阵的特征向量进行分析来完成聚类。

算法流程

  1. 计算拉普拉斯矩阵 L 。L=D-W , 其中W为权重矩阵,W为对称矩阵,且主对角线元素都为0;D为度矩阵,Dij,当i!=j时为0,否则Dii为以i为一顶点的所有边权重之和;L为半正定矩阵(即所有特征值非负值),最小特征值为0,且对应的特征向量为单位向量[1,1,...,1]^{T}
  2. 计算L的特征值与特征向量Ve=\left \{ v_{e1},v_{e2},...,v_{en} \right \}   
  3. 取出最小的前k个特征值对应的特征向量构成一个矩阵V=\left \{ v_{1},v_{2},...,v_{k} \right \} ,将矩阵的每一行看做一个样本点并对其进行K-means聚类,得到k个簇

Example

 已知图G:

则:

(1)计算邻接矩阵W与度矩阵D:

相似度矩阵W
i/j123456
10.00.80.60.00.10.0
20.80.00.80.00.00.0
30.60.80.00.20.00.0
40.00.00.20.00.80.7
50.10.00.00.80.00.8
60.00.00.00.70.80.0
度矩阵D
i/j123456
10.50.00.00.00.00.0
20.01.60.00.00.00.0
30.00.01.60.00.00.0
40.00.00.01.70.00.0
50.00.00.00.01.70.0
60.00.00.00.00.0 

计算得拉普拉斯矩阵L:

拉普拉斯矩阵L
i/j123456
11.5-0.8-0.60.0-0.10.0
2-0.81.6-0.80.00.00.0
3-0.6-0.81.6-0.20.00.0
40.00.0-0.21.7-0.8-0.7
5-0.10.00.0-0.81.7-0.8
60.00.00.0-0.7-0.81.5

(2)由计算L的次小特征向量:

    ,次小特征向量为

由聚类按其值的正负分成了两类。

谱聚类用于图像分割

对于给定的一组样例,如果要用谱聚类方法,我们首先要构建一个图G(V,E)出来。这样才能算出W。

对于图像数据,我们定义Wij为像素i与像素j之间的相似度。若图像是a*a的,则W为a^2 * a^2的

 , i,j为 第i和第j节点的像素值

  • 18
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 为了实现Kmeans聚类,需要先将像转换成一维向量,然后运用Kmeans算法对向量进行聚类。常用的聚类特征包括像素的颜色和亮度等。同时,聚类结果可以通过可视化方式呈现,例如将聚类结果绘制成不同颜色的簇中心点,或通过将像划分成不同的分割区域来显示聚类结果。 ### 回答2: kmeans算法是一种常见的聚类算法,在机器学习和数据挖掘领域得到广泛应用。而Python语言由于其简单易学、开放源代码等优点,已经成为数据科学家的首选编程语言。Python语言中的scikit-learn库中提供了KMeans类,可以很方便地实现kmeans算法。 在使用Python实现kmeans聚类时,首先需要读入片,将片数据转化为二维向量。由于KMeans算法需要对输入数据进行标准化处理,因此需要对每个像素点的RGB值进行归一化处理。接下来,使用sklearn.cluster库中的KMeans类可以轻松地进行聚类操作。并且,该库中的KMeans类还支持多种初始化方式,可以通过n_init参数指定,以避免初始点的选择对聚类结果产生影响。 最后,可以通过matplotlib库将聚类后的片可视化输出,方便观察聚类效果。在代码实现上,可以参考以下步骤: ``` # 导入库 import numpy as np from PIL import Image from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 读入片数据 pic = Image.open('image.jpg') pic_data = np.array(pic) # 归一化处理 pic_data_norm = pic_data.astype('float32') / 255.0 # 转化为二维向量 pic_data_norm_reshape = pic_data_norm.reshape((-1, 3)) # 初始化KMeans类 kmeans = KMeans(n_clusters=5, n_init=10, init='random') # 进行聚类操作 kmeans.fit(pic_data_norm_reshape) # 获取聚类结果 pic_data_compressed = kmeans.cluster_centers_[kmeans.labels_] pic_data_compressed_reshape = pic_data_compressed.reshape(pic_data_norm.shape) # 可视化输出 plt.imshow(pic_data_compressed_reshape) plt.show() ``` 在上述代码中,我们将片数据读入,并进行了归一化处理和二维向量转换。然后,使用KMeans类进行聚类操作,并获取聚类结果。最后,利用matplotlib库可以可视化输出聚类后的片。需要注意的是,在实际操作中,需要根据聚类效果进行参数调整,以得到更好的聚类结果。 ### 回答3: KMeans是一种常用的聚类算法。在Python中,我们可以使用sklearn库的KMeans模型来实现聚类。通过将像素数据转化为特征向量,可以将像进行聚类。 首先,我们需要导入所需的库和像。 ```python import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.utils import shuffle from PIL import Image # 载入片 img = Image.open("example.jpg") ``` 然后,我们需要将像像素数据转化为特征向量。 ```python # 转化为numpy数组 img = shuffle(np.array(img, dtype=np.float64), random_state=0) w, h, d = tuple(img.shape) assert d == 3 image_array = np.reshape(img, (w * h, d)) ``` 随后,我们可以使用KMeans模型进行训练和预测。 ```python n_colors = 16 # 训练模型 kmeans = KMeans(n_clusters=n_colors, random_state=0).fit(image_array) # 预测每个像素的标签 labels = kmeans.predict(image_array) ``` 最后,我们可以将聚类结果重新转化为像像素数据,并展示出来。 ```python # 重新组合为像数据 new_image_array = np.zeros_like(image_array) for i, label in enumerate(labels): new_image_array[i] = kmeans.cluster_centers_[label] new_image = np.reshape(new_image_array, (w, h, d)) # 展示聚类结果 plt.imshow(new_image.astype(np.uint8)) plt.show() ``` 通过以上步骤,我们可以将一张像进行16色聚类并展示出来。 总结来说,使用Python实现KMeans聚类需要以下步骤: 1. 导入所需的库和像。 2. 将像像素数据转化为特征向量。 3. 使用KMeans模型进行训练以及对像进行预测。 4. 将预测得到的标签重新转化为像像素数据,并展示聚类结果。 这是一个很简单但非常实用的技术,可以在很多领域中得到应用。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值