└── Markov Random Field.ipynb /Markov Random Field.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 13, 6 | "id": "f160dd8c", 7 | "metadata": { 8 | "scrolled": true 9 | }, 10 | "outputs": [ 11 | { 12 | "name": "stderr", 13 | "output_type": "stream", 14 | "text": [ 15 | "WARNING:pgmpy:MarkovModel has been renamed to MarkovNetwork. Please use MarkovNetwork class, MarkovModel will be removed in future.\n", 16 | "WARNING:pgmpy:MarkovModel has been renamed to MarkovNetwork. Please use MarkovNetwork class, MarkovModel will be removed in future.\n", 17 | "WARNING:pgmpy:MarkovModel has been renamed to MarkovNetwork. Please use MarkovNetwork class, MarkovModel will be removed in future.\n", 18 | "WARNING:pgmpy:MarkovModel has been renamed to MarkovNetwork. Please use MarkovNetwork class, MarkovModel will be removed in future.\n" 19 | ] 20 | }, 21 | { 22 | "name": "stdout", 23 | "output_type": "stream", 24 | "text": [ 25 | "Most probable state assignment: {'A': 0, 'B': 1, 'C': 1, 'D': 0}\n" 26 | ] 27 | } 28 | ], 29 | "source": [ 30 | "from pgmpy.models import MarkovModel\n", 31 | "from pgmpy.factors.discrete import DiscreteFactor\n", 32 | "from pgmpy.inference import BeliefPropagation\n", 33 | "\n", 34 | "# Define the Markov Random Field model\n", 35 | "model = MarkovModel()\n", 36 | "\n", 37 | "# Define the nodes\n", 38 | "model.add_nodes_from(['A', 'B', 'C', 'D'])\n", 39 | "\n", 40 | "# Define the edges (undirected)\n", 41 | "model.add_edges_from([('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'A')])\n", 42 | "\n", 43 | "# Define the factors\n", 44 | "factor_ab = DiscreteFactor(['A', 'B'], cardinality=[2, 2], values=[30, 5, 1, 10])\n", 45 | "factor_bc = DiscreteFactor(['B', 'C'], cardinality=[2, 2], values=[100, 1, 1, 100])\n", 46 | "factor_cd = DiscreteFactor(['C', 'D'], cardinality=[2, 2], values=[1, 100, 100, 1])\n", 47 | "factor_da = DiscreteFactor(['D', 'A'], cardinality=[2, 2], values=[100, 1, 1, 100])\n", 48 | "\n", 49 | "# Add factors to the model\n", 50 | "model.add_factors(factor_ab, factor_bc, factor_cd, factor_da)\n", 51 | "\n", 52 | "# Perform inference using Belief Propagation\n", 53 | "bp = BeliefPropagation(model)\n", 54 | "# You can provide evidence here if needed using bp.map_query(variables=['A', 'B'], evidence={'C': 0})\n", 55 | "result = bp.map_query()\n", 56 | "\n", 57 | "print(\"Most probable state assignment:\", result)\n" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 14, 63 | "id": "a299cb80", 64 | "metadata": {}, 65 | "outputs": [ 66 | { 67 | "name": "stderr", 68 | "output_type": "stream", 69 | "text": [ 70 | "WARNING:pgmpy:MarkovModel has been renamed to MarkovNetwork. Please use MarkovNetwork class, MarkovModel will be removed in future.\n" 71 | ] 72 | }, 73 | { 74 | "data": { 75 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAE+CAYAAADyPXUxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABDeUlEQVR4nO3deVxUZf//8deBYUdBUUtcsNxAcUMU9XZLK3czMzVzyyUrKzBN89afe+auZN3aN9dKRcM0V1wz09xwV5YwC/dQFBBkm5nz+2NuMNNbZZk5A/N5Ph4+YmbOnPMZYuY913XOdV2KqqoqQgghhI2w07oAIYQQwpIk+IQQQtgUCT4hhBA2RYJPCCGETZHgE0IIYVMk+IQQQtgUCT5hFf78808URUGv12tdSqGpUqUKu3fv1uz4HTp0YOXKlU+1raIoXLhw4ZGPrVixgubNmxdmaU+Ul2MOHDiQ8ePHm7kiUZxI8Ik8qVKlCo6Ojty6deuB++vXr4+iKPz555/aFPYU9u3bh52dHe7u7pQoUYKaNWuyfPlyrcsqsIEDB+Lo6Ii7u3vuv7Vr17J9+3YGDBhg1mPnfGEJCAh44P5bt27h6OhIlSpVzHp8IfJDgk/k2XPPPceaNWtyb589e5b09PR878+SrTxvb29SU1NJSUlh/vz5DB06lNjYWIsd31xGjx5Nampq7r9evXpZ9PhpaWmcO3cu9/bq1at57rnnLFqDEE9Lgk/kWb9+/fjmm29yb69cuZL+/fs/sM3WrVtp0KABJUuWpFKlSkyaNCn3sZxWwtKlS6lcuTJt2rR56Bjr16+nSpUqnDt3jszMTEJCQvD29sbb25uQkBAyMzMB8PPzY8uWLbnP0+v1lClThhMnTjz2NSiKQseOHSldujRnzpwB4M6dO3Tu3JmyZctSqlQpOnfuzJUrV3Kf07p1a/7f//t//Otf/6JEiRK8/PLLD7R8v/32W3x8fPDy8uLTTz994HiPew379u2jYsWKzJo1i3LlylG+fHk2btzItm3bqFGjBqVLl2b69OmPfT2P0rp1a5YsWZJ7e9myZfj5+VGqVCnatWtHfHz8I5+XmJhI165dKVmyJI0bN+b3339/4rH69ev3QLfqN99889DfRHR0NK1bt8bT05PatWuzadOmpz5mTEwML730EqVLl6ZmzZqsW7fuqX4HQjyKBJ/IsyZNmpCSkkJ0dDQGg4G1a9fSt2/fB7Zxc3Pjm2++ISkpia1bt7Jo0SI2btz4wDY///wz0dHR7Nix44H7ly9fzpgxY9i9ezf+/v58+umnHD58mFOnTnH69GmOHj3KtGnTAHjjjTceaH3u2LGDMmXKPNT19k9Go5FNmzZx69YtqlWrlnvfW2+9RXx8PJcuXcLFxYX333//geetXr2a5cuXk5CQQFZWFnPmzAEgKiqKd999l2+//ZZr166RmJj4QGg+7jUA3Lhxg4yMDK5evcqUKVMYOnQo3333HcePH+eXX35hypQpXLx48bGv6XE2btzI9OnT+eGHH7h58yYtWrTgjTfeeOS2w4cPx9nZmevXr7Ns2TKWLVv2xP337duXsLAwDAYD0dHR3L17l6CgoNzHs7Oz6dKlCy+//DIJCQksXLiQN998M7e1/bhjpqWl8dJLL9GnTx8SEhJYs2YN7733HufPn8/370PYOFWIPPDx8VF37dqlTp06Vf3kk0/U7du3qy+++KKanZ2tAuoff/zxyOcFBwerISEhqqqq6h9//KEC6u+//577eM59s2fPVv38/NTLly/nPvb888+rW7duzb0dERGh+vj4qKqqqnFxcaq7u7ualpamqqqq9unTR508efIja/jpp59URVFUDw8P1dHRUbWzs1Pnz5//P1/ryZMnVU9Pz9zbrVq1UqdOnZp7+8svv1TbtWunqqqqTp48We3Vq1fuY6mpqaqDg4O6a9euJ76Gn376SXV2dlb1er2qqqqakpKiAurhw4dztw8ICFA3bNjwyDoHDBigOjk5qR4eHqqHh4fq5eWVW+/XX3+tqqqqtm/fXl2yZEnucwwGg+ri4qL++eefqqqqKqDGxcWper1e1el0anR0dO62Y8eOVf/1r3898tg5/9+ys7PVtm3bqhEREeqYMWPUadOmqbt27cp9jfv371efeeYZ1WAw5D63d+/e6sSJE594zLCwMLV58+YPHPftt99WJ02alPv6x40b98j6hHgUafGJfOnXrx+rV69mxYoVD3VpARw5coQXXniBsmXL4uHhweLFix+6IKZSpUoPPW/27NkMHz6cihUr5t537do1fHx8cm/7+Phw7do1AKpVq4afnx+bN2/m3r17bNq0iT59+vzPur29vUlKSiIlJYUPP/yQvXv35j527949hg0bho+PDyVLlqRly5YkJSVhMBhy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\n", 76 | "text/plain": [ 77 | "
" 78 | ] 79 | }, 80 | "metadata": {}, 81 | "output_type": "display_data" 82 | } 83 | ], 84 | "source": [ 85 | "import networkx as nx\n", 86 | "import matplotlib.pyplot as plt\n", 87 | "from pgmpy.models import MarkovModel\n", 88 | "\n", 89 | "# Define the Markov Random Field model\n", 90 | "model = MarkovModel()\n", 91 | "\n", 92 | "# Define the nodes\n", 93 | "model.add_nodes_from(['A', 'B', 'C', 'D'])\n", 94 | "\n", 95 | "# Define the edges (undirected)\n", 96 | "model.add_edges_from([('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'A')])\n", 97 | "\n", 98 | "# Create a directed graph from the model\n", 99 | "graph = nx.Graph(model.edges())\n", 100 | "\n", 101 | "# Draw the graph\n", 102 | "pos = nx.spring_layout(graph) # positions for all nodes\n", 103 | "nx.draw(graph, pos, with_labels=True, node_color='skyblue', node_size=1500, font_size=12, font_weight='bold', arrows=False)\n", 104 | "nx.draw_networkx_edge_labels(graph, pos, edge_labels={(u, v): f\"{u}-{v}\" for u, v in model.edges()}, font_color='red')\n", 105 | "\n", 106 | "plt.title(\"Markov Random Field Model\")\n", 107 | "plt.show()\n" 108 | ] 109 | } 110 | ], 111 | "metadata": { 112 | "kernelspec": { 113 | "display_name": "Python 3 (ipykernel)", 114 | "language": "python", 115 | "name": "python3" 116 | }, 117 | "language_info": { 118 | "codemirror_mode": { 119 | "name": "ipython", 120 | "version": 3 121 | }, 122 | "file_extension": ".py", 123 | "mimetype": "text/x-python", 124 | "name": "python", 125 | "nbconvert_exporter": "python", 126 | "pygments_lexer": "ipython3", 127 | "version": "3.9.12" 128 | } 129 | }, 130 | "nbformat": 4, 131 | "nbformat_minor": 5 132 | } 133 | --------------------------------------------------------------------------------