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