def k_means_clustering(points: list[tuple[float, float]], k: int, initial_centroids: list[tuple[float, float]], max_iterations: int) -> list[tuple[float, float]]:
import numpy as np
my_list=[0]*len(points)
my_list[1]
if k==1:
points=np.array(points)
initial_centroids=[tuple(np.mean(points,axis=0))]
final_centroids=initial_centroids
return final_centroids
for _ in range(max_iterations):
for index, items in enumerate(points):
my_list1=[0]*len(initial_centroids)
for indx2, cen in enumerate(initial_centroids):
my_list1[indx2]=np.sqrt(np.sum((np.array(items)-np.array(cen))**2))
# print(my_list1[indx2])
max_val=999999
centroid=9
for index3, value in enumerate(my_list1):
if value<max_val:
centroid=index3
max_val=value
# print(centroid)
my_list[index]=centroid
my_list
points_array=np.array(points)
if k==1:
cluster0=points_array[np.array(my_list)==0]
initial_centroids=[tuple(np.mean(cluster0,axis=0))]
elif k==2:
cluster0=points_array[np.array(my_list)==0]
cluster1=points_array[np.array(my_list)==1]
initial_centroids=[tuple(np.mean(cluster0,axis=0)),tuple(np.mean(cluster1,axis=0))]
elif k==3:
cluster0=points_array[np.array(my_list)==0]
cluster1=points_array[np.array(my_list)==1]
cluster2=points_array[np.array(my_list)==2]
initial_centroids=[tuple(np.mean(cluster0,axis=0)),tuple(np.mean(cluster1,axis=0)),tuple(np.mean(cluster2,axis=0))]
elif k==4:
cluster0=points_array[np.array(my_list)==0]
cluster1=points_array[np.array(my_list)==1]
cluster2=points_array[np.array(my_list)==2]
cluster3=points_array[np.array(my_list)==3]
initial_centroids=[tuple(np.mean(cluster0,axis=0)),tuple(np.mean(cluster1,axis=0)),tuple(np.mean(cluster2,axis=0)),tuple(np.mean(cluster3,axis=0))]
initial_centroids
final_centroids=initial_centroids
return final_centroids
def standerd_data_z_score(points):
points = np.array(points, dtype=float)
mean=np.mean(points,dtype=float)
std=np.std(points,dtype=float)
scaled=(points-mean)/std
return scaled, mean, std
# print(k_means_clustering([(1, 1), (2, 2), (3, 3), (4, 4)], 1, [(0,0)], 10))
# print(k_means_clustering([(0, 0), (1, 0), (0, 1), (1, 1), (5, 5), (6, 5), (5, 6), (6, 6),(0, 5), (1, 5), (0, 6), (1, 6), (5, 0), (6, 0), (5, 1), (6, 1)], 4, [(0, 0), (0, 5), (5, 0), (5, 5)], 10))
points = [
(5.1, 2.3, 12),
(4.9, 2.5, 10),
(6.2, 3.0, 15),
(1.5, 0.8, 5),
(1.2, 0.6, 3)
]
import numpy as np
scaled, mean, std=standerd_data_z_score(points)
centr=[(6.2,3,15),(1.35,0.7,4),(5,2.4,11)]
centr=np.array(centr,dtype=float)
centr=(centr-mean)/std
finally_centroid=k_means_clustering(scaled, 3, centr, 100)
# # max_iterations = 10
# points = [(1, 1), (2, 2), (3, 3), (4, 4)]
# k=1
# initial_centroids= [(0,0)]
# max_iterations=10
# points[0][0]
# my_list=[0]*len(points)
# my_list[1]
# i=int(0)
# for _ in range(max_iterations):
# for index, items in enumerate(points):
# my_list1=[0]*len(initial_centroids)
# for indx2, cen in enumerate(initial_centroids):
# my_list1[indx2]=np.sqrt(np.sum((np.array(items)-np.array(cen))**2))
# # print(my_list1[indx2])
# max_val=999999
# centroid=9
# for index3, value in enumerate(my_list1):
# if value<max_val:
# centroid=index3
# max_val=value
# # print(centroid)
# my_list[index]=centroid
# my_list
# points_array=np.array(points)
# if k==1:
# cluster0=points_array[np.array(my_list)==0]
# initial_centroids=[tuple(np.mean(cluster0,axis=0))]
# elif k==2:
# cluster0=points_array[np.array(my_list)==0]
# cluster1=points_array[np.array(my_list)==1]
# initial_centroids=[tuple(np.mean(cluster0,axis=0)),tuple(np.mean(cluster1,axis=0))]
# elif k==3:
# cluster0=points_array[np.array(my_list)==0]
# cluster1=points_array[np.array(my_list)==1]
# cluster2=points_array[np.array(my_list)==2]
# initial_centroids=[tuple(np.mean(cluster0,axis=0)),tuple(np.mean(cluster1,axis=0)),tuple(np.mean(cluster2,axis=0))]
# # cluster1
# # initial_centroids=[tuple(np.mean(cluster0,axis=0)),tuple(np.mean(cluster1,axis=0))]
# # initial_centroids
# initial_centroids
scaled
finally_centroid
level_data=[0]*5
for index, value in enumerate(scaled):
lis=[0]*3
for index2, centroids in enumerate(finally_centroid):
dis1=np.sqrt(np.sum(value-centroids)**2)
lis[index2]=dis1
smallest_val=min(lis)
level_data[index]=lis.index(smallest_val)
scaled
level_data
# dis1=np.sqrt(np.array(value)-np.array(centroids)**2)
finally_centroid = np.array(finally_centroid)
import matplotlib.pyplot as plt
plt.scatter(scaled[:, 0], scaled[:, 1], c=level_data, cmap='viridis')
plt.scatter(finally_centroid[:, 0], finally_centroid[:, 1], marker='*', s=200, c='red')
plt.xlabel('Annual Spending ($1000s)')
plt.ylabel('Avg Order Value ($100s)')
plt.title('Customer Segmentation with k-Means')
plt.legend
ZGVmIGtfbWVhbnNfY2x1c3RlcmluZyhwb2ludHM6IGxpc3RbdHVwbGVbZmxvYXQsIGZsb2F0XV0sIGs6IGludCwgaW5pdGlhbF9jZW50cm9pZHM6IGxpc3RbdHVwbGVbZmxvYXQsIGZsb2F0XV0sIG1heF9pdGVyYXRpb25zOiBpbnQpIC0+IGxpc3RbdHVwbGVbZmxvYXQsIGZsb2F0XV06CiAgICBpbXBvcnQgbnVtcHkgYXMgbnAKICAgIG15X2xpc3Q9WzBdKmxlbihwb2ludHMpCiAgICBteV9saXN0WzFdCiAgICBpZiBrPT0xOgogICAgICAgIHBvaW50cz1ucC5hcnJheShwb2ludHMpCiAgICAgICAgaW5pdGlhbF9jZW50cm9pZHM9W3R1cGxlKG5wLm1lYW4ocG9pbnRzLGF4aXM9MCkpXQogICAgICAgIGZpbmFsX2NlbnRyb2lkcz1pbml0aWFsX2NlbnRyb2lkcwogICAgICAgIHJldHVybiBmaW5hbF9jZW50cm9pZHMKICAgICAgICAKICAgIGZvciBfIGluIHJhbmdlKG1heF9pdGVyYXRpb25zKToKICAgICAgICBmb3IgaW5kZXgsIGl0ZW1zIGluIGVudW1lcmF0ZShwb2ludHMpOgogICAgICAgICAgICBteV9saXN0MT1bMF0qbGVuKGluaXRpYWxfY2VudHJvaWRzKQogICAgICAgICAgICBmb3IgaW5keDIsIGNlbiBpbiBlbnVtZXJhdGUoaW5pdGlhbF9jZW50cm9pZHMpOgogICAgICAgICAgICAgICAgbXlfbGlzdDFbaW5keDJdPW5wLnNxcnQobnAuc3VtKChucC5hcnJheShpdGVtcyktbnAuYXJyYXkoY2VuKSkqKjIpKQogICAgICAgICAgICAgICAgIyBwcmludChteV9saXN0MVtpbmR4Ml0pCiAgICAgICAgICAgIG1heF92YWw9OTk5OTk5CiAgICAgICAgICAgIGNlbnRyb2lkPTkKICAgICAgICAgICAgZm9yIGluZGV4MywgdmFsdWUgaW4gZW51bWVyYXRlKG15X2xpc3QxKToKICAgICAgICAgICAgICAgIGlmIHZhbHVlPG1heF92YWw6CiAgICAgICAgICAgICAgICAgICAgY2VudHJvaWQ9aW5kZXgzCiAgICAgICAgICAgICAgICAgICAgbWF4X3ZhbD12YWx1ZQogICAgICAgICAgICAjIHByaW50KGNlbnRyb2lkKQogICAgICAgICAgICBteV9saXN0W2luZGV4XT1jZW50cm9pZAogICAgICAgIG15X2xpc3QKCiAgICAgICAgcG9pbnRzX2FycmF5PW5wLmFycmF5KHBvaW50cykKCiAgICAgICAgaWYgaz09MToKICAgICAgICAgICAgY2x1c3RlcjA9cG9pbnRzX2FycmF5W25wLmFycmF5KG15X2xpc3QpPT0wXQogICAgICAgICAgICBpbml0aWFsX2NlbnRyb2lkcz1bdHVwbGUobnAubWVhbihjbHVzdGVyMCxheGlzPTApKV0KCiAgICAgICAgZWxpZiBrPT0yOgogICAgICAgICAgICBjbHVzdGVyMD1wb2ludHNfYXJyYXlbbnAuYXJyYXkobXlfbGlzdCk9PTBdCiAgICAgICAgICAgIGNsdXN0ZXIxPXBvaW50c19hcnJheVtucC5hcnJheShteV9saXN0KT09MV0KICAgICAgICAgICAgaW5pdGlhbF9jZW50cm9pZHM9W3R1cGxlKG5wLm1lYW4oY2x1c3RlcjAsYXhpcz0wKSksdHVwbGUobnAubWVhbihjbHVzdGVyMSxheGlzPTApKV0KICAgICAgICBlbGlmIGs9PTM6CiAgICAgICAgICAgIGNsdXN0ZXIwPXBvaW50c19hcnJheVtucC5hcnJheShteV9saXN0KT09MF0KICAgICAgICAgICAgY2x1c3RlcjE9cG9pbnRzX2FycmF5W25wLmFycmF5KG15X2xpc3QpPT0xXQogICAgICAgICAgICBjbHVzdGVyMj1wb2ludHNfYXJyYXlbbnAuYXJyYXkobXlfbGlzdCk9PTJdCiAgICAgICAgICAgIGluaXRpYWxfY2VudHJvaWRzPVt0dXBsZShucC5tZWFuKGNsdXN0ZXIwLGF4aXM9MCkpLHR1cGxlKG5wLm1lYW4oY2x1c3RlcjEsYXhpcz0wKSksdHVwbGUobnAubWVhbihjbHVzdGVyMixheGlzPTApKV0KICAgICAgICBlbGlmIGs9PTQ6CiAgICAgICAgICAgIGNsdXN0ZXIwPXBvaW50c19hcnJheVtucC5hcnJheShteV9saXN0KT09MF0KICAgICAgICAgICAgY2x1c3RlcjE9cG9pbnRzX2FycmF5W25wLmFycmF5KG15X2xpc3QpPT0xXQogICAgICAgICAgICBjbHVzdGVyMj1wb2ludHNfYXJyYXlbbnAuYXJyYXkobXlfbGlzdCk9PTJdCiAgICAgICAgICAgIGNsdXN0ZXIzPXBvaW50c19hcnJheVtucC5hcnJheShteV9saXN0KT09M10KICAgICAgICAgICAgaW5pdGlhbF9jZW50cm9pZHM9W3R1cGxlKG5wLm1lYW4oY2x1c3RlcjAsYXhpcz0wKSksdHVwbGUobnAubWVhbihjbHVzdGVyMSxheGlzPTApKSx0dXBsZShucC5tZWFuKGNsdXN0ZXIyLGF4aXM9MCkpLHR1cGxlKG5wLm1lYW4oY2x1c3RlcjMsYXhpcz0wKSldCgogICAgICAgIGluaXRpYWxfY2VudHJvaWRzCiAgICAgICAgZmluYWxfY2VudHJvaWRzPWluaXRpYWxfY2VudHJvaWRzCiAgICByZXR1cm4gZmluYWxfY2VudHJvaWRzCmRlZiBzdGFuZGVyZF9kYXRhX3pfc2NvcmUocG9pbnRzKToKICAgIHBvaW50cyA9IG5wLmFycmF5KHBvaW50cywgZHR5cGU9ZmxvYXQpCiAgICBtZWFuPW5wLm1lYW4ocG9pbnRzLGR0eXBlPWZsb2F0KQogICAgc3RkPW5wLnN0ZChwb2ludHMsZHR5cGU9ZmxvYXQpCiAgICBzY2FsZWQ9KHBvaW50cy1tZWFuKS9zdGQKICAgIHJldHVybiBzY2FsZWQsIG1lYW4sIHN0ZAojIHByaW50KGtfbWVhbnNfY2x1c3RlcmluZyhbKDEsIDEpLCAoMiwgMiksICgzLCAzKSwgKDQsIDQpXSwgMSwgWygwLDApXSwgMTApKQojIHByaW50KGtfbWVhbnNfY2x1c3RlcmluZyhbKDAsIDApLCAoMSwgMCksICgwLCAxKSwgKDEsIDEpLCAoNSwgNSksICg2LCA1KSwgKDUsIDYpLCAoNiwgNiksKDAsIDUpLCAoMSwgNSksICgwLCA2KSwgKDEsIDYpLCAoNSwgMCksICg2LCAwKSwgKDUsIDEpLCAoNiwgMSldLCA0LCBbKDAsIDApLCAoMCwgNSksICg1LCAwKSwgKDUsIDUpXSwgMTApKQpwb2ludHMgPSBbCiAgICAoNS4xLCAyLjMsIDEyKSwKICAgICg0LjksIDIuNSwgMTApLAogICAgKDYuMiwgMy4wLCAxNSksCiAgICAoMS41LCAwLjgsIDUpLAogICAgKDEuMiwgMC42LCAzKQpdCgppbXBvcnQgbnVtcHkgYXMgbnAKc2NhbGVkLCBtZWFuLCBzdGQ9c3RhbmRlcmRfZGF0YV96X3Njb3JlKHBvaW50cykKY2VudHI9Wyg2LjIsMywxNSksKDEuMzUsMC43LDQpLCg1LDIuNCwxMSldCgpjZW50cj1ucC5hcnJheShjZW50cixkdHlwZT1mbG9hdCkKY2VudHI9KGNlbnRyLW1lYW4pL3N0ZApmaW5hbGx5X2NlbnRyb2lkPWtfbWVhbnNfY2x1c3RlcmluZyhzY2FsZWQsIDMsIGNlbnRyLCAxMDApCgojICMgbWF4X2l0ZXJhdGlvbnMgPSAxMAoKIyBwb2ludHMgPSBbKDEsIDEpLCAoMiwgMiksICgzLCAzKSwgKDQsIDQpXQojIGs9MQojIGluaXRpYWxfY2VudHJvaWRzPSAgWygwLDApXQojIG1heF9pdGVyYXRpb25zPTEwCgojIHBvaW50c1swXVswXQoKIyBteV9saXN0PVswXSpsZW4ocG9pbnRzKQojIG15X2xpc3RbMV0KIyBpPWludCgwKQojIGZvciBfIGluIHJhbmdlKG1heF9pdGVyYXRpb25zKToKIyAgICAgZm9yIGluZGV4LCBpdGVtcyBpbiBlbnVtZXJhdGUocG9pbnRzKToKIyAgICAgICAgIG15X2xpc3QxPVswXSpsZW4oaW5pdGlhbF9jZW50cm9pZHMpCiMgICAgICAgICBmb3IgaW5keDIsIGNlbiBpbiBlbnVtZXJhdGUoaW5pdGlhbF9jZW50cm9pZHMpOgojICAgICAgICAgICAgIG15X2xpc3QxW2luZHgyXT1ucC5zcXJ0KG5wLnN1bSgobnAuYXJyYXkoaXRlbXMpLW5wLmFycmF5KGNlbikpKioyKSkKIyAgICAgICAgICAgICAjIHByaW50KG15X2xpc3QxW2luZHgyXSkKIyAgICAgICAgIG1heF92YWw9OTk5OTk5CiMgICAgICAgICBjZW50cm9pZD05CiMgICAgICAgICBmb3IgaW5kZXgzLCB2YWx1ZSBpbiBlbnVtZXJhdGUobXlfbGlzdDEpOgojICAgICAgICAgICAgIGlmIHZhbHVlPG1heF92YWw6CiMgICAgICAgICAgICAgICAgIGNlbnRyb2lkPWluZGV4MwojICAgICAgICAgICAgICAgICBtYXhfdmFsPXZhbHVlCiMgICAgICAgICAjIHByaW50KGNlbnRyb2lkKQojICAgICAgICAgbXlfbGlzdFtpbmRleF09Y2VudHJvaWQKIyAgICAgbXlfbGlzdAoKIyAgICAgcG9pbnRzX2FycmF5PW5wLmFycmF5KHBvaW50cykKIyAgICAgaWYgaz09MToKIyAgICAgICAgIGNsdXN0ZXIwPXBvaW50c19hcnJheVtucC5hcnJheShteV9saXN0KT09MF0KIyAgICAgICAgIGluaXRpYWxfY2VudHJvaWRzPVt0dXBsZShucC5tZWFuKGNsdXN0ZXIwLGF4aXM9MCkpXQoKIyAgICAgZWxpZiBrPT0yOgojICAgICAgICAgY2x1c3RlcjA9cG9pbnRzX2FycmF5W25wLmFycmF5KG15X2xpc3QpPT0wXQojICAgICAgICAgY2x1c3RlcjE9cG9pbnRzX2FycmF5W25wLmFycmF5KG15X2xpc3QpPT0xXQojICAgICAgICAgaW5pdGlhbF9jZW50cm9pZHM9W3R1cGxlKG5wLm1lYW4oY2x1c3RlcjAsYXhpcz0wKSksdHVwbGUobnAubWVhbihjbHVzdGVyMSxheGlzPTApKV0KIyAgICAgZWxpZiBrPT0zOgojICAgICAgICAgY2x1c3RlcjA9cG9pbnRzX2FycmF5W25wLmFycmF5KG15X2xpc3QpPT0wXQojICAgICAgICAgY2x1c3RlcjE9cG9pbnRzX2FycmF5W25wLmFycmF5KG15X2xpc3QpPT0xXQojICAgICAgICAgY2x1c3RlcjI9cG9pbnRzX2FycmF5W25wLmFycmF5KG15X2xpc3QpPT0yXQojICAgICAgICAgaW5pdGlhbF9jZW50cm9pZHM9W3R1cGxlKG5wLm1lYW4oY2x1c3RlcjAsYXhpcz0wKSksdHVwbGUobnAubWVhbihjbHVzdGVyMSxheGlzPTApKSx0dXBsZShucC5tZWFuKGNsdXN0ZXIyLGF4aXM9MCkpXQoKIyAgICAgIyBjbHVzdGVyMQojICAgICAjIGluaXRpYWxfY2VudHJvaWRzPVt0dXBsZShucC5tZWFuKGNsdXN0ZXIwLGF4aXM9MCkpLHR1cGxlKG5wLm1lYW4oY2x1c3RlcjEsYXhpcz0wKSldCiMgICAgICMgaW5pdGlhbF9jZW50cm9pZHMKICAgICAgICAKIyBpbml0aWFsX2NlbnRyb2lkcwkJCnNjYWxlZApmaW5hbGx5X2NlbnRyb2lkCmxldmVsX2RhdGE9WzBdKjUKCmZvciBpbmRleCwgdmFsdWUgaW4gZW51bWVyYXRlKHNjYWxlZCk6CiAgICBsaXM9WzBdKjMKICAgIGZvciBpbmRleDIsIGNlbnRyb2lkcyBpbiBlbnVtZXJhdGUoZmluYWxseV9jZW50cm9pZCk6CiAgICAgICAgZGlzMT1ucC5zcXJ0KG5wLnN1bSh2YWx1ZS1jZW50cm9pZHMpKioyKQogICAgICAgIGxpc1tpbmRleDJdPWRpczEKICAgIHNtYWxsZXN0X3ZhbD1taW4obGlzKQogICAgbGV2ZWxfZGF0YVtpbmRleF09bGlzLmluZGV4KHNtYWxsZXN0X3ZhbCkKc2NhbGVkCmxldmVsX2RhdGEKIyBkaXMxPW5wLnNxcnQobnAuYXJyYXkodmFsdWUpLW5wLmFycmF5KGNlbnRyb2lkcykqKjIpCgpmaW5hbGx5X2NlbnRyb2lkID0gbnAuYXJyYXkoZmluYWxseV9jZW50cm9pZCkKaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdApwbHQuc2NhdHRlcihzY2FsZWRbOiwgMF0sIHNjYWxlZFs6LCAxXSwgYz1sZXZlbF9kYXRhLCBjbWFwPSd2aXJpZGlzJykgIApwbHQuc2NhdHRlcihmaW5hbGx5X2NlbnRyb2lkWzosIDBdLCBmaW5hbGx5X2NlbnRyb2lkWzosIDFdLCBtYXJrZXI9JyonLCBzPTIwMCwgYz0ncmVkJykgIApwbHQueGxhYmVsKCdBbm51YWwgU3BlbmRpbmcgKCQxMDAwcyknKSAgCnBsdC55bGFiZWwoJ0F2ZyBPcmRlciBWYWx1ZSAoJDEwMHMpJykgIApwbHQudGl0bGUoJ0N1c3RvbWVyIFNlZ21lbnRhdGlvbiB3aXRoIGstTWVhbnMnKSAgCnBsdC5sZWdlbmQK