{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 参加者間のネットワークについて(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "参加者間のネットワークについて、マルコフモデルで統一的にそのモデル化ができることが示されたが、一方でその確率の決め方に今回のモデルの独自性が生まれると考える。そこで、これまでと同じように、距離の概念を入れて状態から状態への遷移確率が決まるとして考えてみる。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(しかし、一般に言って、$i\\rightarrow j$と$j\\rightarrow i$の確率は同じである必要はなく、このような場合を考えるなら、それは\"距離\"としての定義を満たしていない。)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$i$と$j$の間の距離を$d_{ij}(=d_{ji})$とし、その重みを$d_{ij}$の関数として$w_{ij}=w(d_{ij})$とすると、遷移確率は\n", "$$p_{ij} = \\frac{w_{ij}}{\\sum_{j}{w_{ij}}}$$\n", "のようになる。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "以下には最初に考えたように各状態について位置の座標を定義して、その間のユークリッド距離のみで確率が決定するような場合を考える。" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "from Tkinter import *\n", "import numpy as np\n", "from scipy.spatial.distance import euclidean as euc\n", "\n", "\n", "class Main:\n", " \n", " def __init__(self):\n", " self.N = 6\n", " self.app = Calc(self.N)\n", " \n", " def run(self):\n", " self.window = Window(self.N, main=self.app)\n", " self.window.display()\n", "\n", "\n", "class Calc:\n", " \n", " def __init__(self, N):\n", " self.members = dict()\n", " self.N = N\n", "\n", " def calc_P(self):\n", " P = []\n", " for key, v in self.members.items():\n", " _P = []\n", " for n in range(self.N):\n", " d = euc(self.members[key].place, self.members[n].place)\n", " w = self.g(d)\n", " _P.append(w)\n", " P += _P\n", " P = np.array(P).reshape(self.N, self.N)\n", " self.P = []\n", " for _P in P:\n", " s = np.sum(_P)\n", " self.P.append(_P/s)\n", " self.P = np.array(self.P)\n", "\n", " def g(self, x):\n", " # 発言者の物理的距離に対する関数\n", " return np.exp(-x)\n", "\n", "class Person(object):\n", "\n", " def __init__(self, place=np.array([0., 0.])):\n", " # 発言者の実際の位置が2次元の座標として表せる\n", " self.place = place\n", "\n", "\n", "class Window(object):\n", "\n", " def __init__(self, N, main):\n", " self.root = Tk()\n", " self.main = main\n", " self.width = 640\n", " self.height = 480\n", " canvas = Canvas(self.root, width=self.width, height=self.height)\n", " self.var = StringVar()\n", " self.oval(canvas, N)\n", " canvas.bind('', self.pointer)\n", " canvas.pack()\n", " label = Label(self.root, textvariable=self.var, font='Ubuntu 9')\n", " label.pack(side='left')\n", " b1 = Button(self.root, text='calc', command=self.b1_clicked)\n", " b1.pack(side='right')\n", " b2 = Button(self.root, text='save', command=self.b2_clicked)\n", " b2.pack(side='right')\n", "\n", " def oval(self, canvas, N=6):\n", " self.members = dict()\n", " deg = np.linspace(0., 360., N, endpoint=False)\n", " radius = 20\n", " self.r = int((min(self.height, self.width)/2-radius)*0.9)\n", " self.centerx = int(self.width/2)\n", " self.centery = int(self.height/2)\n", " for n in range(N):\n", " rad = np.radians(deg[n])\n", " self.members[n] = Oval(canvas, n+1,\n", " self.centerx+self.r*np.cos(rad),\n", " self.centery+self.r*np.sin(rad),\n", " radius, self.var)\n", "\n", " def pointer(self, event):\n", " self.var.set(\"(%d,%d)\" % (event.x, event.y))\n", "\n", " def b1_clicked(self):\n", " for n in range(self.main.N):\n", " x = (self.members[n].x-self.centerx)/float(self.r)\n", " y = (self.members[n].y-self.centery)/float(self.r)\n", " self.main.members[n] = Person(place=np.array([x, y]))\n", " self.main.calc_P()\n", " self.root.destroy()\n", " \n", " def b2_clicked(self):\n", " import tkFileDialog\n", " import os\n", "\n", " fTyp = [('eps file', '*.eps'), ('all files', '*')]\n", " filename = tkFileDialog.asksaveasfilename(filetypes=fTyp,\n", " initialdir=os.getcwd(),\n", " initialfile='figure_1.eps')\n", "\n", " if filename is None:\n", " return\n", " try:\n", " self.canvas.postscript(file=filename)\n", " except TclError:\n", " print \"\"\"\n", " TclError: Cannot save the figure.\n", " Canvas Window must be alive for save.\"\"\"\n", " return 1\n", " \n", " def display(self):\n", " self.root.mainloop()\n", "\n", "\n", "class Oval:\n", "\n", " def __init__(self, canvas, id, x, y, r, var):\n", " self.c = canvas\n", " self.x = x\n", " self.y = y\n", " self.var = var\n", " self.tag = str(id)\n", " self.c.create_oval(x-r, y-r, x+r, y+r, outline='', fill='#069', tags=self.tag)\n", "\n", " self.c.tag_bind(self.tag, '', self.pressed)\n", " self.c.tag_bind(self.tag, '', self.dragging)\n", "\n", " def pressed(self, event):\n", " self.x = event.x\n", " self.y = event.y\n", "\n", " def dragging(self, event):\n", " self.c.move(self.tag, event.x - self.x, event.y - self.y)\n", " self.x = event.x\n", " self.y = event.y" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def cal_f(n, P, K): \n", " f = np.identity(n) + P\n", " if K == 1:\n", " return f\n", " for k in range(2, K+1):\n", " _k = 2\n", " tmp = P\n", " while _k < k+1:\n", " tmp = np.dot(tmp, P)\n", " _k += 1\n", " f += tmp\n", " return f" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012345
0 0.333575 0.161861 0.125993 0.111192 0.119210 0.148170
1 0.133705 0.275550 0.173149 0.135611 0.134642 0.147343
2 0.102755 0.170949 0.272049 0.174709 0.147433 0.132106
3 0.092117 0.136005 0.177471 0.276351 0.182568 0.135488
4 0.097598 0.133445 0.148002 0.180420 0.273100 0.167436
5 0.124496 0.149872 0.136102 0.137414 0.171837 0.280279
\n", "

6 rows × 6 columns

\n", "
" ], "text/plain": [ " 0 1 2 3 4 5\n", "0 0.333575 0.161861 0.125993 0.111192 0.119210 0.148170\n", "1 0.133705 0.275550 0.173149 0.135611 0.134642 0.147343\n", "2 0.102755 0.170949 0.272049 0.174709 0.147433 0.132106\n", "3 0.092117 0.136005 0.177471 0.276351 0.182568 0.135488\n", "4 0.097598 0.133445 0.148002 0.180420 0.273100 0.167436\n", "5 0.124496 0.149872 0.136102 0.137414 0.171837 0.280279\n", "\n", "[6 rows x 6 columns]" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pandas import DataFrame\n", "main = Main()\n", "def g(x):\n", " return 1./(1+x)\n", "main.app.g = g\n", "main.run()\n", "DataFrame(main.app.P)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012345
0 15.423693 17.151696 17.315426 17.024868 17.238498 16.845818
1 14.168166 18.278681 17.380701 17.064849 17.264082 16.843520
2 14.121725 17.159921 18.493416 17.117771 17.283518 16.823649
3 14.104293 17.114469 17.388423 18.234201 17.329755 16.828858
4 14.113258 17.110581 17.350238 17.125873 18.429867 16.870184
5 14.154327 17.132605 17.332561 17.068061 17.313669 17.998776
\n", "

6 rows × 6 columns

\n", "
" ], "text/plain": [ " 0 1 2 3 4 5\n", "0 15.423693 17.151696 17.315426 17.024868 17.238498 16.845818\n", "1 14.168166 18.278681 17.380701 17.064849 17.264082 16.843520\n", "2 14.121725 17.159921 18.493416 17.117771 17.283518 16.823649\n", "3 14.104293 17.114469 17.388423 18.234201 17.329755 16.828858\n", "4 14.113258 17.110581 17.350238 17.125873 18.429867 16.870184\n", "5 14.154327 17.132605 17.332561 17.068061 17.313669 17.998776\n", "\n", "[6 rows x 6 columns]" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K = 100\n", "DataFrame(cal_f(6, main.app.P, K))" ] } ], "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 }