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的中间过程!!!
不建议直接使用。读者可以在此代码基础上自行修改~~~~~