AP聚类算法,昨晚刚跑过,参考的是另一个博主的博文,但有些小地方写错了。这个已经可以直接运行了
import sklearn
import numpy as np
import matplotlib.pyplot as plt
from sklearn import *
#########设置实验数据################
def init_sample():
centers = [[1, 1], [-1, -1], [1, -1]]
# 生成数据
X, label_true = sklearn.datasets.make_blobs(n_samples=150, centers=centers, cluster_std=0.5, random_state=0)
return X, label_true
##########AP聚类####################
class AP(object):
""" AP聚类 """
def __init__(self):
self.Xn = None
self.Xn_len = None
self.R = None
self.A = None
self.simi_matrix = None
self.class_cen = None
def fit(self, data):
self.Xn = data
self.Xn_len = len(data)
# 初始化R、A矩阵
self.R = np.zeros((self.Xn_len, self.Xn_len))
self.A = np.zeros((self.Xn_len, self.Xn_len))
# 计算相似度
self.cal_simi()
# # 输出聚类中心
self.class_cen = self.cal_cls_center()
def cal_simi(self):
"""
计算相似度矩阵
这个数据集的相似度矩阵,最终是二维数组
每个数字与所有数字的相似度列表,即矩阵中的一行
采用负的欧式距离计算相似度
:return:
"""
simi = [[-np.sqrt((m[0] - n[0]) ** 2 + (m[1] - n[1]) ** 2) for n in self.Xn] for m in self.Xn]
# print(simi)
# print(len(simi))
# print(len(simi[1]))
# 设置参考度,即对角线的值,一般为最小值或者中值
# p = np.min(simi) ##11个中心
# p = np.max(simi) ##14个中心
p = np.median(simi) ##5个中心##作用1:计算沿指定轴的中