Python:手写代码之密度峰值聚类算法Clustering by fast search and find of density peaks(DPCA)

import numpy as np
from scipy.spatial.distance import pdist,squareform
from collections import OrderedDict

X = np.array(
    [[1, 2], [5, 6], [2, 8], [3, 5], [9, 4], [7, 8], [4, 8], [8, 25], [5, 14], [20, 8], [5, 2], [6, 7], [20, 1],
     [10, 9], [6, 9], [3, 9], [7, 10], [6, 14], [10, 4], [4, 10]])
y = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])

percent = 20
n = len(X)
distList = pdist(X,metric='euclidean')
distMatrix = squareform(distList)
ro = np.zeros(n)
deta = np.zeros(n)
ms = np.ones(n,dtype=int) * (-1)

distList = sorted(distList)
position = round(len(distList) * percent / 100)
distCut = distList[position]

for i in range(n-1):
    for j in range(1+1,n):
        ro[i] = ro[i] + np.exp(-(distMatrix[i,j]/distCut)**2)
        ro[j] = ro[j] + np.exp(-(distMatrix[i, j] / distCut) ** 2)
ro = [item /max(ro) for item in ro]
ro = np.array(ro)
ord_ro_index = np.flipud(np.argsort(ro))

maxdist = 0
for i in range(n):
    if distMatrix[ord_ro_index[0],i] > maxdist:
        maxdist = distMatrix[ord_ro_index[0],i]
deta[ord_ro_index[0]] = maxdist

for  i in range(1,n):
    min_dist = np.inf
    min_index = -1
    for j in range(0,i):
        if distMatrix[ord_ro_index[i],ord_ro_index[j]] < min_dist:
            min_dist = distMatrix[ord_ro_index[i],ord_ro_index[j]]
            min_index = ord_ro_index[j]
    deta[ord_ro_index[i]] = min_dist
    ms[ord_ro_index[i]] = min_index

gamma = deta * ro
# print("ro:",ro)
# print('deta:',deta)
# print('gamma',gamma)
current = np.array([int(i) for i in range(n)],dtype=int)

def DPCA(ro,ms,gamma,currentSet):

    k = 2
    n = len(currentSet)
    currentSet = np.array(currentSet,dtype=int)
    cluster_block = OrderedDict()
    cluster_index = np.ones(n,dtype=int) * (-1)

    current_Gamma = gamma[currentSet]


    current_Ro = ro[currentSet]

    current_Ms = ms[currentSet]


    Ord_current_Gamma_index = np.flipud(np.argsort(current_Gamma))
    Ord_current_Ro_index = np.flipud(np.argsort(current_Ro))

    for i in range(k):
        cluster_index[Ord_current_Gamma_index[i]] = i
    for i in range(n):
        if cluster_index[Ord_current_Ro_index[i]] == -1:
            cluster_index[Ord_current_Ro_index[i]] = cluster_index[current_Ms[Ord_current_Ro_index[i]]]
    print(cluster_index)
    for i in range(k):
        block = []
        for j in range(n):
            if cluster_index[j] == i:
                block.append(j)
        cluster_block[i] = block
    return cluster_block

ClusterBlock = DPCA(ro,ms,gamma,current)
print(ClusterBlock)
# if __name__ == "__main__":

为了写ALEC,该代码是ALEC的中间过程!!!

不建议直接使用。读者可以在此代码基础上自行修改~~~~~

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeniuHe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值