PowerIterationClustering
class pyspark.ml.clustering.PowerIterationClustering(k=2, maxIter=20, initMode=‘random’, srcCol=‘src’, dstCol=‘dst’, weightCol=None)
幂迭代聚类 (PIC),一种由 Lin 和 Cohen 开发的可扩展图聚类算法。 从摘要中:PIC 在数据的归一化成对相似度矩阵上使用截断幂迭代找到数据集的非常低维嵌入。 这个类还不是构造器/转换器,使用 assignClusters() 方法运行 PowerIterationClustering 算法。
assignClusters(dataset)[source] 运行 PIC 算法并为每个输入顶点返回一个簇分配。
参数数据集——具有 src、dst、权重列的数据集,表示亲和矩阵,即 PIC 论文中的矩阵 A。 假设 src 列值为 i,dst 列值为 j,权重列值为相似度 s,ij,,必须为非负数。 这是一个对称矩阵,因此 s,ij, = s,ji,。 对于任何具有非零相似度的 (i, j),输入中应该有 (i, j, s,ij,) 或 (j, i, s,ji,)。 i = j 的行被忽略,因为我们假设 s,ij, = 0.0。
返回一个数据集,其中包含顶点 id 列和该 id 的相应集群。 它的结构将是: - id:Long - cluster:Int
dstCol = Param(parent=‘undefined’, name=‘dstCol’, doc=‘目标顶点 ID 的输入列的名称。’)
initMode = Param(parent=‘undefined’, name=‘initMode’, doc="初始化算法。这可以是“随机”以使用随机向量作为顶点属性,也可以是“度”以使用归一化的相似性总和 与其他顶点。支持的选项:“随机”和“度”。”)
srcCol = Param(parent=‘undefined’, name=‘srcCol’, doc=‘源顶点 ID 的输入列的名称。’)
weightCol = Param(parent=‘undefined’, name=‘weightCol’, doc=‘weight 列名。如果未设置或为空,我们将所有实例权重视为 1.0。’)
01.创建数据集
from pyspark.sql import SparkSession
spark = SparkSession.builder.config("spark.driver.host","192.168.1.10")\
.config("spark.ui.showConsoleProgress","false").appName("PowerIterationClustering")\
.master("local[*]").getOrCreate()
data = [(1, 0, 0.5),
(2, 0, 0.5), (2, 1, 0.7),
(3, 0, 0.5), (3, 1, 0.7), (3, 2, 0.9),
(4, 0, 0.5), (4, 1, 0.7), (4, 2, 0.9), (4, 3, 1.1),
(5, 0, 0.5), (5, 1, 0.7), (5, 2, 0.9), (5, 3, 1.1), (5, 4, 1.3)]
df = spark.createDataFrame(data).toDF("src", "dst", "weight")
df.show()
df.printSchema()
输出结果:
+---+---+------+
|src|dst|weight|
+---+---+------+
| 1| 0| 0.5|
| 2| 0| 0.5|
| 2| 1| 0.7|
| 3| 0| 0.5|
| 3| 1| 0.7|
| 3| 2| 0.9|
| 4| 0| 0.5|
| 4| 1| 0.7|
| 4| 2| 0.9|
| 4| 3| 1.1|
| 5| 0| 0.5|
| 5| 1| 0.7|
| 5| 2| 0.9|
| 5| 3| 1.1|
| 5| 4| 1.3|
+---+---+------+
root
|-- src: long (nullable = true)
|-- dst: long (nullable = true)
|-- weight: double (nullable = true)
02.构造聚类模型,并转换原有数据查看
from pyspark.ml.clustering import PowerIterationClustering
pic = PowerIterationClustering(k=2, maxIter=40, weightCol="weight")
assignments = pic.assignClusters(df)
assignments.show()
assignments.sort(assignments.id).show(truncate=False)
输出结果:
+---+-------+
| id|cluster|
+---+-------+
| 4| 1|
| 0| 1|
| 1| 1|
| 5| 0|
| 2| 1|
| 3| 1|
+---+-------+
+---+-------+
|id |cluster|
+---+-------+
|0 |1 |
|1 |1 |
|2 |1 |
|3 |1 |
|4 |1 |
|5 |0 |
+---+-------+