src/HOL/Probability/Distributions.thy
changeset 64267 b9a1486e79be
parent 63918 6bf55e6e0b75
child 67399 eab6ce8368fa
equal deleted inserted replaced
64265:8eb6365f5916 64267:b9a1486e79be
   100            (simp_all add: of_nat_Suc field_simps)
   100            (simp_all add: of_nat_Suc field_simps)
   101       finally show ?case .
   101       finally show ?case .
   102     qed
   102     qed
   103   qed auto
   103   qed auto
   104   also have "\<dots> = ennreal (1 - (\<Sum>n\<le>k. (a^n * exp (-a)) / fact n))"
   104   also have "\<dots> = ennreal (1 - (\<Sum>n\<le>k. (a^n * exp (-a)) / fact n))"
   105     by (auto simp: power_0_left if_distrib[where f="\<lambda>x. x / a" for a] setsum.If_cases)
   105     by (auto simp: power_0_left if_distrib[where f="\<lambda>x. x / a" for a] sum.If_cases)
   106   also have "\<dots> = ennreal ((1 - (\<Sum>n\<le>k. (a^n * exp (-a)) / fact n)) * fact k) * ennreal (inverse (fact k))"
   106   also have "\<dots> = ennreal ((1 - (\<Sum>n\<le>k. (a^n * exp (-a)) / fact n)) * fact k) * ennreal (inverse (fact k))"
   107     by (subst ennreal_mult''[symmetric]) (auto intro!: arg_cong[where f=ennreal])
   107     by (subst ennreal_mult''[symmetric]) (auto intro!: arg_cong[where f=ennreal])
   108   finally show ?thesis
   108   finally show ?thesis
   109     by (auto simp add: mult_right_ennreal_cancel le_less)
   109     by (auto simp add: mult_right_ennreal_cancel le_less)
   110 qed
   110 qed
   147  unfolding erlang_CDF_def
   147  unfolding erlang_CDF_def
   148 proof (clarsimp simp: not_less)
   148 proof (clarsimp simp: not_less)
   149   assume "0 \<le> x"
   149   assume "0 \<le> x"
   150   have "(\<Sum>n\<le>k. (l * x) ^ n * exp (- (l * x)) / fact n) =
   150   have "(\<Sum>n\<le>k. (l * x) ^ n * exp (- (l * x)) / fact n) =
   151     exp (- (l * x)) * (\<Sum>n\<le>k. (l * x) ^ n / fact n)"
   151     exp (- (l * x)) * (\<Sum>n\<le>k. (l * x) ^ n / fact n)"
   152     unfolding setsum_distrib_left by (intro setsum.cong) (auto simp: field_simps)
   152     unfolding sum_distrib_left by (intro sum.cong) (auto simp: field_simps)
   153   also have "\<dots> = (\<Sum>n\<le>k. (l * x) ^ n / fact n) / exp (l * x)"
   153   also have "\<dots> = (\<Sum>n\<le>k. (l * x) ^ n / fact n) / exp (l * x)"
   154     by (simp add: exp_minus field_simps)
   154     by (simp add: exp_minus field_simps)
   155   also have "\<dots> \<le> 1"
   155   also have "\<dots> \<le> 1"
   156   proof (subst divide_le_eq_1_pos)
   156   proof (subst divide_le_eq_1_pos)
   157     show "(\<Sum>n\<le>k. (l * x) ^ n / fact n) \<le> exp (l * x)"
   157     show "(\<Sum>n\<le>k. (l * x) ^ n / fact n) \<le> exp (l * x)"
   158       using \<open>0 < l\<close> \<open>0 \<le> x\<close> summable_exp_generic[of "l * x"]
   158       using \<open>0 < l\<close> \<open>0 \<le> x\<close> summable_exp_generic[of "l * x"]
   159       by (auto simp: exp_def divide_inverse ac_simps intro!: setsum_le_suminf)
   159       by (auto simp: exp_def divide_inverse ac_simps intro!: sum_le_suminf)
   160   qed simp
   160   qed simp
   161   finally show "(\<Sum>n\<le>k. (l * x) ^ n * exp (- (l * x)) / fact n) \<le> 1" .
   161   finally show "(\<Sum>n\<le>k. (l * x) ^ n * exp (- (l * x)) / fact n) \<le> 1" .
   162 qed
   162 qed
   163 
   163 
   164 lemma nn_integral_erlang_density:
   164 lemma nn_integral_erlang_density:
   455   case (singleton i) then show ?case by simp
   455   case (singleton i) then show ?case by simp
   456 next
   456 next
   457   case (insert i I)
   457   case (insert i I)
   458   then have "distributed M lborel (\<lambda>x. min (X i x) (Min ((\<lambda>i. X i x)`I))) (exponential_density (l i + (\<Sum>i\<in>I. l i)))"
   458   then have "distributed M lborel (\<lambda>x. min (X i x) (Min ((\<lambda>i. X i x)`I))) (exponential_density (l i + (\<Sum>i\<in>I. l i)))"
   459       by (intro exponential_distributed_min indep_vars_Min insert)
   459       by (intro exponential_distributed_min indep_vars_Min insert)
   460          (auto intro: indep_vars_subset setsum_pos)
   460          (auto intro: indep_vars_subset sum_pos)
   461   then show ?case
   461   then show ?case
   462     using insert by simp
   462     using insert by simp
   463 qed
   463 qed
   464 
   464 
   465 lemma (in prob_space) exponential_distributed_variance:
   465 lemma (in prob_space) exponential_distributed_variance:
   555   apply (subst convolution_erlang_density[symmetric, OF \<open>0<l\<close>])
   555   apply (subst convolution_erlang_density[symmetric, OF \<open>0<l\<close>])
   556   apply (intro distributed_convolution)
   556   apply (intro distributed_convolution)
   557   apply auto
   557   apply auto
   558   done
   558   done
   559 
   559 
   560 lemma (in prob_space) erlang_distributed_setsum:
   560 lemma (in prob_space) erlang_distributed_sum:
   561   assumes finI : "finite I"
   561   assumes finI : "finite I"
   562   assumes A: "I \<noteq> {}"
   562   assumes A: "I \<noteq> {}"
   563   assumes [simp, arith]: "0 < l"
   563   assumes [simp, arith]: "0 < l"
   564   assumes expX: "\<And>i. i \<in> I \<Longrightarrow> distributed M lborel (X i) (erlang_density (k i) l)"
   564   assumes expX: "\<And>i. i \<in> I \<Longrightarrow> distributed M lborel (X i) (erlang_density (k i) l)"
   565   assumes ind: "indep_vars (\<lambda>i. borel) X I"
   565   assumes ind: "indep_vars (\<lambda>i. borel) X I"
   568 proof (induct rule: finite_ne_induct)
   568 proof (induct rule: finite_ne_induct)
   569   case (singleton i) then show ?case by auto
   569   case (singleton i) then show ?case by auto
   570 next
   570 next
   571   case (insert i I)
   571   case (insert i I)
   572     then have "distributed M lborel (\<lambda>x. (X i x) + (\<Sum>i\<in> I. X i x)) (erlang_density (Suc (k i) + Suc ((\<Sum>i\<in>I. Suc (k i)) - 1) - 1) l)"
   572     then have "distributed M lborel (\<lambda>x. (X i x) + (\<Sum>i\<in> I. X i x)) (erlang_density (Suc (k i) + Suc ((\<Sum>i\<in>I. Suc (k i)) - 1) - 1) l)"
   573       by(intro sum_indep_erlang indep_vars_setsum) (auto intro!: indep_vars_subset)
   573       by(intro sum_indep_erlang indep_vars_sum) (auto intro!: indep_vars_subset)
   574     also have "(\<lambda>x. (X i x) + (\<Sum>i\<in> I. X i x)) = (\<lambda>x. \<Sum>i\<in>insert i I. X i x)"
   574     also have "(\<lambda>x. (X i x) + (\<Sum>i\<in> I. X i x)) = (\<lambda>x. \<Sum>i\<in>insert i I. X i x)"
   575       using insert by auto
   575       using insert by auto
   576     also have "Suc(k i) + Suc ((\<Sum>i\<in>I. Suc (k i)) - 1) - 1 = (\<Sum>i\<in>insert i I. Suc (k i)) - 1"
   576     also have "Suc(k i) + Suc ((\<Sum>i\<in>I. Suc (k i)) - 1) - 1 = (\<Sum>i\<in>insert i I. Suc (k i)) - 1"
   577       using insert by (auto intro!: Suc_pred simp: ac_simps)
   577       using insert by (auto intro!: Suc_pred simp: ac_simps)
   578     finally show ?case by fast
   578     finally show ?case by fast
   579 qed
   579 qed
   580 
   580 
   581 lemma (in prob_space) exponential_distributed_setsum:
   581 lemma (in prob_space) exponential_distributed_sum:
   582   assumes finI: "finite I"
   582   assumes finI: "finite I"
   583   assumes A: "I \<noteq> {}"
   583   assumes A: "I \<noteq> {}"
   584   assumes l: "0 < l"
   584   assumes l: "0 < l"
   585   assumes expX: "\<And>i. i \<in> I \<Longrightarrow> distributed M lborel (X i) (exponential_density l)"
   585   assumes expX: "\<And>i. i \<in> I \<Longrightarrow> distributed M lborel (X i) (exponential_density l)"
   586   assumes ind: "indep_vars (\<lambda>i. borel) X I"
   586   assumes ind: "indep_vars (\<lambda>i. borel) X I"
   587   shows "distributed M lborel (\<lambda>x. \<Sum>i\<in>I. X i x) (erlang_density ((card I) - 1) l)"
   587   shows "distributed M lborel (\<lambda>x. \<Sum>i\<in>I. X i x) (erlang_density ((card I) - 1) l)"
   588   using erlang_distributed_setsum[OF assms] by simp
   588   using erlang_distributed_sum[OF assms] by simp
   589 
   589 
   590 lemma (in information_space) entropy_exponential:
   590 lemma (in information_space) entropy_exponential:
   591   assumes l[simp, arith]: "0 < l"
   591   assumes l[simp, arith]: "0 < l"
   592   assumes D: "distributed M lborel X (exponential_density l)"
   592   assumes D: "distributed M lborel X (exponential_density l)"
   593   shows "entropy b lborel X = log b (exp 1 / l)"
   593   shows "entropy b lborel X = log b (exp 1 / l)"
  1246 lemma conv_std_normal_density:
  1246 lemma conv_std_normal_density:
  1247   "(\<lambda>x. \<integral>\<^sup>+y. ennreal (std_normal_density (x - y) * std_normal_density y) \<partial>lborel) =
  1247   "(\<lambda>x. \<integral>\<^sup>+y. ennreal (std_normal_density (x - y) * std_normal_density y) \<partial>lborel) =
  1248   (normal_density 0 (sqrt 2))"
  1248   (normal_density 0 (sqrt 2))"
  1249   by (subst conv_normal_density_zero_mean) simp_all
  1249   by (subst conv_normal_density_zero_mean) simp_all
  1250 
  1250 
  1251 lemma (in prob_space) sum_indep_normal:
  1251 lemma (in prob_space) add_indep_normal:
  1252   assumes indep: "indep_var borel X borel Y"
  1252   assumes indep: "indep_var borel X borel Y"
  1253   assumes pos_var[arith]: "0 < \<sigma>" "0 < \<tau>"
  1253   assumes pos_var[arith]: "0 < \<sigma>" "0 < \<tau>"
  1254   assumes normalX[simp]: "distributed M lborel X (normal_density \<mu> \<sigma>)"
  1254   assumes normalX[simp]: "distributed M lborel X (normal_density \<mu> \<sigma>)"
  1255   assumes normalY[simp]: "distributed M lborel Y (normal_density \<nu> \<tau>)"
  1255   assumes normalY[simp]: "distributed M lborel Y (normal_density \<nu> \<tau>)"
  1256   shows "distributed M lborel (\<lambda>x. X x + Y x) (normal_density (\<mu> + \<nu>) (sqrt (\<sigma>\<^sup>2 + \<tau>\<^sup>2)))"
  1256   shows "distributed M lborel (\<lambda>x. X x + Y x) (normal_density (\<mu> + \<nu>) (sqrt (\<sigma>\<^sup>2 + \<tau>\<^sup>2)))"
  1291   have "distributed M lborel (\<lambda>x. 0 + - 1 * Y x) (\<lambda>x. ennreal (normal_density (0 + - 1 * \<nu>) (\<bar>- 1\<bar> * \<tau>) x))"
  1291   have "distributed M lborel (\<lambda>x. 0 + - 1 * Y x) (\<lambda>x. ennreal (normal_density (0 + - 1 * \<nu>) (\<bar>- 1\<bar> * \<tau>) x))"
  1292     by(rule normal_density_affine, auto)
  1292     by(rule normal_density_affine, auto)
  1293   then have [simp]:"distributed M lborel (\<lambda>x. - Y x) (\<lambda>x. ennreal (normal_density (- \<nu>) \<tau> x))" by simp
  1293   then have [simp]:"distributed M lborel (\<lambda>x. - Y x) (\<lambda>x. ennreal (normal_density (- \<nu>) \<tau> x))" by simp
  1294 
  1294 
  1295   have "distributed M lborel (\<lambda>x. X x + (- Y x)) (normal_density (\<mu> + - \<nu>) (sqrt (\<sigma>\<^sup>2 + \<tau>\<^sup>2)))"
  1295   have "distributed M lborel (\<lambda>x. X x + (- Y x)) (normal_density (\<mu> + - \<nu>) (sqrt (\<sigma>\<^sup>2 + \<tau>\<^sup>2)))"
  1296     apply (rule sum_indep_normal)
  1296     apply (rule add_indep_normal)
  1297     apply (rule indep_var_compose[unfolded comp_def, of borel _ borel _ "\<lambda>x. x" _ "\<lambda>x. - x"])
  1297     apply (rule indep_var_compose[unfolded comp_def, of borel _ borel _ "\<lambda>x. x" _ "\<lambda>x. - x"])
  1298     apply simp_all
  1298     apply simp_all
  1299     done
  1299     done
  1300   then show ?thesis by simp
  1300   then show ?thesis by simp
  1301 qed
  1301 qed
  1302 
  1302 
  1303 lemma (in prob_space) setsum_indep_normal:
  1303 lemma (in prob_space) sum_indep_normal:
  1304   assumes "finite I" "I \<noteq> {}" "indep_vars (\<lambda>i. borel) X I"
  1304   assumes "finite I" "I \<noteq> {}" "indep_vars (\<lambda>i. borel) X I"
  1305   assumes "\<And>i. i \<in> I \<Longrightarrow> 0 < \<sigma> i"
  1305   assumes "\<And>i. i \<in> I \<Longrightarrow> 0 < \<sigma> i"
  1306   assumes normal: "\<And>i. i \<in> I \<Longrightarrow> distributed M lborel (X i) (normal_density (\<mu> i) (\<sigma> i))"
  1306   assumes normal: "\<And>i. i \<in> I \<Longrightarrow> distributed M lborel (X i) (normal_density (\<mu> i) (\<sigma> i))"
  1307   shows "distributed M lborel (\<lambda>x. \<Sum>i\<in>I. X i x) (normal_density (\<Sum>i\<in>I. \<mu> i) (sqrt (\<Sum>i\<in>I. (\<sigma> i)\<^sup>2)))"
  1307   shows "distributed M lborel (\<lambda>x. \<Sum>i\<in>I. X i x) (normal_density (\<Sum>i\<in>I. \<mu> i) (sqrt (\<Sum>i\<in>I. (\<sigma> i)\<^sup>2)))"
  1308   using assms
  1308   using assms
  1309 proof (induct I rule: finite_ne_induct)
  1309 proof (induct I rule: finite_ne_induct)
  1310   case (singleton i) then show ?case by (simp add : abs_of_pos)
  1310   case (singleton i) then show ?case by (simp add : abs_of_pos)
  1311 next
  1311 next
  1312   case (insert i I)
  1312   case (insert i I)
  1313     then have 1: "distributed M lborel (\<lambda>x. (X i x) + (\<Sum>i\<in>I. X i x))
  1313     then have 1: "distributed M lborel (\<lambda>x. (X i x) + (\<Sum>i\<in>I. X i x))
  1314                 (normal_density (\<mu> i  + setsum \<mu> I)  (sqrt ((\<sigma> i)\<^sup>2 + (sqrt (\<Sum>i\<in>I. (\<sigma> i)\<^sup>2))\<^sup>2)))"
  1314                 (normal_density (\<mu> i  + sum \<mu> I)  (sqrt ((\<sigma> i)\<^sup>2 + (sqrt (\<Sum>i\<in>I. (\<sigma> i)\<^sup>2))\<^sup>2)))"
  1315       apply (intro sum_indep_normal indep_vars_setsum insert real_sqrt_gt_zero)
  1315       apply (intro add_indep_normal indep_vars_sum insert real_sqrt_gt_zero)
  1316       apply (auto intro: indep_vars_subset intro!: setsum_pos)
  1316       apply (auto intro: indep_vars_subset intro!: sum_pos)
  1317       apply fastforce
  1317       apply fastforce
  1318       done
  1318       done
  1319     have 2: "(\<lambda>x. (X i x)+ (\<Sum>i\<in>I. X i x)) = (\<lambda>x. (\<Sum>j\<in>insert i I. X j x))"
  1319     have 2: "(\<lambda>x. (X i x)+ (\<Sum>i\<in>I. X i x)) = (\<lambda>x. (\<Sum>j\<in>insert i I. X j x))"
  1320           "\<mu> i + setsum \<mu> I = setsum \<mu> (insert i I)"
  1320           "\<mu> i + sum \<mu> I = sum \<mu> (insert i I)"
  1321       using insert by auto
  1321       using insert by auto
  1322 
  1322 
  1323     have 3: "(sqrt ((\<sigma> i)\<^sup>2 + (sqrt (\<Sum>i\<in>I. (\<sigma> i)\<^sup>2))\<^sup>2)) = (sqrt (\<Sum>i\<in>insert i I. (\<sigma> i)\<^sup>2))"
  1323     have 3: "(sqrt ((\<sigma> i)\<^sup>2 + (sqrt (\<Sum>i\<in>I. (\<sigma> i)\<^sup>2))\<^sup>2)) = (sqrt (\<Sum>i\<in>insert i I. (\<sigma> i)\<^sup>2))"
  1324       using insert by (simp add: setsum_nonneg)
  1324       using insert by (simp add: sum_nonneg)
  1325 
  1325 
  1326     show ?case using 1 2 3 by simp
  1326     show ?case using 1 2 3 by simp
  1327 qed
  1327 qed
  1328 
  1328 
  1329 lemma (in prob_space) standard_normal_distributed_expectation:
  1329 lemma (in prob_space) standard_normal_distributed_expectation: