{ "cells": [ { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# 集合と確率を操作する\n", "## 集合とは何か\n", "### 集合の構成" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: sympy in /usr/local/lib/python3.7/site-packages (1.3)\r\nRequirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.7/site-packages (from sympy) (1.0.0)\r\n" ] } ], "source": [ "import sys\n", "!{sys.executable} -m pip install sympy" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{2, 4, 6}\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(2, 4, 6)\n", "print(s)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1/5, 1, 1.5}\n" ] } ], "source": [ "from sympy import FiniteSet\n", "from fractions import Fraction\n", "s = FiniteSet(1, 1.5, Fraction(1, 5))\n", "print(s)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 1.5, 3)\n", "print(len(s))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### ある数が集合にあるかどうかチェックする" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 1.5, 3)\n", "print(4 in s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 空集合を作る" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "EmptySet()\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet()\n", "print(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### リストやタプルから集合を作る" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2, 3}\n" ] } ], "source": [ "from sympy import FiniteSet\n", "members = [1, 2, 3]\n", "s = FiniteSet(*members)\n", "print(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 集合要素の重複と順序" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2, 3}\n" ] } ], "source": [ "from sympy import FiniteSet\n", "members = [1, 2, 3, 2]\n", "s = FiniteSet(*members)\n", "print(s)\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n2\n3\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 2, 3)\n", "for member in s:\n", " print(member)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(3, 4, 5)\n", "t = FiniteSet(5 ,4, 3)\n", "print(s == t)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 部分集合、上位集合、べき集合" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\nTrue\nTrue\nTrue\nFalse\nTrue\n" ] } ], "source": [ "from sympy import FiniteSet\n", "\n", "s = FiniteSet(1)\n", "t = FiniteSet(1, 2)\n", "print(s.is_subset(t))\n", "print(s.is_subset(s))\n", "print(s.is_subset(s))\n", "print(s.is_subset(t))\n", "\n", "print(s.is_superset(t))\n", "print(s.is_superset(s))\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{EmptySet(), {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}\n8\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 2, 3)\n", "ps = s.powerset()\n", "print(ps)\n", "print(len(ps))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\nFalse\nTrue\nFalse\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 2, 3)\n", "t = FiniteSet(1, 2, 3)\n", "print(s.is_proper_subset(t))\n", "print(s.is_proper_subset(s))\n", "\n", "t = FiniteSet(1, 2, 3, 4)\n", "print(s.is_proper_subset(t))\n", "print(s.is_proper_subset(s))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 集合演算" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 和と積" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2, 3, 4, 6}\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 2, 3)\n", "t = FiniteSet(2, 4, 6)\n", "print(s.union(t))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "${1, 2}\\cup{2, 3}$" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{2}\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 2)\n", "t = FiniteSet(2, 3)\n", "print(s.intersect(t))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "${1, 2, 3}\\cup{2, 4, 6}\\cup{3, 5, 7}$" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2, 3, 4, 5, 6, 7}\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 2, 3)\n", "t = FiniteSet(2, 4, 6)\n", "u = FiniteSet(3, 5, 7)\n", "print(s.union(t).union(u))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "${1, 2, 3}\\cap{2, 4, 6}\\cap{3, 5, 7}$" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "EmptySet()\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 2, 3)\n", "t = FiniteSet(2, 4, 6)\n", "u = FiniteSet(3, 5, 7)\n", "print(s.intersect(t).intersect(u))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 直積" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2} x {3, 4}\n(1, 3)\n(1, 4)\n(2, 3)\n(2, 4)\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 2)\n", "t = FiniteSet(3, 4)\n", "p = s*t\n", "print(p)\n", "for elem in p:\n", " print(elem)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2} x {1, 2} x {1, 2}\n(1, 1, 1)\n(1, 1, 2)\n(1, 2, 1)\n(1, 2, 2)\n(2, 1, 1)\n(2, 1, 2)\n(2, 2, 1)\n(2, 2, 2)\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 2)\n", "p = s**3\n", "print(p)\n", "for elem in p:\n", " print(elem)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 変数を複数集合に公式を適用する" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$T = 2\\pi \\sqrt{\\frac{L}{g}}$" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Length: 15.0 cm Time Period: 0.777 s\nLength: 18.0 cm Time Period: 0.852 s\nLength: 21.0 cm Time Period: 0.920 s\nLength: 22.5 cm Time Period: 0.952 s\nLength: 25.0 cm Time Period: 1.004 s\n" ] } ], "source": [ "from sympy import FiniteSet, pi\n", "\n", "\n", "def time_period(length):\n", " g = 9.8\n", " T = 2 * pi * (length / g) ** 0.5\n", " return T\n", "\n", "\n", "if __name__ == '__main__':\n", " L = FiniteSet(15, 18, 21, 22.5, 25)\n", " for l in L:\n", " t = time_period(l / 100)\n", " print('Length: {0} cm Time Period: {1:.3f} s'.format(float(l), float(t)))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 異なる重力、異なる結果" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Length(cm) Gravity(m/s^2) Time Period(s) \n 15.0 9.78 0.201 \n 15.0 9.8 0.201 \n 15.0 9.83 0.201 \n 18.0 9.78 0.201 \n 18.0 9.8 0.201 \n 18.0 9.83 0.201 \n 21.0 9.78 0.201 \n 21.0 9.8 0.201 \n 21.0 9.83 0.201 \n 22.5 9.78 0.201 \n 22.5 9.8 0.201 \n 22.5 9.83 0.201 \n 25.0 9.78 0.201 \n 25.0 9.8 0.201 \n 25.0 9.83 0.201 \n" ] } ], "source": [ "from sympy import FiniteSet, pi\n", "\n", "\n", "def time_period(length, g):\n", " g = 9.8\n", " T = 2*pi*(length/g)**0.5\n", " return T\n", "\n", "\n", "if __name__ == '__main__':\n", " L = FiniteSet(15, 18, 21, 22.5, 25)\n", " g_values = FiniteSet(9.8, 9.78, 9.83)\n", " print('{0:^15}{1:^15}{2:^15}'.format('Length(cm)','Gravity(m/s^2)', 'Time Period(s)'))\n", " for elem in L*g_values:\n", " l = elem[0]\n", " g = elem[1]\n", " t = time_period(1/100, g)\n", "\n", " print('{0:^15}{1:^15}{2:^15.3f}'.format(float(l),float(g),float(t)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 確率" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$P(E)=\\frac{n(E)}{n(S)}$ $n(E)=8$かつ$n(S)=20$" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sample space: {1, 2, 3, ..., 18, 19, 20}\nEvent: {2, 3, 5, 7, 11, 13, 17, 19}\nProbability of rolling a prime: 0.40000\n" ] } ], "source": [ "from sympy import FiniteSet\n", "\n", "\n", "def probability(space, event):\n", " return len(event)/len(space)\n", "\n", "\n", "def check_prime(number):\n", " if number != 1:\n", " for factor in range(2, number):\n", " if number % factor == 0:\n", " return False\n", " else:\n", " return False\n", " return True\n", "\n", "\n", "if __name__ == '__main__':\n", " space = FiniteSet(*range(1,21))\n", " primes = []\n", " for num in space:\n", " if check_prime(num):\n", " primes.append(num)\n", " event = FiniteSet(*primes)\n", " p = probability(space, event)\n", " \n", " print('Sample space: {0}'.format(space))\n", " print('Event: {0}'.format(event))\n", " print('Probability of rolling a prime: {0: .5f}'.format(p))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 事象Aまたは事象Bの確率" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$E = {2, 3, 5} \\cup {1, 3, 5 } = { 1, 2, 3, 5}$\n", "\n", "$P(E) = \\frac{n(E)}{n(S)}=\\frac{4}{6}=\\frac{2}{3}$" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.6666666666666666\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 2, 3, 4, 5, 6)\n", "a = FiniteSet(2, 3, 5)\n", "b = FiniteSet(1, 3, 5)\n", "e = a.union(b)\n", "print(len(e)/len(s))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 事象Aおよび事象Bの確率" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$E = A \\cap B = {2, 3, 5} \\cup {1, 3, 5} = {3, 5}$" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.3333333333333333\n" ] } ], "source": [ "from sympy import FiniteSet\n", "s = FiniteSet(1, 2, 3, 4, 5, 6)\n", "a = FiniteSet(2, 3, 5)\n", "b = FiniteSet(1, 3, 5)\n", "e = a.intersect(b)\n", "print(len(e)/len(s))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 乱数生成\n", "#### サイコロ投げをシュミレーションする" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n4\n3\n3\n6\n4\n5\n3\n4\n5\n" ] } ], "source": [ "import random\n", "for i in range(0, 10):\n", " print(random.randint(1, 6))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### その目を出せますか" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rolled: 6\nRolled: 2\nRolled: 4\nRolled: 5\nRolled: 3\nScore of 20 reached in 5 rolls\n" ] } ], "source": [ "'''\n", "総和が20になるまでサイコロをふる\n", "'''\n", "import matplotlib.pyplot as plt\n", "import random\n", "\n", "target_score = 20\n", "\n", "\n", "def roll():\n", " return random.randint(1, 6)\n", "\n", "\n", "if __name__ == '__main__':\n", " score = 0\n", " num_rolls = 0\n", " while score < target_score:\n", " die_roll = roll()\n", " num_rolls += 1\n", " print('Rolled: {0}'.format(die_roll))\n", " score += die_roll\n", " \n", "print('Score of {0} reached in {1} rolls'.format(score, num_rolls)) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 目標点数は可能か" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Probability: 0.00000\nProbability: 0.03241\n" ] } ], "source": [ "from sympy import FiniteSet\n", "import random\n", "\n", "\n", "def find_prob(target_score, max_rolls):\n", " die_sides = FiniteSet(1, 2, 3, 4, 5, 6)\n", " # 標本空間\n", " s = die_sides**max_rolls\n", " # Find the event set\n", " if max_rolls > 1:\n", " success_rolls = []\n", " for elem in s:\n", " if sum(elem) >= target_score:\n", " success_rolls.append(elem)\n", " else:\n", " if target_score > 6:\n", " success_rolls = []\n", " else:\n", " success_rolls = []\n", " for roll in die_sides:\n", " success_rolls.append(roll)\n", " e = FiniteSet(*success_rolls)\n", " # 目標点数に達する確率の計算\n", " return len(e)/len(s)\n", "\n", "\n", "if __name__ == '__main__':\n", " target_score = 25\n", " max_roll = 4\n", " p = find_prob(target_score, max_roll)\n", " print('Probability: {0:.5f}'.format(p))\n", " \n", " target_score = 25\n", " max_roll = 5\n", " p = find_prob(target_score, max_roll)\n", " print('Probability: {0:.5f}'.format(p)) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 非一様乱数" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "50\n" ] } ], "source": [ "import random\n", "\n", "\n", "def toss():\n", " # 0 -> Heads, 1 -> Tails\n", " if random.random() < 2/3:\n", " return 0\n", " else:\n", " return 1\n", "\n", "\n", "'''\n", "各種紙幣を異なる確率で払う空想ATMのシミュレーション\n", "'''\n", "import random\n", "\n", "\n", "def get_index(probability):\n", " c_probability = 0\n", " sum_probability = []\n", " for p in probability:\n", " c_probability += p\n", " sum_probability.append(c_probability)\n", " r = random.random()\n", " for index, sp in enumerate(sum_probability):\n", " if r <= sp:\n", " return index\n", " return len(probability) - 1\n", "\n", "\n", "def dispens():\n", " dollar_bills = [5, 10, 20, 50]\n", " probability = [1/6, 1/6, 1/3, 1/3]\n", " bill_index = get_index(probability)\n", " return dollar_bills[bill_index]\n", "\n", " \n", "if __name__ == '__main__':\n", " print(dispens())" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "ename": "ModuleNotFoundError", "evalue": "No module named 'polar'", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mpolar\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlinspace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m31\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'polar'" ], "output_type": "error" } ], "source": [ "import sys\n", "import polar\n", "import numpy as np\n", "\n", "r = np.linspace(0, 1, 31)\n", "theta = np.linspace(0, 4.0 * np.pi, 31)\n", "x, y = polar.get_xy(r, theta)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }