Given a list of n points in d dimensions as points, an integer k, a maximum number of iterations max_iters, a tolerance tol, and an optional random seed seed, implement K-means clustering from scratch. Return the final centroids, the cluster assignment for each point, and the number of iterations performed. Use Euclidean distance, initialize centroids by sampling k distinct points, and stop when centroid movement is at most tol or when max_iters is reached. If a cluster becomes empty, reinitialize its centroid to the point farthest from its currently assigned centroid.
def k_means(points, k, max_iters=100, tol=1e-4, seed=None):