3 @brief Cluster analysis algorithm: Hierarchical Sync (HSyncNet) 4 @details Implementation based on paper @cite artcile::hsyncnet::1. 6 @authors Andrei Novikov (pyclustering@yandex.ru) 8 @copyright GNU Public License 10 @cond GNU_PUBLIC_LICENSE 11 PyClustering is free software: you can redistribute it and/or modify 12 it under the terms of the GNU General Public License as published by 13 the Free Software Foundation, either version 3 of the License, or 14 (at your option) any later version. 16 PyClustering is distributed in the hope that it will be useful, 17 but WITHOUT ANY WARRANTY; without even the implied warranty of 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 GNU General Public License for more details. 21 You should have received a copy of the GNU General Public License 22 along with this program. If not, see <http://www.gnu.org/licenses/>. 28 import pyclustering.core.hsyncnet_wrapper
as wrapper
30 from pyclustering.core.wrapper
import ccore_library
41 @brief Class represents clustering algorithm HSyncNet. HSyncNet is bio-inspired algorithm that is based on oscillatory network that uses modified Kuramoto model. 45 from pyclustering.cluster.hsyncnet import hsyncnet 46 from pyclustering.nnet.sync import sync_visualizer 47 from pyclustering.utils import read_sample, draw_clusters 48 from pyclustering.samples.definitions import SIMPLE_SAMPLES 50 # Read list of points for cluster analysis. 51 sample = read_sample(SIMPLE_SAMPLES.SAMPLE_SIMPLE2) 53 # Create network for allocation of three clusters. 54 network = hsyncnet(sample, 3) 56 # Run cluster analysis and output dynamic of the network. 57 analyser = network.process(0.995, collect_dynamic=True) 59 # Get allocated clusters. 60 clusters = analyser.allocate_clusters(eps=0.1) 62 # Show output dynamic of the network. 63 sync_visualizer.show_output_dynamic(analyser) 65 # Show allocated clusters. 66 draw_clusters(sample, clusters) 70 def __init__(self, source_data, number_clusters, osc_initial_phases=initial_type.RANDOM_GAUSSIAN,
71 initial_neighbors=3, increase_persent=0.15, ccore=True):
73 @brief Costructor of the oscillatory network hSyncNet for cluster analysis. 75 @param[in] source_data (list): Input data set defines structure of the network. 76 @param[in] number_clusters (uint): Number of clusters that should be allocated. 77 @param[in] osc_initial_phases (initial_type): Type of initialization of initial values of phases of oscillators. 78 @param[in] initial_neighbors (uint): Defines initial radius connectivity by calculation average distance to connect specify number of oscillators. 79 @param[in] increase_persent (double): Percent of increasing of radius connectivity on each step (input values in range (0.0; 1.0) correspond to (0%; 100%)). 80 @param[in] ccore (bool): If True than DLL CCORE (C++ solution) will be used for solving. 86 if initial_neighbors >= len(source_data):
87 initial_neighbors = len(source_data) - 1
89 if (ccore
is True)
and ccore_library.workable():
90 self.
__ccore_network_pointer = wrapper.hsyncnet_create_network(source_data, number_clusters, osc_initial_phases, initial_neighbors, increase_persent)
92 super().
__init__(source_data, 0, initial_phases=osc_initial_phases, ccore=
False)
101 @brief Destructor of oscillatory network HSyncNet. 110 def process(self, order = 0.998, solution = solve_type.FAST, collect_dynamic = False):
112 @brief Performs clustering of input data set in line with input parameters. 114 @param[in] order (double): Level of local synchronization between oscillator that defines end of synchronization process, range [0..1]. 115 @param[in] solution (solve_type) Type of solving differential equation. 116 @param[in] collect_dynamic (bool): If True - returns whole history of process synchronization otherwise - only final state (when process of clustering is over). 118 @return (tuple) Returns dynamic of the network as tuple of lists on each iteration (time, oscillator_phases) that depends on collect_dynamic parameter. 129 current_number_clusters = float(
'inf')
134 radius = average_neighbor_distance(self.
_osc_loc, number_neighbors)
137 if increase_step < 1:
146 if collect_dynamic ==
True:
147 if len(dyn_phase) == 0:
152 clusters = analyser.allocate_sync_ensembles(0.05)
155 current_number_clusters = len(clusters)
158 number_neighbors += increase_step
163 if (collect_dynamic !=
True):
169 def __calculate_radius(self, number_neighbors, radius):
171 @brief Calculate new connectivity radius. 173 @param[in] number_neighbors (uint): Average amount of neighbors that should be connected by new radius. 174 @param[in] radius (double): Current connectivity radius. 176 @return New connectivity radius. 180 if (number_neighbors >= len(self.
_osc_loc)):
183 return average_neighbor_distance(self.
_osc_loc, number_neighbors);
186 def __store_dynamic(self, dyn_phase, dyn_time, analyser, begin_state):
188 @brief Store specified state of Sync network to hSync. 190 @param[in] dyn_phase (list): Output dynamic of hSync where state should be stored. 191 @param[in] dyn_time (list): Time points that correspond to output dynamic where new time point should be stored. 192 @param[in] analyser (syncnet_analyser): Sync analyser where Sync states are stored. 193 @param[in] begin_state (bool): If True the first state of Sync network is stored, otherwise the last state is stored. 197 if (begin_state
is True):
199 dyn_phase.append(analyser.output[0]);
202 dyn_phase.append(analyser.output[len(analyser.output) - 1]);
203 dyn_time.append(len(dyn_time));
def simulate_dynamic(self, order=0.998, solution=solve_type.FAST, collect_dynamic=False, step=0.1, int_step=0.01, threshold_changes=0.0000001)
Performs dynamic simulation of the network until stop condition is not reached.
def __del__(self)
Destructor of oscillatory network HSyncNet.
Utils that are used by modules of pyclustering.
Performs analysis of output dynamic of the oscillatory network syncnet to extract information about c...
def __init__(self, source_data, number_clusters, osc_initial_phases=initial_type.RANDOM_GAUSSIAN, initial_neighbors=3, increase_persent=0.15, ccore=True)
Costructor of the oscillatory network hSyncNet for cluster analysis.
Class represents clustering algorithm SyncNet.
def __calculate_radius(self, number_neighbors, radius)
Calculate new connectivity radius.
def __store_dynamic(self, dyn_phase, dyn_time, analyser, begin_state)
Store specified state of Sync network to hSync.
def process(self, order=0.998, solution=solve_type.FAST, collect_dynamic=False)
Performs clustering of input data set in line with input parameters.
Class represents clustering algorithm HSyncNet.
Cluster analysis algorithm: Sync.
Neural and oscillatory network module.
def _create_connections(self, radius)
Create connections between oscillators in line with input radius of connectivity. ...