PAM/pam.ipynb

1051 lines
245 KiB
Plaintext
Raw Permalink Normal View History

2024-06-16 23:05:46 +02:00
{
"cells": [
{
"cell_type": "markdown",
"source": [
"# Algorytm PAM (Partitioning Around Medoids)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"Input:\n",
"\n",
"* dane w N wymiarach (zbiór punktów)\n",
"* metrykę dystansu (tutaj zakładamy odległość euklidesową)\n",
"\n",
"Output:\n",
"\n",
"* Znalezione skupienia punktów które są bliskie sobie\n",
"* Liczba skupień (k) jest wybranym przez użytkownika parametrem"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"#### Przykład klasteryzacji:\n",
"\n",
"\n",
"![Grupowanie](clustering.png \"Title\")"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"Algorytm PAM jest bardzo podobny do popularnego k-means\n",
"\n",
"*Główna różnica jest taka że środkiem znalezionego skupienia jest jeden z punktów z danych wejściowych, a w k-means zwykle tak nie jest*\n",
"\n",
"Pod względem wydajnościowym PAM jest zwykle wolniejszy niż k-means ale bardziej odporny na obserwacje odstające (dzięki temu że środek grupy musi być jednym z punktów)."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"### Algorytm\n",
"\n",
"1. Wybranie losowo *k* punktów jako pierwszych medoid\n",
"2. Przypisanie każdego z punktów w danych do najbliższej medoidy\n",
"3. Tak długo jak następują zmiany / poprawa dystansów:\n",
" 1. Dla każdej z medoid podmieniamy ją z nie-medoidami i patrzymy, czy nastąpiała poprawa dystansów\n",
" 2. Jeśli tak, to wykonujemy podmianę i zapamiętujemy obecną wartość średniego dystansu"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"## Implementacja PAM (bez numpy)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 46,
"outputs": [],
"source": [
"from __future__ import annotations\n",
"from typing import Sequence\n",
"\n",
"# Własna implementacja wielowymiarowych punktów\n",
"class Point:\n",
" def __init__(self, coordinates : Sequence[float]):\n",
" self.coordinates = coordinates\n",
" def __str__(self):\n",
" return str(['{:.2f}'.format(x) for x in self.coordinates])\n",
" def __repr__(self):\n",
" return self.__str__()\n",
" def distance_to(self, other : Point) -> float: # Dystans euklidesowy\n",
" if len(self.coordinates)!=len(other.coordinates): # Punkty muszą mieć te same wymiary\n",
" raise ValueError\n",
" dist = 0\n",
" for x, y in zip(self.coordinates, other.coordinates):\n",
" dist+=(x-y)**2\n",
" dist = dist**(1/2)\n",
" return dist"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 47,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.4641016151377544\n"
]
}
],
"source": [
"point_1 = Point([3,3,3])\n",
"point_2 = Point([1,1,1])\n",
"\n",
"print(point_1.distance_to(point_2))"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 48,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['3.00', '3.00', '3.00']\n"
]
}
],
"source": [
"print(point_1)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"### Funkcje pomocnicze do generowania wielowymiarowych danych dookoła punktów"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"Dystans względem każdego z wymiarów"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 49,
"outputs": [],
"source": [
"import random\n",
"\n",
"def generate_data(centers : Sequence[Point], data_points : int, x_y_dist_from_center : float) -> Sequence[Point]: # Dystans manhattański\n",
" points = []\n",
" for x in range(data_points):\n",
" center = random.choice(centers)\n",
" coords = []\n",
" for index in range(len(center.coordinates)):\n",
" existing_coord = center.coordinates[index]\n",
" coords.append(existing_coord+random.uniform(-x_y_dist_from_center,x_y_dist_from_center))\n",
" points.append(Point(coords))\n",
" return points"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"Losowe punkty w odległości euklidesowej od punktu\n",
"\n",
"1. Wybór punktu (centrum)\n",
"2. Losowanie wektora kierunku + normalizacja\n",
"3. Mnożenie wektora kierunku przez losową odległość z zakresu (-dystans, dystans)\n",
"4. Dodanie tego wektora do centrum"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 50,
"outputs": [],
"source": [
"def generate_data_sphere(centers : Sequence[Point], data_points : int, dist_from_center : float) -> Sequence[Point]: # Dystans euklidesowy (losowy wektor kierunku * losowy dystans)\n",
" points = []\n",
" for x in range(data_points):\n",
" center = random.choice(centers)\n",
" direction_vector = []\n",
" for i in range(len(center.coordinates)):\n",
" direction_vector.append(random.uniform(-1,1))\n",
" direction_vector_length = 0\n",
" for i in range(len(direction_vector)):\n",
" direction_vector_length+=direction_vector[i]**2\n",
" direction_vector_length = direction_vector_length**(1/2)\n",
" direction_vector_normalized = [z/direction_vector_length for z in direction_vector]\n",
" random_length = random.uniform(-dist_from_center, dist_from_center)\n",
" coords_1 = [i*random_length for i in direction_vector_normalized]#direction_vector_normalized*random_length\n",
" coords_2 = [x+y for x,y in zip(center.coordinates, coords_1)]\n",
" points.append(Point(coords_2))\n",
" return points"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 51,
"outputs": [
{
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "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
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"def draw_custom_points(point_list : Sequence[Point]): #2D\n",
" x_values = [point.coordinates[0] for point in point_list]\n",
" y_values = [point.coordinates[1] for point in point_list]\n",
" plt.scatter(x_values, y_values)\n",
" plt.show()\n",
"\n",
"generated_points = generate_data([Point([-3,3]), Point([3,3]), Point([0,0])],data_points=50, x_y_dist_from_center=1)\n",
"\n",
"draw_custom_points(generated_points)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 52,
"outputs": [
{
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "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
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"generated_points_sphere = generate_data_sphere([Point([-3,3]), Point([3,3]), Point([0,0])],data_points=50, dist_from_center=1)\n",
"\n",
"draw_custom_points(generated_points_sphere)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 53,
"outputs": [
{
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "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
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"generated_points = generate_data([Point([-2,-1]), Point([0,0]), Point([3,0])],data_points=250, x_y_dist_from_center=1)\n",
"\n",
"draw_custom_points(generated_points)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 54,
"outputs": [
{
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "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
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"generated_points = generate_data_sphere([Point([-2,-1]), Point([0,0]), Point([3,0])],data_points=250, dist_from_center=1)\n",
"\n",
"draw_custom_points(generated_points)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"### Funkcja do wizualizacji grup"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 55,
"outputs": [],
"source": [
"def draw_clustering(assignment): # Pojedynczy obraz\n",
" for medoid in assignment.keys():\n",
" point_list = assignment[medoid]\n",
" x_values = [point.coordinates[0] for point in point_list]\n",
" y_values = [point.coordinates[1] for point in point_list]\n",
" plt.scatter(x_values, y_values, alpha=0.5)\n",
" x_values = [point.coordinates[0] for point in assignment.keys()]\n",
" y_values = [point.coordinates[1] for point in assignment.keys()]\n",
" plt.scatter(x_values, y_values,color='r', marker='*')\n",
" plt.show()"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"### Implementacja PAM"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 56,
"outputs": [],
"source": [
"def medoid_similarity(medoid : Point, other_points : Sequence[Point]) -> float: # Suma dystansów punktów od danej medoidy\n",
" distances = 0\n",
" for point in other_points:\n",
" distances+= medoid.distance_to(point)\n",
" return distances\n",
"\n",
"def assign_points_to_medoids(medoids : Sequence [Point], points : Sequence [Point]) -> dict():\n",
" assignments = dict()\n",
" for i in medoids:\n",
" assignments[i] = []\n",
" for point in points:\n",
" minimum_distance = point.distance_to(medoids[0])\n",
" selected_medoid = medoids[0]\n",
" for med in medoids[1:]:\n",
" new_distance = point.distance_to(med)\n",
" if new_distance<minimum_distance:\n",
" minimum_distance = new_distance\n",
" selected_medoid = med\n",
" assignments[selected_medoid].append(point)\n",
" return assignments\n",
"\n",
"def evaluate_assignment(assignment): # Suma dystansów wszystkich punktów od swoich medoid\n",
" sum_of_distances = 0\n",
" for i in assignment.keys():\n",
" sum_of_distances+=medoid_similarity(i,assignment[i])\n",
" return sum_of_distances\n",
"\n",
"def pam_clustering(points : Sequence[Point], k : int):\n",
" # Inicjalizacja\n",
" if k<2 or len(points)<k:\n",
" raise ValueError\n",
" medoids = random.sample(points, k)\n",
" assignments = assign_points_to_medoids(medoids, points)\n",
"\n",
" # Aktualizacja\n",
" finished = False\n",
" counter = 1\n",
" while not finished:\n",
" print(f\"Iteracja #{counter}\")\n",
" counter+=1\n",
" finished = True # Zmienione jeśli zmieni się którakolwiek medoida\n",
" old_medoids = list(assignments.keys())\n",
" sum_of_distances = evaluate_assignment(assignments)\n",
" print(f\"Suma dystansów: {sum_of_distances}\")\n",
" for med in old_medoids:\n",
" for p in points:\n",
" if p in old_medoids:\n",
" continue # Punkt już był medoidą więc go nie podmieniamy\n",
" temp_medoids = list(old_medoids)\n",
" temp_medoids.remove(med)\n",
" temp_medoids.append(p)\n",
" temp_assignment = assign_points_to_medoids(temp_medoids, points)\n",
" new_distance = evaluate_assignment(temp_assignment)\n",
" if new_distance<sum_of_distances:\n",
" finished = False\n",
" assignments = temp_assignment\n",
" return assignments"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 57,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Iteracja #1\n",
"Suma dystansów: 434.617796455687\n",
"Iteracja #2\n",
"Suma dystansów: 264.08951904585876\n",
"Iteracja #3\n",
"Suma dystansów: 261.2793052260453\n",
"Iteracja #4\n",
"Suma dystansów: 260.85114450030653\n",
"Iteracja #5\n",
"Suma dystansów: 260.6058082820335\n",
"Iteracja #6\n",
"Suma dystansów: 260.4464699552831\n",
"Iteracja #7\n",
"Suma dystansów: 260.10321768609066\n",
"Iteracja #8\n",
"Suma dystansów: 196.62056427902047\n",
"Iteracja #9\n",
"Suma dystansów: 182.11973310593467\n",
"Iteracja #10\n",
"Suma dystansów: 165.26633815194202\n",
"Iteracja #11\n",
"Suma dystansów: 164.96801655579426\n",
"Iteracja #12\n",
"Suma dystansów: 164.76351795007898\n",
"Iteracja #13\n",
"Suma dystansów: 164.7398575438859\n",
"Iteracja #14\n",
"Suma dystansów: 127.60705219305643\n",
"Iteracja #15\n",
"Suma dystansów: 126.90465381027721\n",
"Iteracja #16\n",
"Suma dystansów: 125.85723677651899\n",
"Iteracja #17\n",
"Suma dystansów: 125.72984134429592\n"
]
}
],
"source": [
"assigned = pam_clustering(generated_points, 3)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 58,
"outputs": [
{
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "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
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"draw_clustering(assigned)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 59,
"outputs": [
{
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGdCAYAAAAvwBgXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABGrUlEQVR4nO3df3hV1Zkv8O8JQiBIAgEkQRERrIVGQakIwrXC4IhyBcepz4i1o9ZLq9VeK04HaKWWYRzksXfUR6w/aIV2KFDvWItKy3NFqAxMqK0YbQpYiAFsSNAkcA4GCWly7h9xx5OT/WPtvdfea+29v5/n4XkknpOz2eecvd79rne9K5XNZrMgIiIiUqBA9QEQERFRcjEQISIiImUYiBAREZEyDESIiIhIGQYiREREpAwDESIiIlKGgQgREREpw0CEiIiIlDlD9QHY6ejowJEjRzBgwACkUinVh0NEREQCstksTpw4geHDh6OgwD7noXUgcuTIEYwYMUL1YRAREZEHH3zwAc455xzbx2gdiAwYMABA5z+kuLhY8dEQERGRiEwmgxEjRnSN43a0DkSM6Zji4mIGIkRERBEjUlbBYlUiIiJShoEIERERKcNAhIiIiJRhIEJERETKMBAhIiIiZRiIEBERkTIMRIiIiEgZBiJERESkjNYNzYiIKNraO7J4s7YZH544hbMG9MWkUaXoVcC9w+gzDESIiFzgwCpuc3U9lr6yB/XpU10/Ky/pi4euH4dZFeUKj4x0wkCEiEgQB1Zxm6vrcffa3cjm/bwhfQp3r92Np2+9lOeMALBGhIhIiDGw5gYhwGcD6+bqekVHpp/2jiyWvrKnRxACoOtnS1/Zg/YOs0dQ0jAQISJywIHVnTdrm3sEbLmyAOrTp/BmbXN4B0XaYiBCRORA9cDa3pFFZU0TNlbVobKmSfuA58MT1ufKy+Mo3lgjQkTkQOXAGsW6lLMG9JX6OIo3ZkSIiBwcbGwRepzsgTWqdSmTRpWivKQvrNYSpdAZTE0aVRrmYZGmGIgQEdnYXF2Px7bst31MEANrlOtSehWk8ND140yP3QhOHrp+HJc9EwAGIkREloxgQITsgVV1XYoMA4t69/hZSVFvLt2lblgjQkRkwSkYMHx75uekD6xRLvi06iECAOmTbaEfD+mNGREiIguig/x5Q4qkv3ZUCz7tppQMuk4pkRoMRIiILKgMBqJa8BmHKSUKFwMRIiILKoMBo+DTeJ381wX0LPiM8pQSqcFAhIgCEbUmXGZUBwOzKsrx9K2Xoqyke8alrKSvtgWfotmhxhOtkfxMkHypbDar7Schk8mgpKQE6XQaxcXFqg+HiARFsQmXHdX/nijt+NvekcW0FVvRkD5lWycCRPszQfbcjN8MRIhIKqsVE8awqeudvJMoBQOqGZ8BALbBSNQ/E2TNzfjNqRkikibKTbic9CpIYcrowZg74WxMGT2YQYgNqymlfFH/TJAcDESISBqumCDDrIpy7Fg4A0tmj7V9HD8TxECEiKThignK1asghSEDCoUey89EcjEQISJpotqEi4LDzwQ5YSBCRNJEtQkXBYefCXLCQISIpFHdd4P0w88EOWEgQkRSRbEJFwWLnwmywz4iRBQIq74b7MeRXHzvk8PN+H1GSMdERAlj9N3IpbpDKall9pkg4tQMEYXC6LaZ32ekIX0Kd6/djc3V9YqOjIhUYiBCRIGLc8fVqInDZoQUL5yaIaLAuem4ytR9cDg1RjpiRoSIAseOq+pxaox0xUCEiALH7ppqcWqMdMZAhIgCx+6aakVlM0LWryQTa0SIKHBGd8271+5GCuh2Z87umsGLwtQY61eSK9CMyPbt23H99ddj+PDhSKVS+NWvfhXkyxGRxthdUx3dp8bCql9hxkVPgWZEWlpaMH78eHzta1/DjTfeGORLEZFiIl0zZ1WU4+pxZeyuGTJjaqwhfcq0TiSFzoBQxdSYU/1KCp31K1ePK/P1OWHGRV+BBiLXXnstrr322iBfgog04OYiz+6a4dN5aiyMpd1GxiU/2DEyLszIqaVVsWpraysymUy3P0SkD7PUNpeFRoOuU2NB169wxZD+tCpWXb58OZYuXar6MIjIhFnWo6y4L079tT3wtDrJoePUWND1K2ympz+tMiKLFy9GOp3u+vPBBx+oPiQigk0xYeYUjp9ss3yeLstC6TPG1NjcCWdjyujBygPEoJd2R2HFUNJpFYgUFhaiuLi42x8iUssutS2KF3myYtSvAOgRjMioX9F9xRBpFogQkX6cUtsieJEnO0HWr7CZnv4CrRH5+OOPceDAga6/19bWoqqqCqWlpTj33HODfGkiksRPNkPlslCKlqDqV3ReMUSdAg1E/vCHP2D69Oldf1+wYAEA4LbbbsOaNWuCfGki8snoC7L/6Meenh/URV6kXwnpy+79C2ppt5Fx6VFszT4iWkhls1lt1yxlMhmUlJQgnU6zXoQoRGYrZKykAAws6o3CMwrQkGnt+nkQzaLYlCraVL9/DGLD42b8ZiBCRN1YNX8yY1zCn7710sCXhVodV+4xMBjRF9+/ZHEzfmvVR4SI1HK7QiY/tR1UH4aw2oBTMPj+MRtjh4EIEXURXSFz7/TRmDpmaGgXUzalirakv3+qp6R0x+W7RNRFdIXMBcMGhNoMi02poi3J7x+3QHDGQISIuuja/EnX4yIxSX3/uM+NGAYiRNRF1+ZPuh4XiUnq++dmSirJGIgQUZeg223H7bhITFLfvyRPSbnBQISIutF1u3hdj4vEJPH9S+qUlFvsI0IUU36XC+q63FDX4yIxur5/QRxXe0cW01ZsRUP6lGmdiLEFwo6FM7Q4BzKxjwhRhMm4IMpYLhhUu22/dD0uEuP1/QsygAlqeS33uRHDjAiRRmRcENnBkuImyD4cYXxfkthHhC3eiSJIxgXRSAVbVerHORVM8RRkoBDm90XXKamguBm/WaxKpAFZ/QZ0Xi7Y3pFFZU0TNlbVobKmKfG9E8hZ0H04wvy+GFNScyecHWozwChgjQiRBmS1wNZ1uWASU9PkX9Ct4XX9viQNMyJEGpB1QdRxuSBbXJNXQQcKOn5fkoiBCJEGZF0QdetgyRbX5EfQgYJu35ekYiBCpAFZF0TdOljqXLNC+gs6UNDt+5JUDESINCDzgqhTB8u4z8GzADdYYQQKOn1fkorLd4k0IrOoU4flgpU1TZi3apfj49bPnxy5JmUswA1PGOdah+9LnLCPCFGExemCGNcW12waJ5fIZz5O34skYIt3ogiLUwvzOLa4dirATaGzAPfqcWWR+nepIprtiNP3grpjjQgRBSpuc/AswJWHS7sJYEaEiEIwq6IcV48ri0VqPe4FuGFhZokMDESIKBRxSa2zCZYcQXdNpehgIEJEsSa7yNHobeFUgMsmWPaYWSIDAxEiiq0gln3GsQBXBWaWyMBiVSKKpSALIeNWgBuG/OZvE0cOYnt1AsCMCBHFUBiFkHEqwA2aVWZqzvhyPLe9lpmlhGMgQkSxE1YhZFwKcINk1fytIX0Kz22vxdevHIWX36nv9n6VsUNtojAQIaLYYSGkHkQyUy+/U483vjMdbx06xsxSQjEQIaLYYSGkHkQzU28dOsbMUoIxECEirXlZfssltnpgZopEMBAhIm15XX7LJbZ6YGaKRHD5LlHC5S+rbO/QY0Nuv8tvo7DEVtdzL4uRmeISXbLDjAhRggXR8EsGWctvdV5iq+u5l4mZKRLBjAhRQum886nMHW6NJbZzJ5yNKaMHazHo6XzuZYtCZkpE3LNXKjEjQpRAuu98GuciR93PfRB0zkyJSEL2SiVmRIhCpMtdlcyMQxDiXOSo+7kPio6ZKRFJyl6pwowIUUh0uqvSPeMQ5+W3up97+kwSs1cqMCNCFAKnu6pfv3sk1EyJ7hkHo8gRQI8VF1EvctT93NNnkpq9ChszIkQBc7qrAoB717+N3Ngj6ExJFDIORpFjfhYp6vuQROHcUydmr8LBQIQoYE53VQCQnwAxMiVBrSqIyrLKqBc5monKuSdmr8LCqRmigHm5WzIGp6Wv7AlsmiYqyyqjWuRoJyrnPunYkC0
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"generated_points = generate_data_sphere([Point([-1,-1.5]), Point([-0.5,-0.5]), Point([0.5,0])],data_points=250, dist_from_center=1.5)\n",
"\n",
"draw_custom_points(generated_points)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 60,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Iteracja #1\n",
"Suma dystansów: 243.98967622114225\n",
"Iteracja #2\n",
"Suma dystansów: 222.0364217881434\n",
"Iteracja #3\n",
"Suma dystansów: 216.99784343452706\n",
"Iteracja #4\n",
"Suma dystansów: 208.83179723203483\n",
"Iteracja #5\n",
"Suma dystansów: 189.60895077892857\n",
"Iteracja #6\n",
"Suma dystansów: 188.71433884981388\n",
"Iteracja #7\n",
"Suma dystansów: 180.490761866527\n",
"Iteracja #8\n",
"Suma dystansów: 180.19838386092528\n",
"Iteracja #9\n",
"Suma dystansów: 179.8660553672085\n",
"Iteracja #10\n",
"Suma dystansów: 179.8536292324992\n",
"Iteracja #11\n",
"Suma dystansów: 178.97570181315245\n",
"Iteracja #12\n",
"Suma dystansów: 178.89244011436267\n",
"Iteracja #13\n",
"Suma dystansów: 178.34753499716496\n",
"Iteracja #14\n",
"Suma dystansów: 178.19596929138834\n",
"Iteracja #15\n",
"Suma dystansów: 165.77720257659146\n",
"Iteracja #16\n",
"Suma dystansów: 164.18186436174895\n",
"Iteracja #17\n",
"Suma dystansów: 164.0636488364166\n",
"Iteracja #18\n",
"Suma dystansów: 163.10129112522043\n",
"Iteracja #19\n",
"Suma dystansów: 162.98527642121257\n",
"Iteracja #20\n",
"Suma dystansów: 162.30806701011045\n",
"Iteracja #21\n",
"Suma dystansów: 162.18265851612782\n",
"Iteracja #22\n",
"Suma dystansów: 161.86121102326487\n"
]
}
],
"source": [
"assigned = pam_clustering(generated_points, 3)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"Dużo iteracji jest \"zmarnowane\" na bardzo drobne poprawy dystansu"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 61,
"outputs": [
{
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "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
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"draw_clustering(assigned)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 63,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{['-0.41', '-0.55']: [['-0.74', '-0.32'],\n",
" ['-0.62', '-0.18'],\n",
" ['-0.26', '0.06'],\n",
" ['-0.13', '-0.72'],\n",
" ['-0.53', '-0.36'],\n",
" ['0.22', '-0.80'],\n",
" ['-0.64', '-0.34'],\n",
" ['-0.20', '-1.12'],\n",
" ['0.38', '-1.42'],\n",
" ['-0.25', '-0.30'],\n",
" ['-0.33', '-0.19'],\n",
" ['-0.70', '-0.90'],\n",
" ['-1.50', '-0.44'],\n",
" ['-0.32', '-0.95'],\n",
" ['-0.17', '-0.70'],\n",
" ['0.30', '-0.99'],\n",
" ['-0.42', '-0.62'],\n",
" ['-1.65', '0.04'],\n",
" ['-0.41', '-0.55'],\n",
" ['-0.54', '-0.41'],\n",
" ['-0.83', '0.36'],\n",
" ['-0.48', '0.41'],\n",
" ['0.31', '-0.86'],\n",
" ['-0.74', '-0.32'],\n",
" ['-0.37', '-0.37'],\n",
" ['-0.38', '-0.24'],\n",
" ['0.02', '-0.51'],\n",
" ['-0.68', '-0.52'],\n",
" ['0.10', '-1.06'],\n",
" ['0.37', '-0.95'],\n",
" ['-0.59', '0.08'],\n",
" ['-0.75', '-0.41'],\n",
" ['-0.53', '-0.74'],\n",
" ['-0.06', '-0.89'],\n",
" ['-0.82', '-0.31'],\n",
" ['-0.28', '0.23'],\n",
" ['0.14', '-1.08'],\n",
" ['0.06', '-1.25'],\n",
" ['-0.49', '-0.64'],\n",
" ['-0.74', '0.72'],\n",
" ['-0.80', '0.20'],\n",
" ['-0.32', '0.06'],\n",
" ['-0.50', '-0.46'],\n",
" ['-0.15', '-0.77'],\n",
" ['-0.20', '-0.63'],\n",
" ['-0.49', '-0.48'],\n",
" ['-0.68', '-0.36'],\n",
" ['-0.60', '-0.55'],\n",
" ['-0.84', '0.14'],\n",
" ['-0.22', '-0.65'],\n",
" ['0.16', '-0.54'],\n",
" ['0.32', '-1.35'],\n",
" ['-0.05', '-0.20'],\n",
" ['0.16', '-1.60'],\n",
" ['-0.28', '-1.08'],\n",
" ['-0.22', '-1.19'],\n",
" ['-0.20', '-0.02'],\n",
" ['0.32', '-1.18'],\n",
" ['-0.80', '-0.67'],\n",
" ['-0.39', '-0.63'],\n",
" ['-0.77', '-0.99'],\n",
" ['-0.87', '-0.53'],\n",
" ['-0.12', '-0.47'],\n",
" ['-0.82', '-0.27'],\n",
" ['-0.81', '-0.65'],\n",
" ['-0.78', '0.33'],\n",
" ['-0.40', '-1.04'],\n",
" ['-0.61', '-0.39'],\n",
" ['-1.56', '-0.37'],\n",
" ['-0.15', '-0.84'],\n",
" ['-0.02', '-0.50'],\n",
" ['-0.15', '0.05'],\n",
" ['-0.31', '-1.30'],\n",
" ['-1.23', '-0.34'],\n",
" ['0.23', '-0.80'],\n",
" ['-0.46', '-0.62'],\n",
" ['-0.58', '0.73'],\n",
" ['-0.54', '-0.57'],\n",
" ['-0.85', '-0.24'],\n",
" ['-1.73', '0.12'],\n",
" ['-0.35', '-0.42'],\n",
" ['-0.16', '-0.79'],\n",
" ['-0.25', '-0.87'],\n",
" ['-0.04', '-1.26'],\n",
" ['0.53', '-1.59'],\n",
" ['0.13', '-1.44'],\n",
" ['-0.65', '-0.66'],\n",
" ['-0.89', '-0.53']],\n",
" ['-1.05', '-1.56']: [['-1.39', '-2.23'],\n",
" ['-1.03', '-1.14'],\n",
" ['-0.17', '-2.12'],\n",
" ['-1.22', '-1.40'],\n",
" ['-0.83', '-1.11'],\n",
" ['-0.95', '-1.70'],\n",
" ['-0.99', '-1.38'],\n",
" ['-1.76', '-2.65'],\n",
" ['-0.78', '-1.18'],\n",
" ['-0.84', '-1.28'],\n",
" ['-0.01', '-1.54'],\n",
" ['-0.40', '-1.45'],\n",
" ['-1.36', '-1.15'],\n",
" ['-0.98', '-1.67'],\n",
" ['-0.73', '-1.18'],\n",
" ['-0.24', '-1.62'],\n",
" ['-1.11', '-1.24'],\n",
" ['-0.97', '-1.46'],\n",
" ['-1.69', '-0.75'],\n",
" ['-2.05', '-1.62'],\n",
" ['-1.19', '-2.35'],\n",
" ['-2.12', '-2.34'],\n",
" ['-1.98', '-0.81'],\n",
" ['-0.75', '-1.54'],\n",
" ['-2.02', '-1.88'],\n",
" ['-0.93', '-0.98'],\n",
" ['-0.92', '-2.71'],\n",
" ['-1.05', '-1.26'],\n",
" ['-1.05', '-1.56'],\n",
" ['-1.81', '-2.55'],\n",
" ['-1.11', '-1.03'],\n",
" ['-2.05', '-2.50'],\n",
" ['-1.85', '-2.60'],\n",
" ['-1.02', '-2.33'],\n",
" ['-1.06', '-1.70'],\n",
" ['-1.18', '-1.55'],\n",
" ['-2.17', '-0.78'],\n",
" ['-1.99', '-2.12'],\n",
" ['-0.85', '-1.54'],\n",
" ['-1.01', '-1.87'],\n",
" ['-1.57', '-0.93'],\n",
" ['-0.26', '-1.87'],\n",
" ['-1.27', '-2.81'],\n",
" ['-0.88', '-1.64'],\n",
" ['-0.68', '-1.69'],\n",
" ['-2.13', '-1.31'],\n",
" ['-1.19', '-1.91'],\n",
" ['-0.68', '-1.12'],\n",
" ['-1.29', '-1.21'],\n",
" ['-1.26', '-1.48'],\n",
" ['-0.83', '-1.90'],\n",
" ['-0.85', '-1.42'],\n",
" ['-1.38', '-2.95'],\n",
" ['-0.80', '-2.53'],\n",
" ['-2.05', '-1.16'],\n",
" ['-1.12', '-1.41'],\n",
" ['-0.67', '-2.01'],\n",
" ['-1.14', '-1.38'],\n",
" ['-0.22', '-2.39'],\n",
" ['-1.45', '-2.16'],\n",
" ['-1.11', '-1.18'],\n",
" ['-1.03', '-1.31'],\n",
" ['-0.44', '-1.29'],\n",
" ['-1.92', '-1.58'],\n",
" ['-1.96', '-0.75'],\n",
" ['-0.65', '-2.27'],\n",
" ['-1.13', '-1.39'],\n",
" ['-2.35', '-1.37'],\n",
" ['-1.43', '-2.23'],\n",
" ['-0.51', '-2.86'],\n",
" ['-0.94', '-1.34'],\n",
" ['-1.87', '-2.25'],\n",
" ['-1.10', '-1.76'],\n",
" ['0.42', '-1.97'],\n",
" ['-1.46', '-0.97'],\n",
" ['-0.49', '-2.53'],\n",
" ['-0.88', '-1.51'],\n",
" ['-0.82', '-2.45'],\n",
" ['-1.05', '-1.10'],\n",
" ['-1.42', '-2.00'],\n",
" ['-1.93', '-2.25']],\n",
" ['0.62', '0.16']: [['0.50', '-0.01'],\n",
" ['1.00', '1.24'],\n",
" ['0.75', '0.01'],\n",
" ['0.31', '-0.37'],\n",
" ['0.98', '1.41'],\n",
" ['0.23', '1.34'],\n",
" ['0.01', '0.04'],\n",
" ['0.84', '-0.42'],\n",
" ['0.41', '0.25'],\n",
" ['-0.21', '1.10'],\n",
" ['1.60', '0.83'],\n",
" ['0.28', '-0.22'],\n",
" ['0.51', '0.01'],\n",
" ['-0.06', '0.87'],\n",
" ['1.26', '-1.16'],\n",
" ['1.25', '-0.53'],\n",
" ['0.44', '0.00'],\n",
" ['1.08', '1.02'],\n",
" ['0.52', '-0.78'],\n",
" ['0.84', '-0.72'],\n",
" ['0.81', '0.21'],\n",
" ['-0.30', '0.98'],\n",
" ['1.11', '0.22'],\n",
" ['0.57', '-0.45'],\n",
" ['-0.09', '0.44'],\n",
" ['1.15', '0.73'],\n",
" ['1.02', '0.86'],\n",
" ['0.77', '-0.65'],\n",
" ['0.07', '0.14'],\n",
" ['1.45', '0.39'],\n",
" ['-0.37', '0.94'],\n",
" ['-0.42', '0.87'],\n",
" ['0.97', '1.31'],\n",
" ['0.43', '0.41'],\n",
" ['0.50', '-0.00'],\n",
" ['0.55', '0.23'],\n",
" ['0.42', '0.01'],\n",
" ['0.26', '-0.20'],\n",
" ['1.18', '-0.95'],\n",
" ['0.70', '0.19'],\n",
" ['0.53', '-0.17'],\n",
" ['0.49', '-0.04'],\n",
" ['1.80', '0.23'],\n",
" ['0.99', '0.51'],\n",
" ['0.69', '-0.36'],\n",
" ['1.59', '-0.28'],\n",
" ['1.18', '-0.76'],\n",
" ['0.08', '0.29'],\n",
" ['1.08', '0.23'],\n",
" ['0.94', '-0.68'],\n",
" ['-0.07', '0.28'],\n",
" ['0.94', '-0.65'],\n",
" ['1.06', '0.60'],\n",
" ['0.42', '-0.07'],\n",
" ['1.96', '0.15'],\n",
" ['0.29', '0.01'],\n",
" ['0.62', '0.16'],\n",
" ['0.04', '-0.09'],\n",
" ['0.25', '1.40'],\n",
" ['-0.22', '0.68'],\n",
" ['0.46', '0.03'],\n",
" ['1.22', '0.12'],\n",
" ['0.77', '0.07'],\n",
" ['-0.26', '1.23'],\n",
" ['0.71', '0.29'],\n",
" ['0.06', '0.54'],\n",
" ['0.85', '-0.78'],\n",
" ['0.17', '0.08'],\n",
" ['0.71', '1.07'],\n",
" ['1.31', '0.99'],\n",
" ['0.28', '0.62'],\n",
" ['1.38', '0.75'],\n",
" ['0.68', '-0.63'],\n",
" ['1.47', '-0.23'],\n",
" ['0.56', '-0.02'],\n",
" ['0.50', '0.00'],\n",
" ['1.07', '0.27'],\n",
" ['0.53', '1.35'],\n",
" ['1.06', '-0.01'],\n",
" ['0.47', '-0.11'],\n",
" ['0.43', '0.18']]}\n"
]
}
],
"source": [
"import pprint\n",
"pprint.pprint(assigned)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"### Test na zbiorze danych Iris"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 64,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 150 entries, 0 to 149\n",
"Data columns (total 6 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Id 150 non-null int64 \n",
" 1 SepalLengthCm 150 non-null float64\n",
" 2 SepalWidthCm 150 non-null float64\n",
" 3 PetalLengthCm 150 non-null float64\n",
" 4 PetalWidthCm 150 non-null float64\n",
" 5 Species 150 non-null object \n",
"dtypes: float64(4), int64(1), object(1)\n",
"memory usage: 7.2+ KB\n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"df = pd.read_csv(\"Iris.csv\")\n",
"df.info()"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"### W celu łatwiejszej wizualizacji bierzemy pod uwagę tylko dwie zmienne"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 65,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Iteracja #1\n",
"Suma dystansów: 208.75650656990624\n",
"Iteracja #2\n",
"Suma dystansów: 205.49853399261397\n",
"Iteracja #3\n",
"Suma dystansów: 204.25697334421366\n",
"Iteracja #4\n",
"Suma dystansów: 200.61634101769542\n",
"Iteracja #5\n",
"Suma dystansów: 199.7822154497639\n",
"Iteracja #6\n",
"Suma dystansów: 197.1753293339581\n",
"Iteracja #7\n",
"Suma dystansów: 141.19412116737692\n",
"Iteracja #8\n",
"Suma dystansów: 83.09469686229966\n",
"Iteracja #9\n",
"Suma dystansów: 83.03438870792166\n",
"Iteracja #10\n",
"Suma dystansów: 82.64480640416339\n",
"Iteracja #11\n",
"Suma dystansów: 79.97152485282157\n",
"Iteracja #12\n",
"Suma dystansów: 78.83128830941482\n",
"Iteracja #13\n",
"Suma dystansów: 77.28460137329213\n",
"Iteracja #14\n",
"Suma dystansów: 76.44054418397423\n",
"Iteracja #15\n",
"Suma dystansów: 75.68752087906972\n",
"Iteracja #16\n",
"Suma dystansów: 75.60046263155463\n"
]
},
{
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "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
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sepal_length = df[\"SepalLengthCm\"].tolist()\n",
"petal_length = df[\"PetalLengthCm\"].tolist()\n",
"\n",
"data_points = [Point([x,y]) for (x,y) in list(zip(sepal_length,petal_length))]\n",
"iris_assignments = pam_clustering(data_points, 3)\n",
"draw_clustering(iris_assignments)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"Prawdziwe klasy dla porównania (pierwsza kolumna, trzeci rząd):\n",
"\n",
"<br/>\n",
"\n",
"<div>\n",
"<img src=\"Iris_dataset_scatterplot.jpg\" width=\"1024\"/>\n",
"</div>\n",
"\n",
"\n",
"\n",
"\n",
"Źródło: Nicoguaro, CC BY 4.0 <https://creativecommons.org/licenses/by/4.0>, via Wikimedia Commons"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false
}
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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
}