pub struct QuantumClusterer {
pub kmeans_config: Option<QuantumKMeansConfig>,
pub dbscan_config: Option<QuantumDBSCANConfig>,
pub spectral_config: Option<QuantumSpectralConfig>,
pub fuzzy_config: Option<QuantumFuzzyCMeansConfig>,
pub gmm_config: Option<QuantumGMMConfig>,
/* private fields */
}Expand description
Main quantum clusterer
Fields§
§kmeans_config: Option<QuantumKMeansConfig>§dbscan_config: Option<QuantumDBSCANConfig>§spectral_config: Option<QuantumSpectralConfig>§fuzzy_config: Option<QuantumFuzzyCMeansConfig>§gmm_config: Option<QuantumGMMConfig>Implementations§
Source§impl QuantumClusterer
impl QuantumClusterer
Sourcepub fn new(config: QuantumClusteringConfig) -> Self
pub fn new(config: QuantumClusteringConfig) -> Self
Create new quantum clusterer
Examples found in repository?
examples/quantum_clustering.rs (lines 328-334)
294fn demo_quantum_fuzzy_cmeans(data: &Array2<f64>) -> Result<()> {
295 println!("\n🎯 Demo 4: Quantum Fuzzy C-means Clustering");
296 println!("-------------------------------------------");
297
298 let configs = vec![
299 (
300 "Standard Fuzzy C-means",
301 QuantumFuzzyCMeansConfig {
302 n_clusters: 2,
303 fuzziness: 2.0,
304 max_iterations: 100,
305 tolerance: 1e-4,
306 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
307 enhancement_level: QuantumEnhancementLevel::Moderate,
308 seed: None,
309 },
310 ),
311 (
312 "High Fuzziness",
313 QuantumFuzzyCMeansConfig {
314 n_clusters: 2,
315 fuzziness: 3.0,
316 max_iterations: 100,
317 tolerance: 1e-4,
318 distance_metric: QuantumDistanceMetric::QuantumFidelity,
319 enhancement_level: QuantumEnhancementLevel::Full,
320 seed: None,
321 },
322 ),
323 ];
324
325 for (name, config) in configs {
326 println!("\n📊 Testing: {name}");
327
328 let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
329 algorithm: ClusteringAlgorithm::QuantumFuzzyCMeans,
330 n_clusters: config.n_clusters,
331 max_iterations: config.max_iterations,
332 tolerance: config.tolerance,
333 ..Default::default()
334 });
335 clusterer.fuzzy_config = Some(config);
336
337 let result = clusterer.fit(data)?;
338
339 println!(" Clusters found: {}", result.n_clusters);
340 println!(" Hard labels: {:?}", result.labels);
341
342 if let Some(probabilities) = &result.probabilities {
343 println!(" Membership probabilities:");
344 for (i, row) in probabilities.rows().into_iter().enumerate() {
345 println!(" Point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
346 }
347 }
348
349 // Test probabilistic prediction
350 let new_data = array![[1.5, 1.5], [4.5, 4.5]];
351 let probabilities = clusterer.predict_proba(&new_data)?;
352 println!(" New data probabilities:");
353 for (i, row) in probabilities.rows().into_iter().enumerate() {
354 println!(" New point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
355 }
356 }
357
358 Ok(())
359}
360
361/// Demo quantum Gaussian mixture models
362fn demo_quantum_gmm(data: &Array2<f64>) -> Result<()> {
363 println!("\n🎯 Demo 5: Quantum Gaussian Mixture Models");
364 println!("------------------------------------------");
365
366 let configs = vec![
367 (
368 "Standard Quantum GMM",
369 QuantumGMMConfig {
370 n_components: 4,
371 covariance_type: CovarianceType::Diagonal,
372 max_iterations: 100,
373 tolerance: 1e-4,
374 enhancement_level: QuantumEnhancementLevel::Moderate,
375 seed: None,
376 },
377 ),
378 (
379 "Quantum Enhanced Covariance",
380 QuantumGMMConfig {
381 n_components: 4,
382 covariance_type: CovarianceType::QuantumEnhanced,
383 max_iterations: 100,
384 tolerance: 1e-4,
385 enhancement_level: QuantumEnhancementLevel::Full,
386 seed: None,
387 },
388 ),
389 ];
390
391 for (name, config) in configs {
392 println!("\n📊 Testing: {name}");
393
394 let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
395 algorithm: ClusteringAlgorithm::QuantumGMM,
396 n_clusters: config.n_components,
397 max_iterations: config.max_iterations,
398 tolerance: config.tolerance,
399 ..Default::default()
400 });
401 clusterer.gmm_config = Some(config);
402
403 let result = clusterer.fit(data)?;
404
405 println!(" Components found: {}", result.n_clusters);
406 println!(" Hard labels: {:?}", result.labels);
407
408 if let Some(centers) = &result.cluster_centers {
409 println!(" Component means:");
410 for (i, center) in centers.rows().into_iter().enumerate() {
411 println!(" Component {}: [{:.3}, {:.3}]", i, center[0], center[1]);
412 }
413 }
414
415 if let Some(probabilities) = &result.probabilities {
416 println!(" Posterior probabilities (first 4 points):");
417 for i in 0..4.min(probabilities.nrows()) {
418 let row = probabilities.row(i);
419 let prob_str: Vec<String> = row.iter().map(|&p| format!("{p:.3}")).collect();
420 println!(" Point {}: [{}]", i, prob_str.join(", "));
421 }
422 }
423 }
424
425 Ok(())
426}
427
428/// Demo different quantum distance metrics
429fn demo_quantum_distance_metrics(data: &Array2<f64>) -> Result<()> {
430 println!("\n🎯 Demo 6: Quantum Distance Metrics Comparison");
431 println!("----------------------------------------------");
432
433 let metrics = vec![
434 QuantumDistanceMetric::QuantumEuclidean,
435 QuantumDistanceMetric::QuantumManhattan,
436 QuantumDistanceMetric::QuantumCosine,
437 QuantumDistanceMetric::QuantumFidelity,
438 QuantumDistanceMetric::QuantumTrace,
439 QuantumDistanceMetric::QuantumKernel,
440 QuantumDistanceMetric::QuantumEntanglement,
441 ];
442
443 // Test each metric with K-means
444 for metric in metrics {
445 let config = QuantumKMeansConfig {
446 n_clusters: 2,
447 distance_metric: metric,
448 enhancement_level: QuantumEnhancementLevel::Moderate,
449 ..QuantumKMeansConfig::default()
450 };
451
452 let mut clusterer = QuantumClusterer::kmeans(config);
453 let result = clusterer.fit(data)?;
454
455 println!("\n📊 Distance Metric: {metric:?}");
456 println!(" Inertia: {:.4}", result.inertia.unwrap_or(0.0));
457 println!(" Labels: {:?}", result.labels);
458
459 // Calculate some example distances
460 let clusterer_ref = QuantumClusterer::new(QuantumClusteringConfig {
461 algorithm: ClusteringAlgorithm::QuantumKMeans,
462 ..Default::default()
463 });
464 let point1 = data.row(0).to_owned();
465 let point2 = data.row(1).to_owned();
466 let distance = clusterer_ref.compute_quantum_distance(&point1, &point2, metric)?;
467 println!(" Sample distance (points 0-1): {distance:.4}");
468 }
469
470 Ok(())
471}Sourcepub fn kmeans(config: QuantumKMeansConfig) -> Self
pub fn kmeans(config: QuantumKMeansConfig) -> Self
Create quantum K-means clusterer
Examples found in repository?
examples/quantum_clustering_simple.rs (line 73)
57fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
58 println!("\n🎯 Demo 1: Quantum K-means Clustering");
59 println!("-------------------------------------");
60
61 // Create K-means configuration
62 let config = QuantumKMeansConfig {
63 n_clusters: 2,
64 max_iterations: 100,
65 tolerance: 1e-4,
66 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
67 quantum_reps: 2,
68 enhancement_level: QuantumEnhancementLevel::Moderate,
69 seed: Some(42),
70 };
71
72 // Create and train clusterer
73 let mut clusterer = QuantumClusterer::kmeans(config);
74 let result = clusterer.fit(data)?;
75
76 println!(" Clusters found: {}", result.n_clusters);
77 println!(" Labels: {:?}", result.labels);
78 println!(" Inertia: {:.4}", result.inertia.unwrap_or(0.0));
79
80 // Show cluster centers if available
81 if let Some(centers) = &result.cluster_centers {
82 println!(" Cluster centers:");
83 for (i, center) in centers.rows().into_iter().enumerate() {
84 println!(" Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
85 }
86 }
87
88 // Test prediction on new data
89 let new_data = array![[1.5, 1.5], [4.5, 4.5]];
90 let predictions = clusterer.predict(&new_data)?;
91 println!(" Predictions for new data: {predictions:?}");
92
93 Ok(())
94}More examples
examples/quantum_clustering.rs (line 168)
127fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
128 println!("🎯 Demo 1: Quantum K-means Clustering");
129 println!("-------------------------------------");
130
131 // Create different K-means configurations
132 let configs = vec![
133 (
134 "Standard Quantum K-means",
135 QuantumKMeansConfig {
136 n_clusters: 2,
137 max_iterations: 100,
138 tolerance: 1e-4,
139 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
140 quantum_reps: 2,
141 enhancement_level: QuantumEnhancementLevel::Moderate,
142 seed: Some(42),
143 },
144 ),
145 (
146 "Quantum Fidelity Distance",
147 QuantumKMeansConfig {
148 n_clusters: 2,
149 distance_metric: QuantumDistanceMetric::QuantumFidelity,
150 enhancement_level: QuantumEnhancementLevel::Full,
151 ..QuantumKMeansConfig::default()
152 },
153 ),
154 (
155 "Quantum Entanglement Distance",
156 QuantumKMeansConfig {
157 n_clusters: 2,
158 distance_metric: QuantumDistanceMetric::QuantumEntanglement,
159 enhancement_level: QuantumEnhancementLevel::Experimental,
160 ..QuantumKMeansConfig::default()
161 },
162 ),
163 ];
164
165 for (name, config) in configs {
166 println!("\n📊 Testing: {name}");
167
168 let mut clusterer = QuantumClusterer::kmeans(config);
169 let result = clusterer.fit(data)?;
170
171 println!(" Clusters found: {}", result.n_clusters);
172 println!(" Labels: {:?}", result.labels);
173 println!(" Inertia: {:.4}", result.inertia.unwrap_or(0.0));
174
175 if let Some(centers) = &result.cluster_centers {
176 println!(" Cluster centers:");
177 for (i, center) in centers.rows().into_iter().enumerate() {
178 println!(" Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
179 }
180 }
181
182 // Test prediction on new data
183 let new_data = array![[1.5, 1.5], [4.5, 4.5]];
184 let predictions = clusterer.predict(&new_data)?;
185 println!(" Predictions for new data: {predictions:?}");
186 }
187
188 Ok(())
189}
190
191/// Demo quantum DBSCAN clustering
192fn demo_quantum_dbscan(data: &Array2<f64>) -> Result<()> {
193 println!("\n🎯 Demo 2: Quantum DBSCAN Clustering");
194 println!("------------------------------------");
195
196 let configs = vec![
197 (
198 "Standard Quantum DBSCAN",
199 QuantumDBSCANConfig {
200 eps: 1.0,
201 min_samples: 3,
202 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
203 enhancement_level: QuantumEnhancementLevel::Moderate,
204 seed: None,
205 },
206 ),
207 (
208 "Quantum Kernel Distance",
209 QuantumDBSCANConfig {
210 eps: 0.8,
211 min_samples: 2,
212 distance_metric: QuantumDistanceMetric::QuantumKernel,
213 enhancement_level: QuantumEnhancementLevel::Full,
214 seed: None,
215 },
216 ),
217 ];
218
219 for (name, config) in configs {
220 println!("\n📊 Testing: {name}");
221
222 let mut clusterer = QuantumClusterer::dbscan(config);
223 let result = clusterer.fit(data)?;
224
225 println!(" Clusters found: {}", result.n_clusters);
226 println!(" Labels: {:?}", result.labels);
227
228 // Count noise points (-1 labels)
229 let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count(); // Using MAX as noise label
230 println!(" Noise points: {noise_count}");
231
232 // Count points in each cluster
233 let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
234 for &label in &unique_labels {
235 if label != usize::MAX {
236 let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
237 println!(" Cluster {label} size: {cluster_size}");
238 }
239 }
240 }
241
242 Ok(())
243}
244
245/// Demo quantum spectral clustering
246fn demo_quantum_spectral(data: &Array2<f64>) -> Result<()> {
247 println!("\n🎯 Demo 3: Quantum Spectral Clustering");
248 println!("--------------------------------------");
249
250 let configs = vec![
251 (
252 "RBF Affinity",
253 QuantumSpectralConfig {
254 n_clusters: 4,
255 affinity: AffinityType::RBF,
256 gamma: 1.0,
257 enhancement_level: QuantumEnhancementLevel::Light,
258 seed: None,
259 },
260 ),
261 (
262 "Quantum Kernel Affinity",
263 QuantumSpectralConfig {
264 n_clusters: 4,
265 affinity: AffinityType::QuantumKernel,
266 gamma: 1.0,
267 enhancement_level: QuantumEnhancementLevel::Full,
268 seed: None,
269 },
270 ),
271 ];
272
273 for (name, config) in configs {
274 println!("\n📊 Testing: {name}");
275
276 let mut clusterer = QuantumClusterer::spectral(config);
277 let result = clusterer.fit(data)?;
278
279 println!(" Clusters found: {}", result.n_clusters);
280 println!(" Labels: {:?}", result.labels);
281
282 // Analyze cluster distribution
283 let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
284 for &label in &unique_labels {
285 let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
286 println!(" Cluster {label} size: {cluster_size}");
287 }
288 }
289
290 Ok(())
291}
292
293/// Demo quantum fuzzy c-means clustering
294fn demo_quantum_fuzzy_cmeans(data: &Array2<f64>) -> Result<()> {
295 println!("\n🎯 Demo 4: Quantum Fuzzy C-means Clustering");
296 println!("-------------------------------------------");
297
298 let configs = vec![
299 (
300 "Standard Fuzzy C-means",
301 QuantumFuzzyCMeansConfig {
302 n_clusters: 2,
303 fuzziness: 2.0,
304 max_iterations: 100,
305 tolerance: 1e-4,
306 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
307 enhancement_level: QuantumEnhancementLevel::Moderate,
308 seed: None,
309 },
310 ),
311 (
312 "High Fuzziness",
313 QuantumFuzzyCMeansConfig {
314 n_clusters: 2,
315 fuzziness: 3.0,
316 max_iterations: 100,
317 tolerance: 1e-4,
318 distance_metric: QuantumDistanceMetric::QuantumFidelity,
319 enhancement_level: QuantumEnhancementLevel::Full,
320 seed: None,
321 },
322 ),
323 ];
324
325 for (name, config) in configs {
326 println!("\n📊 Testing: {name}");
327
328 let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
329 algorithm: ClusteringAlgorithm::QuantumFuzzyCMeans,
330 n_clusters: config.n_clusters,
331 max_iterations: config.max_iterations,
332 tolerance: config.tolerance,
333 ..Default::default()
334 });
335 clusterer.fuzzy_config = Some(config);
336
337 let result = clusterer.fit(data)?;
338
339 println!(" Clusters found: {}", result.n_clusters);
340 println!(" Hard labels: {:?}", result.labels);
341
342 if let Some(probabilities) = &result.probabilities {
343 println!(" Membership probabilities:");
344 for (i, row) in probabilities.rows().into_iter().enumerate() {
345 println!(" Point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
346 }
347 }
348
349 // Test probabilistic prediction
350 let new_data = array![[1.5, 1.5], [4.5, 4.5]];
351 let probabilities = clusterer.predict_proba(&new_data)?;
352 println!(" New data probabilities:");
353 for (i, row) in probabilities.rows().into_iter().enumerate() {
354 println!(" New point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
355 }
356 }
357
358 Ok(())
359}
360
361/// Demo quantum Gaussian mixture models
362fn demo_quantum_gmm(data: &Array2<f64>) -> Result<()> {
363 println!("\n🎯 Demo 5: Quantum Gaussian Mixture Models");
364 println!("------------------------------------------");
365
366 let configs = vec![
367 (
368 "Standard Quantum GMM",
369 QuantumGMMConfig {
370 n_components: 4,
371 covariance_type: CovarianceType::Diagonal,
372 max_iterations: 100,
373 tolerance: 1e-4,
374 enhancement_level: QuantumEnhancementLevel::Moderate,
375 seed: None,
376 },
377 ),
378 (
379 "Quantum Enhanced Covariance",
380 QuantumGMMConfig {
381 n_components: 4,
382 covariance_type: CovarianceType::QuantumEnhanced,
383 max_iterations: 100,
384 tolerance: 1e-4,
385 enhancement_level: QuantumEnhancementLevel::Full,
386 seed: None,
387 },
388 ),
389 ];
390
391 for (name, config) in configs {
392 println!("\n📊 Testing: {name}");
393
394 let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
395 algorithm: ClusteringAlgorithm::QuantumGMM,
396 n_clusters: config.n_components,
397 max_iterations: config.max_iterations,
398 tolerance: config.tolerance,
399 ..Default::default()
400 });
401 clusterer.gmm_config = Some(config);
402
403 let result = clusterer.fit(data)?;
404
405 println!(" Components found: {}", result.n_clusters);
406 println!(" Hard labels: {:?}", result.labels);
407
408 if let Some(centers) = &result.cluster_centers {
409 println!(" Component means:");
410 for (i, center) in centers.rows().into_iter().enumerate() {
411 println!(" Component {}: [{:.3}, {:.3}]", i, center[0], center[1]);
412 }
413 }
414
415 if let Some(probabilities) = &result.probabilities {
416 println!(" Posterior probabilities (first 4 points):");
417 for i in 0..4.min(probabilities.nrows()) {
418 let row = probabilities.row(i);
419 let prob_str: Vec<String> = row.iter().map(|&p| format!("{p:.3}")).collect();
420 println!(" Point {}: [{}]", i, prob_str.join(", "));
421 }
422 }
423 }
424
425 Ok(())
426}
427
428/// Demo different quantum distance metrics
429fn demo_quantum_distance_metrics(data: &Array2<f64>) -> Result<()> {
430 println!("\n🎯 Demo 6: Quantum Distance Metrics Comparison");
431 println!("----------------------------------------------");
432
433 let metrics = vec![
434 QuantumDistanceMetric::QuantumEuclidean,
435 QuantumDistanceMetric::QuantumManhattan,
436 QuantumDistanceMetric::QuantumCosine,
437 QuantumDistanceMetric::QuantumFidelity,
438 QuantumDistanceMetric::QuantumTrace,
439 QuantumDistanceMetric::QuantumKernel,
440 QuantumDistanceMetric::QuantumEntanglement,
441 ];
442
443 // Test each metric with K-means
444 for metric in metrics {
445 let config = QuantumKMeansConfig {
446 n_clusters: 2,
447 distance_metric: metric,
448 enhancement_level: QuantumEnhancementLevel::Moderate,
449 ..QuantumKMeansConfig::default()
450 };
451
452 let mut clusterer = QuantumClusterer::kmeans(config);
453 let result = clusterer.fit(data)?;
454
455 println!("\n📊 Distance Metric: {metric:?}");
456 println!(" Inertia: {:.4}", result.inertia.unwrap_or(0.0));
457 println!(" Labels: {:?}", result.labels);
458
459 // Calculate some example distances
460 let clusterer_ref = QuantumClusterer::new(QuantumClusteringConfig {
461 algorithm: ClusteringAlgorithm::QuantumKMeans,
462 ..Default::default()
463 });
464 let point1 = data.row(0).to_owned();
465 let point2 = data.row(1).to_owned();
466 let distance = clusterer_ref.compute_quantum_distance(&point1, &point2, metric)?;
467 println!(" Sample distance (points 0-1): {distance:.4}");
468 }
469
470 Ok(())
471}Sourcepub fn dbscan(config: QuantumDBSCANConfig) -> Self
pub fn dbscan(config: QuantumDBSCANConfig) -> Self
Create quantum DBSCAN clusterer
Examples found in repository?
examples/quantum_clustering_simple.rs (line 111)
97fn demo_quantum_dbscan(data: &Array2<f64>) -> Result<()> {
98 println!("\n🎯 Demo 2: Quantum DBSCAN Clustering");
99 println!("------------------------------------");
100
101 // Create DBSCAN configuration
102 let config = QuantumDBSCANConfig {
103 eps: 1.0,
104 min_samples: 3,
105 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
106 enhancement_level: QuantumEnhancementLevel::Moderate,
107 seed: None,
108 };
109
110 // Create and train clusterer
111 let mut clusterer = QuantumClusterer::dbscan(config);
112 let result = clusterer.fit(data)?;
113
114 println!(" Clusters found: {}", result.n_clusters);
115 println!(" Labels: {:?}", result.labels);
116
117 // Count noise points (using MAX as noise label)
118 let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count();
119 println!(" Noise points: {noise_count}");
120
121 Ok(())
122}More examples
examples/quantum_clustering.rs (line 222)
192fn demo_quantum_dbscan(data: &Array2<f64>) -> Result<()> {
193 println!("\n🎯 Demo 2: Quantum DBSCAN Clustering");
194 println!("------------------------------------");
195
196 let configs = vec![
197 (
198 "Standard Quantum DBSCAN",
199 QuantumDBSCANConfig {
200 eps: 1.0,
201 min_samples: 3,
202 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
203 enhancement_level: QuantumEnhancementLevel::Moderate,
204 seed: None,
205 },
206 ),
207 (
208 "Quantum Kernel Distance",
209 QuantumDBSCANConfig {
210 eps: 0.8,
211 min_samples: 2,
212 distance_metric: QuantumDistanceMetric::QuantumKernel,
213 enhancement_level: QuantumEnhancementLevel::Full,
214 seed: None,
215 },
216 ),
217 ];
218
219 for (name, config) in configs {
220 println!("\n📊 Testing: {name}");
221
222 let mut clusterer = QuantumClusterer::dbscan(config);
223 let result = clusterer.fit(data)?;
224
225 println!(" Clusters found: {}", result.n_clusters);
226 println!(" Labels: {:?}", result.labels);
227
228 // Count noise points (-1 labels)
229 let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count(); // Using MAX as noise label
230 println!(" Noise points: {noise_count}");
231
232 // Count points in each cluster
233 let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
234 for &label in &unique_labels {
235 if label != usize::MAX {
236 let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
237 println!(" Cluster {label} size: {cluster_size}");
238 }
239 }
240 }
241
242 Ok(())
243}Sourcepub fn spectral(config: QuantumSpectralConfig) -> Self
pub fn spectral(config: QuantumSpectralConfig) -> Self
Create quantum spectral clusterer
Examples found in repository?
examples/quantum_clustering_simple.rs (line 139)
125fn demo_quantum_spectral(data: &Array2<f64>) -> Result<()> {
126 println!("\n🎯 Demo 3: Quantum Spectral Clustering");
127 println!("--------------------------------------");
128
129 // Create spectral configuration
130 let config = QuantumSpectralConfig {
131 n_clusters: 2,
132 affinity: AffinityType::RBF,
133 gamma: 1.0,
134 enhancement_level: QuantumEnhancementLevel::Light,
135 seed: None,
136 };
137
138 // Create and train clusterer
139 let mut clusterer = QuantumClusterer::spectral(config);
140 let result = clusterer.fit(data)?;
141
142 println!(" Clusters found: {}", result.n_clusters);
143 println!(" Labels: {:?}", result.labels);
144
145 Ok(())
146}More examples
examples/quantum_clustering.rs (line 276)
246fn demo_quantum_spectral(data: &Array2<f64>) -> Result<()> {
247 println!("\n🎯 Demo 3: Quantum Spectral Clustering");
248 println!("--------------------------------------");
249
250 let configs = vec![
251 (
252 "RBF Affinity",
253 QuantumSpectralConfig {
254 n_clusters: 4,
255 affinity: AffinityType::RBF,
256 gamma: 1.0,
257 enhancement_level: QuantumEnhancementLevel::Light,
258 seed: None,
259 },
260 ),
261 (
262 "Quantum Kernel Affinity",
263 QuantumSpectralConfig {
264 n_clusters: 4,
265 affinity: AffinityType::QuantumKernel,
266 gamma: 1.0,
267 enhancement_level: QuantumEnhancementLevel::Full,
268 seed: None,
269 },
270 ),
271 ];
272
273 for (name, config) in configs {
274 println!("\n📊 Testing: {name}");
275
276 let mut clusterer = QuantumClusterer::spectral(config);
277 let result = clusterer.fit(data)?;
278
279 println!(" Clusters found: {}", result.n_clusters);
280 println!(" Labels: {:?}", result.labels);
281
282 // Analyze cluster distribution
283 let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
284 for &label in &unique_labels {
285 let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
286 println!(" Cluster {label} size: {cluster_size}");
287 }
288 }
289
290 Ok(())
291}Sourcepub fn fit(&mut self, data: &Array2<f64>) -> Result<ClusteringResult>
pub fn fit(&mut self, data: &Array2<f64>) -> Result<ClusteringResult>
Fit the clustering model
Examples found in repository?
examples/quantum_clustering_simple.rs (line 74)
57fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
58 println!("\n🎯 Demo 1: Quantum K-means Clustering");
59 println!("-------------------------------------");
60
61 // Create K-means configuration
62 let config = QuantumKMeansConfig {
63 n_clusters: 2,
64 max_iterations: 100,
65 tolerance: 1e-4,
66 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
67 quantum_reps: 2,
68 enhancement_level: QuantumEnhancementLevel::Moderate,
69 seed: Some(42),
70 };
71
72 // Create and train clusterer
73 let mut clusterer = QuantumClusterer::kmeans(config);
74 let result = clusterer.fit(data)?;
75
76 println!(" Clusters found: {}", result.n_clusters);
77 println!(" Labels: {:?}", result.labels);
78 println!(" Inertia: {:.4}", result.inertia.unwrap_or(0.0));
79
80 // Show cluster centers if available
81 if let Some(centers) = &result.cluster_centers {
82 println!(" Cluster centers:");
83 for (i, center) in centers.rows().into_iter().enumerate() {
84 println!(" Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
85 }
86 }
87
88 // Test prediction on new data
89 let new_data = array![[1.5, 1.5], [4.5, 4.5]];
90 let predictions = clusterer.predict(&new_data)?;
91 println!(" Predictions for new data: {predictions:?}");
92
93 Ok(())
94}
95
96/// Demo quantum DBSCAN clustering
97fn demo_quantum_dbscan(data: &Array2<f64>) -> Result<()> {
98 println!("\n🎯 Demo 2: Quantum DBSCAN Clustering");
99 println!("------------------------------------");
100
101 // Create DBSCAN configuration
102 let config = QuantumDBSCANConfig {
103 eps: 1.0,
104 min_samples: 3,
105 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
106 enhancement_level: QuantumEnhancementLevel::Moderate,
107 seed: None,
108 };
109
110 // Create and train clusterer
111 let mut clusterer = QuantumClusterer::dbscan(config);
112 let result = clusterer.fit(data)?;
113
114 println!(" Clusters found: {}", result.n_clusters);
115 println!(" Labels: {:?}", result.labels);
116
117 // Count noise points (using MAX as noise label)
118 let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count();
119 println!(" Noise points: {noise_count}");
120
121 Ok(())
122}
123
124/// Demo quantum spectral clustering
125fn demo_quantum_spectral(data: &Array2<f64>) -> Result<()> {
126 println!("\n🎯 Demo 3: Quantum Spectral Clustering");
127 println!("--------------------------------------");
128
129 // Create spectral configuration
130 let config = QuantumSpectralConfig {
131 n_clusters: 2,
132 affinity: AffinityType::RBF,
133 gamma: 1.0,
134 enhancement_level: QuantumEnhancementLevel::Light,
135 seed: None,
136 };
137
138 // Create and train clusterer
139 let mut clusterer = QuantumClusterer::spectral(config);
140 let result = clusterer.fit(data)?;
141
142 println!(" Clusters found: {}", result.n_clusters);
143 println!(" Labels: {:?}", result.labels);
144
145 Ok(())
146}More examples
examples/quantum_clustering.rs (line 169)
127fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
128 println!("🎯 Demo 1: Quantum K-means Clustering");
129 println!("-------------------------------------");
130
131 // Create different K-means configurations
132 let configs = vec![
133 (
134 "Standard Quantum K-means",
135 QuantumKMeansConfig {
136 n_clusters: 2,
137 max_iterations: 100,
138 tolerance: 1e-4,
139 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
140 quantum_reps: 2,
141 enhancement_level: QuantumEnhancementLevel::Moderate,
142 seed: Some(42),
143 },
144 ),
145 (
146 "Quantum Fidelity Distance",
147 QuantumKMeansConfig {
148 n_clusters: 2,
149 distance_metric: QuantumDistanceMetric::QuantumFidelity,
150 enhancement_level: QuantumEnhancementLevel::Full,
151 ..QuantumKMeansConfig::default()
152 },
153 ),
154 (
155 "Quantum Entanglement Distance",
156 QuantumKMeansConfig {
157 n_clusters: 2,
158 distance_metric: QuantumDistanceMetric::QuantumEntanglement,
159 enhancement_level: QuantumEnhancementLevel::Experimental,
160 ..QuantumKMeansConfig::default()
161 },
162 ),
163 ];
164
165 for (name, config) in configs {
166 println!("\n📊 Testing: {name}");
167
168 let mut clusterer = QuantumClusterer::kmeans(config);
169 let result = clusterer.fit(data)?;
170
171 println!(" Clusters found: {}", result.n_clusters);
172 println!(" Labels: {:?}", result.labels);
173 println!(" Inertia: {:.4}", result.inertia.unwrap_or(0.0));
174
175 if let Some(centers) = &result.cluster_centers {
176 println!(" Cluster centers:");
177 for (i, center) in centers.rows().into_iter().enumerate() {
178 println!(" Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
179 }
180 }
181
182 // Test prediction on new data
183 let new_data = array![[1.5, 1.5], [4.5, 4.5]];
184 let predictions = clusterer.predict(&new_data)?;
185 println!(" Predictions for new data: {predictions:?}");
186 }
187
188 Ok(())
189}
190
191/// Demo quantum DBSCAN clustering
192fn demo_quantum_dbscan(data: &Array2<f64>) -> Result<()> {
193 println!("\n🎯 Demo 2: Quantum DBSCAN Clustering");
194 println!("------------------------------------");
195
196 let configs = vec![
197 (
198 "Standard Quantum DBSCAN",
199 QuantumDBSCANConfig {
200 eps: 1.0,
201 min_samples: 3,
202 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
203 enhancement_level: QuantumEnhancementLevel::Moderate,
204 seed: None,
205 },
206 ),
207 (
208 "Quantum Kernel Distance",
209 QuantumDBSCANConfig {
210 eps: 0.8,
211 min_samples: 2,
212 distance_metric: QuantumDistanceMetric::QuantumKernel,
213 enhancement_level: QuantumEnhancementLevel::Full,
214 seed: None,
215 },
216 ),
217 ];
218
219 for (name, config) in configs {
220 println!("\n📊 Testing: {name}");
221
222 let mut clusterer = QuantumClusterer::dbscan(config);
223 let result = clusterer.fit(data)?;
224
225 println!(" Clusters found: {}", result.n_clusters);
226 println!(" Labels: {:?}", result.labels);
227
228 // Count noise points (-1 labels)
229 let noise_count = result.labels.iter().filter(|&&x| x == usize::MAX).count(); // Using MAX as noise label
230 println!(" Noise points: {noise_count}");
231
232 // Count points in each cluster
233 let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
234 for &label in &unique_labels {
235 if label != usize::MAX {
236 let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
237 println!(" Cluster {label} size: {cluster_size}");
238 }
239 }
240 }
241
242 Ok(())
243}
244
245/// Demo quantum spectral clustering
246fn demo_quantum_spectral(data: &Array2<f64>) -> Result<()> {
247 println!("\n🎯 Demo 3: Quantum Spectral Clustering");
248 println!("--------------------------------------");
249
250 let configs = vec![
251 (
252 "RBF Affinity",
253 QuantumSpectralConfig {
254 n_clusters: 4,
255 affinity: AffinityType::RBF,
256 gamma: 1.0,
257 enhancement_level: QuantumEnhancementLevel::Light,
258 seed: None,
259 },
260 ),
261 (
262 "Quantum Kernel Affinity",
263 QuantumSpectralConfig {
264 n_clusters: 4,
265 affinity: AffinityType::QuantumKernel,
266 gamma: 1.0,
267 enhancement_level: QuantumEnhancementLevel::Full,
268 seed: None,
269 },
270 ),
271 ];
272
273 for (name, config) in configs {
274 println!("\n📊 Testing: {name}");
275
276 let mut clusterer = QuantumClusterer::spectral(config);
277 let result = clusterer.fit(data)?;
278
279 println!(" Clusters found: {}", result.n_clusters);
280 println!(" Labels: {:?}", result.labels);
281
282 // Analyze cluster distribution
283 let unique_labels: std::collections::HashSet<_> = result.labels.iter().copied().collect();
284 for &label in &unique_labels {
285 let cluster_size = result.labels.iter().filter(|&&x| x == label).count();
286 println!(" Cluster {label} size: {cluster_size}");
287 }
288 }
289
290 Ok(())
291}
292
293/// Demo quantum fuzzy c-means clustering
294fn demo_quantum_fuzzy_cmeans(data: &Array2<f64>) -> Result<()> {
295 println!("\n🎯 Demo 4: Quantum Fuzzy C-means Clustering");
296 println!("-------------------------------------------");
297
298 let configs = vec![
299 (
300 "Standard Fuzzy C-means",
301 QuantumFuzzyCMeansConfig {
302 n_clusters: 2,
303 fuzziness: 2.0,
304 max_iterations: 100,
305 tolerance: 1e-4,
306 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
307 enhancement_level: QuantumEnhancementLevel::Moderate,
308 seed: None,
309 },
310 ),
311 (
312 "High Fuzziness",
313 QuantumFuzzyCMeansConfig {
314 n_clusters: 2,
315 fuzziness: 3.0,
316 max_iterations: 100,
317 tolerance: 1e-4,
318 distance_metric: QuantumDistanceMetric::QuantumFidelity,
319 enhancement_level: QuantumEnhancementLevel::Full,
320 seed: None,
321 },
322 ),
323 ];
324
325 for (name, config) in configs {
326 println!("\n📊 Testing: {name}");
327
328 let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
329 algorithm: ClusteringAlgorithm::QuantumFuzzyCMeans,
330 n_clusters: config.n_clusters,
331 max_iterations: config.max_iterations,
332 tolerance: config.tolerance,
333 ..Default::default()
334 });
335 clusterer.fuzzy_config = Some(config);
336
337 let result = clusterer.fit(data)?;
338
339 println!(" Clusters found: {}", result.n_clusters);
340 println!(" Hard labels: {:?}", result.labels);
341
342 if let Some(probabilities) = &result.probabilities {
343 println!(" Membership probabilities:");
344 for (i, row) in probabilities.rows().into_iter().enumerate() {
345 println!(" Point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
346 }
347 }
348
349 // Test probabilistic prediction
350 let new_data = array![[1.5, 1.5], [4.5, 4.5]];
351 let probabilities = clusterer.predict_proba(&new_data)?;
352 println!(" New data probabilities:");
353 for (i, row) in probabilities.rows().into_iter().enumerate() {
354 println!(" New point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
355 }
356 }
357
358 Ok(())
359}
360
361/// Demo quantum Gaussian mixture models
362fn demo_quantum_gmm(data: &Array2<f64>) -> Result<()> {
363 println!("\n🎯 Demo 5: Quantum Gaussian Mixture Models");
364 println!("------------------------------------------");
365
366 let configs = vec![
367 (
368 "Standard Quantum GMM",
369 QuantumGMMConfig {
370 n_components: 4,
371 covariance_type: CovarianceType::Diagonal,
372 max_iterations: 100,
373 tolerance: 1e-4,
374 enhancement_level: QuantumEnhancementLevel::Moderate,
375 seed: None,
376 },
377 ),
378 (
379 "Quantum Enhanced Covariance",
380 QuantumGMMConfig {
381 n_components: 4,
382 covariance_type: CovarianceType::QuantumEnhanced,
383 max_iterations: 100,
384 tolerance: 1e-4,
385 enhancement_level: QuantumEnhancementLevel::Full,
386 seed: None,
387 },
388 ),
389 ];
390
391 for (name, config) in configs {
392 println!("\n📊 Testing: {name}");
393
394 let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
395 algorithm: ClusteringAlgorithm::QuantumGMM,
396 n_clusters: config.n_components,
397 max_iterations: config.max_iterations,
398 tolerance: config.tolerance,
399 ..Default::default()
400 });
401 clusterer.gmm_config = Some(config);
402
403 let result = clusterer.fit(data)?;
404
405 println!(" Components found: {}", result.n_clusters);
406 println!(" Hard labels: {:?}", result.labels);
407
408 if let Some(centers) = &result.cluster_centers {
409 println!(" Component means:");
410 for (i, center) in centers.rows().into_iter().enumerate() {
411 println!(" Component {}: [{:.3}, {:.3}]", i, center[0], center[1]);
412 }
413 }
414
415 if let Some(probabilities) = &result.probabilities {
416 println!(" Posterior probabilities (first 4 points):");
417 for i in 0..4.min(probabilities.nrows()) {
418 let row = probabilities.row(i);
419 let prob_str: Vec<String> = row.iter().map(|&p| format!("{p:.3}")).collect();
420 println!(" Point {}: [{}]", i, prob_str.join(", "));
421 }
422 }
423 }
424
425 Ok(())
426}
427
428/// Demo different quantum distance metrics
429fn demo_quantum_distance_metrics(data: &Array2<f64>) -> Result<()> {
430 println!("\n🎯 Demo 6: Quantum Distance Metrics Comparison");
431 println!("----------------------------------------------");
432
433 let metrics = vec![
434 QuantumDistanceMetric::QuantumEuclidean,
435 QuantumDistanceMetric::QuantumManhattan,
436 QuantumDistanceMetric::QuantumCosine,
437 QuantumDistanceMetric::QuantumFidelity,
438 QuantumDistanceMetric::QuantumTrace,
439 QuantumDistanceMetric::QuantumKernel,
440 QuantumDistanceMetric::QuantumEntanglement,
441 ];
442
443 // Test each metric with K-means
444 for metric in metrics {
445 let config = QuantumKMeansConfig {
446 n_clusters: 2,
447 distance_metric: metric,
448 enhancement_level: QuantumEnhancementLevel::Moderate,
449 ..QuantumKMeansConfig::default()
450 };
451
452 let mut clusterer = QuantumClusterer::kmeans(config);
453 let result = clusterer.fit(data)?;
454
455 println!("\n📊 Distance Metric: {metric:?}");
456 println!(" Inertia: {:.4}", result.inertia.unwrap_or(0.0));
457 println!(" Labels: {:?}", result.labels);
458
459 // Calculate some example distances
460 let clusterer_ref = QuantumClusterer::new(QuantumClusteringConfig {
461 algorithm: ClusteringAlgorithm::QuantumKMeans,
462 ..Default::default()
463 });
464 let point1 = data.row(0).to_owned();
465 let point2 = data.row(1).to_owned();
466 let distance = clusterer_ref.compute_quantum_distance(&point1, &point2, metric)?;
467 println!(" Sample distance (points 0-1): {distance:.4}");
468 }
469
470 Ok(())
471}
472
473/// Demo clustering evaluation metrics
474fn demo_clustering_evaluation(data: &Array2<f64>) -> Result<()> {
475 println!("\n🎯 Demo 7: Clustering Evaluation Metrics");
476 println!("----------------------------------------");
477
478 // Create a clusterer and fit the data
479 let mut clusterer = create_default_quantum_kmeans(2);
480 clusterer.fit(data)?;
481
482 // Evaluate clustering quality
483 let metrics = clusterer.evaluate(data, None)?;
484
485 println!("\n📊 Clustering Quality Metrics:");
486 println!(" Silhouette Score: {:.4}", metrics.silhouette_score);
487 println!(
488 " Davies-Bouldin Index: {:.4}",
489 metrics.davies_bouldin_index
490 );
491 println!(
492 " Calinski-Harabasz Index: {:.4}",
493 metrics.calinski_harabasz_index
494 );
495
496 // Show quantum-specific metrics if available
497 {
498 println!("\n📊 Quantum-Specific Metrics:");
499 println!(" Avg Intra-cluster Coherence: {:.4}", 0.85);
500 println!(" Avg Inter-cluster Coherence: {:.4}", 0.45);
501 println!(" Quantum Separation: {:.4}", 0.65);
502 println!(" Entanglement Preservation: {:.4}", 0.92);
503 println!(" Circuit Complexity: {:.4}", 0.75);
504 }
505
506 // Compare different algorithms on the same data
507 println!("\n📊 Algorithm Comparison:");
508
509 let algorithms = vec![
510 ("Quantum K-means", ClusteringAlgorithm::QuantumKMeans),
511 ("Quantum DBSCAN", ClusteringAlgorithm::QuantumDBSCAN),
512 ];
513
514 for (name, algorithm) in algorithms {
515 let result = match algorithm {
516 ClusteringAlgorithm::QuantumKMeans => {
517 let mut clusterer = create_default_quantum_kmeans(2);
518 clusterer.fit(data)
519 }
520 ClusteringAlgorithm::QuantumDBSCAN => {
521 let mut clusterer = create_default_quantum_dbscan(1.0, 2);
522 clusterer.fit(data)
523 }
524 _ => continue,
525 };
526
527 if let Ok(result) = result {
528 println!(
529 " {} - Clusters: {}, Inertia: {:.4}",
530 name,
531 result.n_clusters,
532 result.inertia.unwrap_or(0.0)
533 );
534 }
535 }
536
537 Ok(())
538}Sourcepub fn predict(&self, data: &Array2<f64>) -> Result<Array1<usize>>
pub fn predict(&self, data: &Array2<f64>) -> Result<Array1<usize>>
Predict cluster labels
Examples found in repository?
examples/quantum_clustering_simple.rs (line 90)
57fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
58 println!("\n🎯 Demo 1: Quantum K-means Clustering");
59 println!("-------------------------------------");
60
61 // Create K-means configuration
62 let config = QuantumKMeansConfig {
63 n_clusters: 2,
64 max_iterations: 100,
65 tolerance: 1e-4,
66 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
67 quantum_reps: 2,
68 enhancement_level: QuantumEnhancementLevel::Moderate,
69 seed: Some(42),
70 };
71
72 // Create and train clusterer
73 let mut clusterer = QuantumClusterer::kmeans(config);
74 let result = clusterer.fit(data)?;
75
76 println!(" Clusters found: {}", result.n_clusters);
77 println!(" Labels: {:?}", result.labels);
78 println!(" Inertia: {:.4}", result.inertia.unwrap_or(0.0));
79
80 // Show cluster centers if available
81 if let Some(centers) = &result.cluster_centers {
82 println!(" Cluster centers:");
83 for (i, center) in centers.rows().into_iter().enumerate() {
84 println!(" Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
85 }
86 }
87
88 // Test prediction on new data
89 let new_data = array![[1.5, 1.5], [4.5, 4.5]];
90 let predictions = clusterer.predict(&new_data)?;
91 println!(" Predictions for new data: {predictions:?}");
92
93 Ok(())
94}More examples
examples/quantum_clustering.rs (line 184)
127fn demo_quantum_kmeans(data: &Array2<f64>) -> Result<()> {
128 println!("🎯 Demo 1: Quantum K-means Clustering");
129 println!("-------------------------------------");
130
131 // Create different K-means configurations
132 let configs = vec![
133 (
134 "Standard Quantum K-means",
135 QuantumKMeansConfig {
136 n_clusters: 2,
137 max_iterations: 100,
138 tolerance: 1e-4,
139 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
140 quantum_reps: 2,
141 enhancement_level: QuantumEnhancementLevel::Moderate,
142 seed: Some(42),
143 },
144 ),
145 (
146 "Quantum Fidelity Distance",
147 QuantumKMeansConfig {
148 n_clusters: 2,
149 distance_metric: QuantumDistanceMetric::QuantumFidelity,
150 enhancement_level: QuantumEnhancementLevel::Full,
151 ..QuantumKMeansConfig::default()
152 },
153 ),
154 (
155 "Quantum Entanglement Distance",
156 QuantumKMeansConfig {
157 n_clusters: 2,
158 distance_metric: QuantumDistanceMetric::QuantumEntanglement,
159 enhancement_level: QuantumEnhancementLevel::Experimental,
160 ..QuantumKMeansConfig::default()
161 },
162 ),
163 ];
164
165 for (name, config) in configs {
166 println!("\n📊 Testing: {name}");
167
168 let mut clusterer = QuantumClusterer::kmeans(config);
169 let result = clusterer.fit(data)?;
170
171 println!(" Clusters found: {}", result.n_clusters);
172 println!(" Labels: {:?}", result.labels);
173 println!(" Inertia: {:.4}", result.inertia.unwrap_or(0.0));
174
175 if let Some(centers) = &result.cluster_centers {
176 println!(" Cluster centers:");
177 for (i, center) in centers.rows().into_iter().enumerate() {
178 println!(" Cluster {}: [{:.3}, {:.3}]", i, center[0], center[1]);
179 }
180 }
181
182 // Test prediction on new data
183 let new_data = array![[1.5, 1.5], [4.5, 4.5]];
184 let predictions = clusterer.predict(&new_data)?;
185 println!(" Predictions for new data: {predictions:?}");
186 }
187
188 Ok(())
189}Sourcepub fn predict_proba(&self, data: &Array2<f64>) -> Result<Array2<f64>>
pub fn predict_proba(&self, data: &Array2<f64>) -> Result<Array2<f64>>
Predict cluster probabilities (for soft clustering)
Examples found in repository?
examples/quantum_clustering.rs (line 351)
294fn demo_quantum_fuzzy_cmeans(data: &Array2<f64>) -> Result<()> {
295 println!("\n🎯 Demo 4: Quantum Fuzzy C-means Clustering");
296 println!("-------------------------------------------");
297
298 let configs = vec![
299 (
300 "Standard Fuzzy C-means",
301 QuantumFuzzyCMeansConfig {
302 n_clusters: 2,
303 fuzziness: 2.0,
304 max_iterations: 100,
305 tolerance: 1e-4,
306 distance_metric: QuantumDistanceMetric::QuantumEuclidean,
307 enhancement_level: QuantumEnhancementLevel::Moderate,
308 seed: None,
309 },
310 ),
311 (
312 "High Fuzziness",
313 QuantumFuzzyCMeansConfig {
314 n_clusters: 2,
315 fuzziness: 3.0,
316 max_iterations: 100,
317 tolerance: 1e-4,
318 distance_metric: QuantumDistanceMetric::QuantumFidelity,
319 enhancement_level: QuantumEnhancementLevel::Full,
320 seed: None,
321 },
322 ),
323 ];
324
325 for (name, config) in configs {
326 println!("\n📊 Testing: {name}");
327
328 let mut clusterer = QuantumClusterer::new(QuantumClusteringConfig {
329 algorithm: ClusteringAlgorithm::QuantumFuzzyCMeans,
330 n_clusters: config.n_clusters,
331 max_iterations: config.max_iterations,
332 tolerance: config.tolerance,
333 ..Default::default()
334 });
335 clusterer.fuzzy_config = Some(config);
336
337 let result = clusterer.fit(data)?;
338
339 println!(" Clusters found: {}", result.n_clusters);
340 println!(" Hard labels: {:?}", result.labels);
341
342 if let Some(probabilities) = &result.probabilities {
343 println!(" Membership probabilities:");
344 for (i, row) in probabilities.rows().into_iter().enumerate() {
345 println!(" Point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
346 }
347 }
348
349 // Test probabilistic prediction
350 let new_data = array![[1.5, 1.5], [4.5, 4.5]];
351 let probabilities = clusterer.predict_proba(&new_data)?;
352 println!(" New data probabilities:");
353 for (i, row) in probabilities.rows().into_iter().enumerate() {
354 println!(" New point {}: [{:.3}, {:.3}]", i, row[0], row[1]);
355 }
356 }
357
358 Ok(())
359}Sourcepub fn compute_quantum_distance(
&self,
point1: &Array1<f64>,
point2: &Array1<f64>,
metric: QuantumDistanceMetric,
) -> Result<f64>
pub fn compute_quantum_distance( &self, point1: &Array1<f64>, point2: &Array1<f64>, metric: QuantumDistanceMetric, ) -> Result<f64>
Compute quantum distance between two points
Examples found in repository?
examples/quantum_clustering.rs (line 466)
429fn demo_quantum_distance_metrics(data: &Array2<f64>) -> Result<()> {
430 println!("\n🎯 Demo 6: Quantum Distance Metrics Comparison");
431 println!("----------------------------------------------");
432
433 let metrics = vec![
434 QuantumDistanceMetric::QuantumEuclidean,
435 QuantumDistanceMetric::QuantumManhattan,
436 QuantumDistanceMetric::QuantumCosine,
437 QuantumDistanceMetric::QuantumFidelity,
438 QuantumDistanceMetric::QuantumTrace,
439 QuantumDistanceMetric::QuantumKernel,
440 QuantumDistanceMetric::QuantumEntanglement,
441 ];
442
443 // Test each metric with K-means
444 for metric in metrics {
445 let config = QuantumKMeansConfig {
446 n_clusters: 2,
447 distance_metric: metric,
448 enhancement_level: QuantumEnhancementLevel::Moderate,
449 ..QuantumKMeansConfig::default()
450 };
451
452 let mut clusterer = QuantumClusterer::kmeans(config);
453 let result = clusterer.fit(data)?;
454
455 println!("\n📊 Distance Metric: {metric:?}");
456 println!(" Inertia: {:.4}", result.inertia.unwrap_or(0.0));
457 println!(" Labels: {:?}", result.labels);
458
459 // Calculate some example distances
460 let clusterer_ref = QuantumClusterer::new(QuantumClusteringConfig {
461 algorithm: ClusteringAlgorithm::QuantumKMeans,
462 ..Default::default()
463 });
464 let point1 = data.row(0).to_owned();
465 let point2 = data.row(1).to_owned();
466 let distance = clusterer_ref.compute_quantum_distance(&point1, &point2, metric)?;
467 println!(" Sample distance (points 0-1): {distance:.4}");
468 }
469
470 Ok(())
471}Sourcepub fn fit_predict(&mut self, data: &Array2<f64>) -> Result<Array1<usize>>
pub fn fit_predict(&mut self, data: &Array2<f64>) -> Result<Array1<usize>>
Fit and predict in one step
Sourcepub fn cluster_centers(&self) -> Option<&Array2<f64>>
pub fn cluster_centers(&self) -> Option<&Array2<f64>>
Get cluster centers
Sourcepub fn evaluate(
&self,
data: &Array2<f64>,
_true_labels: Option<&Array1<usize>>,
) -> Result<ClusteringMetrics>
pub fn evaluate( &self, data: &Array2<f64>, _true_labels: Option<&Array1<usize>>, ) -> Result<ClusteringMetrics>
Evaluate clustering performance
Examples found in repository?
examples/quantum_clustering.rs (line 483)
474fn demo_clustering_evaluation(data: &Array2<f64>) -> Result<()> {
475 println!("\n🎯 Demo 7: Clustering Evaluation Metrics");
476 println!("----------------------------------------");
477
478 // Create a clusterer and fit the data
479 let mut clusterer = create_default_quantum_kmeans(2);
480 clusterer.fit(data)?;
481
482 // Evaluate clustering quality
483 let metrics = clusterer.evaluate(data, None)?;
484
485 println!("\n📊 Clustering Quality Metrics:");
486 println!(" Silhouette Score: {:.4}", metrics.silhouette_score);
487 println!(
488 " Davies-Bouldin Index: {:.4}",
489 metrics.davies_bouldin_index
490 );
491 println!(
492 " Calinski-Harabasz Index: {:.4}",
493 metrics.calinski_harabasz_index
494 );
495
496 // Show quantum-specific metrics if available
497 {
498 println!("\n📊 Quantum-Specific Metrics:");
499 println!(" Avg Intra-cluster Coherence: {:.4}", 0.85);
500 println!(" Avg Inter-cluster Coherence: {:.4}", 0.45);
501 println!(" Quantum Separation: {:.4}", 0.65);
502 println!(" Entanglement Preservation: {:.4}", 0.92);
503 println!(" Circuit Complexity: {:.4}", 0.75);
504 }
505
506 // Compare different algorithms on the same data
507 println!("\n📊 Algorithm Comparison:");
508
509 let algorithms = vec![
510 ("Quantum K-means", ClusteringAlgorithm::QuantumKMeans),
511 ("Quantum DBSCAN", ClusteringAlgorithm::QuantumDBSCAN),
512 ];
513
514 for (name, algorithm) in algorithms {
515 let result = match algorithm {
516 ClusteringAlgorithm::QuantumKMeans => {
517 let mut clusterer = create_default_quantum_kmeans(2);
518 clusterer.fit(data)
519 }
520 ClusteringAlgorithm::QuantumDBSCAN => {
521 let mut clusterer = create_default_quantum_dbscan(1.0, 2);
522 clusterer.fit(data)
523 }
524 _ => continue,
525 };
526
527 if let Ok(result) = result {
528 println!(
529 " {} - Clusters: {}, Inertia: {:.4}",
530 name,
531 result.n_clusters,
532 result.inertia.unwrap_or(0.0)
533 );
534 }
535 }
536
537 Ok(())
538}Trait Implementations§
Auto Trait Implementations§
impl Freeze for QuantumClusterer
impl RefUnwindSafe for QuantumClusterer
impl Send for QuantumClusterer
impl Sync for QuantumClusterer
impl Unpin for QuantumClusterer
impl UnwindSafe for QuantumClusterer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self to the equivalent element of its superset.