diff options
| Commit | dafd2d2bad0a6a0a1a48c4aa000eb59755efcfaa (patch) | |
|---|---|---|
| Author | 2025-01-05 20:48:44 +0200 | |
| Committer | 2025-01-05 20:48:44 +0200 | |
| Files | b246fc8afedb1146cef41ecb59991a5359d29def | |
| uni-projects-dafd2d2bad0a6a0a1a48c4aa000eb59755efcfaa.tar uni-projects-dafd2d2bad0a6a0a1a48c4aa000eb59755efcfaa.tar.gz uni-projects-dafd2d2bad0a6a0a1a48c4aa000eb59755efcfaa.zip | ||
| Parent | b99abb4a606958be17f19e88a79884e80435e030 (diff) | |
hw(AT/5): Implement filling missing values
1 files changed, 99 insertions, 4 deletions
| -rw-r--r-- | Year 4/Artificial Intelligence/hw05/src/probabilities.rs | 103 |
diff --git a/Year 4/Artificial Intelligence/hw05/src/probabilities.rs b/Year 4/Artificial Intelligence/hw05/src/probabilities.rs index 7468bdb..452441e 100644 --- a/Year 4/Artificial Intelligence/hw05/src/probabilities.rs +++ b/Year 4/Artificial Intelligence/hw05/src/probabilities.rs @@ -1,6 +1,7 @@ use crate::data::{Party, Person, Value}; use std::collections::HashMap; use struct_iterable::Iterable; +use rand::{ thread_rng, Rng }; pub fn party_probabilities(dataset: &Vec<Person>) -> HashMap<Party, f64> { @@ -25,11 +26,15 @@ macro_rules! P { { use crate::data::Value; use struct_iterable::Iterable; + use rand::{ thread_rng, Rng }; let mut prob = if $party == crate::data::Party::democrat { 0.61 } else { 0.39 }; for (name, val) in $person.iter() { if name == "party" { continue; } - let val = val.downcast_ref::<Value>().unwrap(); + let mut val = val.downcast_ref::<Value>().unwrap().clone(); + if val == Value::q && ! $prob.0.contains_key(&Value::q) { + val = if thread_rng().gen_bool(0.5) { Value::y } else { Value::n }; + } prob *= P!(name = val | $party, $prob) / P!(name = val, $prob); } prob @@ -37,11 +42,11 @@ macro_rules! P { }; // P("crime"=y|democrat) ( $attr:tt = $value:tt | $party:tt , $prob:ident ) => { - $prob.1[&$party][$value][$attr] + $prob.1[&$party][&$value][$attr] }; // P("crime"=y) ( $attr:tt = $value:tt , $prob:ident ) => { - $prob.0[$value][$attr] + $prob.0[&$value][$attr] }; } @@ -169,5 +174,95 @@ pub fn value_3_probabilities(dataset: &Vec<Person>) -> PMaps { } pub fn value_2_probabilities(dataset: &Vec<Person>) -> PMaps { - todo!(); + let mut len = dataset.len() as f64; + + // P(Value[attr]) + let mut ret_y = HashMap::new(); + let mut ret_n = HashMap::new(); + + for (name, _) in dataset[0].iter() { + if name == "party" { continue; } + + let (count_y, count_n) = dataset + .into_iter() + .fold((0.0, 0.0), |mut acc, person| { + match person[name] { + Value::y => acc.0 += 1.0, + Value::n => acc.1 += 1.0, + Value::q => if thread_rng().gen_bool(0.5) { acc.0 += 1.0 } else { acc.1 += 1.0 }, + } + acc + }); + ret_y.insert(name.to_string(), count_y / len); + ret_n.insert(name.to_string(), count_n / len); + } + + let mut simple_p = HashMap::new(); + simple_p.insert(Value::y, ret_y); + simple_p.insert(Value::n, ret_n); + + // P(Value[attr]|Party) + let mut complex_p = HashMap::new(); + + // P(Value[attr]|democrat) + let mut ret_y = HashMap::new(); + let mut ret_n = HashMap::new(); + len = 214.0; + + for (name, _) in dataset[0].iter() { + if name == "party" { continue; } + + let (count_y, count_n) = dataset + .into_iter() + .fold((0.0, 0.0), |mut acc, person| { + if person.party == Party::democrat { + match person[name] { + Value::y => acc.0 += 1.0, + Value::n => acc.1 += 1.0, + Value::q => if thread_rng().gen_bool(0.5) { acc.0 += 1.0 } else { acc.1 += 1.0 }, + } + } + acc + }); + ret_y.insert(name.to_string(), count_y / len); + ret_n.insert(name.to_string(), count_n / len); + } + + let mut party_p = HashMap::new(); + party_p.insert(Value::y, ret_y); + party_p.insert(Value::n, ret_n); + + complex_p.insert(Party::democrat, party_p); + + // P(Value[attr]|republican) + let mut ret_y = HashMap::new(); + let mut ret_n = HashMap::new(); + len = 134.0; + + for (name, _) in dataset[0].iter() { + if name == "party" { continue; } + + let (count_y, count_n) = dataset + .into_iter() + .fold((0.0, 0.0), |mut acc, person| { + if person.party == Party::republican { + match person[name] { + Value::y => acc.0 += 1.0, + Value::n => acc.1 += 1.0, + Value::q => if thread_rng().gen_bool(0.5) { acc.0 += 1.0 } else { acc.1 += 1.0 }, + } + } + acc + }); + ret_y.insert(name.to_string(), count_y / len); + ret_n.insert(name.to_string(), count_n / len); + } + + let mut party_p = HashMap::new(); + party_p.insert(Value::y, ret_y); + party_p.insert(Value::n, ret_n); + + complex_p.insert(Party::republican, party_p); + + (simple_p, complex_p) } |
