У меня есть код, который запускает алгоритм KMeans для некоторых данных, но он мне нужен, чтобы теперь вычислить индекс Данна и инерцию для него, но поскольку ограничения для этой программы - numpy, matplotlib и csv, ни одно онлайн-видео не показывает, как вычислить Индекс Данна с помощью всего лишь этой пары библиотек. Я не очень люблю математику, поэтому внедрение реальных математических вычислений в код для меня слишком сложно...
Я искал в Интернете, как это сделать. вычислить индекс Данна и инерцию в Python с ограничениями numpy, но все использовало другую библиотеку.
Вот код:
import numpy as np
import matplotlib.pyplot as plt
import csv
def load_data(file_path):
data = []
with open(file_path, 'r') as csvfile:
csvreader = csv.reader(csvfile)
next(csvreader)
for row in csvreader:
data.append([float(row[0]), float(row[1])])
return np.array(data)
def calculate_distances(data, centers):
data_with_distances = data.copy()
num_centers = centers.shape[0]
for i in range(num_centers):
distances = np.sqrt(((data - centers) ** 2).sum(axis=1))
data_with_distances = np.column_stack((data_with_distances, distances))
return data_with_distances
def get_clusters(data_with_distances):
num_clusters = data_with_distances.shape[1] - 2
cluster_masks = []
for i in range(num_clusters):
mask = data_with_distances[:, i+2] == np.min(data_with_distances[:, 2:num_clusters+2], axis=1)
cluster_masks.append(mask)
clusters = [data_with_distances[mask, :] for mask in cluster_masks]
return clusters
def calculate_centers(clusters):
centers = np.array([cluster.mean(axis=0)[:2] for cluster in clusters])
return centers
def plot_clusters(clusters, centers):
colors = ['blue', 'red', 'green']
for i, cluster in enumerate(clusters):
plt.scatter(cluster[:, 0], cluster[:, 1], color=colors)
for center in centers:
plt.scatter(center[0], center[1], color='purple', marker='*', s=150)
plt.xlabel('Household Total Assets')
plt.ylabel('Annual Household Income')
plt.title('K-means Clustering of Household Data')
plt.show()
def run(data, num_clusters, max_iterations=100):
current_centers = np.random.permutation(data)[:num_clusters]
for iteration in range(max_iterations):
data_with_distances = calculate_distances(data, current_centers)
clusters = get_clusters(data_with_distances)
current_centers = calculate_centers(clusters)
plot_clusters(clusters, current_centers)
def main(file_path):
data = load_data(file_path)
for num_clusters in range(2, 11):
run(data, num_clusters)
file_path = 'assessment2dmv.csv'
num_clusters = 3
main(file_path)
Подробнее здесь: https://stackoverflow.com/questions/787 ... -algorithm