Я пытаюсь кластеризовать данные и измерить качество кластеризации с помощью индекса Дэвиса-Болдина. Итак, у меня есть почасовые данные о температуре и солнечном излучении (8760x2), и я пытаюсь получить типичные дни для представления всего года. Для нахождения оптимальных типичных дней я использую метод k-medoids, встроенный в состав MILP, который дает мне, какой (реальный) день соответствует какому типичному дню.
После этого для вычисления индекса Дэвиса-Боулдина я использую davies_bouldin_score из sklearn. Проблема в том, что (я полагаю) функция предназначена для двухмерных массивов, в то время как на каждый день у меня есть 24 точки данных (часы). Чтобы вписать мои данные в функцию, я конвертировал свои обычные дни в обычные часы. Например, если у меня есть 10 типичных дней, я создаю 240 типичных часов. При этом получаемый мною индекс Дэвиса-Боулдина всегда большой, в то время как я ожидал бы что-то между 0 и 1.
Может кто-нибудь объяснить мне, что я делаю неправильно?
Вот мой код
import pandas as pd
import numpy as np
import os
from sklearn import preprocessing
from sklearn.metrics.cluster import davies_bouldin_score as dbs
df = pd.read_excel('data/test.xlsx', index_col=None, skiprows=range(1, 2))
properties = 2
rows = 365
columns = 24
ampl_results = pd.read_csv("results/typicaldaysofdays.out", sep=' ', header=None)
for s in range(len(ampl_results.columns)):
test = ampl_results[s].values
days = []
hours = []
typicaldays = np.repeat(test,24)
for d in range(rows):
for h in range(columns):
days.append(d + 1)
hours.append(h+1)
days = pd.DataFrame(np.array(days))
hours = pd.DataFrame(np.array(hours))
typicaldays = pd.DataFrame(typicaldays)
testdf = df.copy()
testdf.drop(testdf.tail(2).index, inplace=True)
x = testdf.values
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
testdf = pd.DataFrame(x_scaled)
testdf['Days'] = days
testdf['Hours'] = hours
testdf['TypicalDays'] = typicaldays
testdf['TypicalHours'] = testdf['TypicalDays'] * testdf['Hours']
test2 = []
for p in range(properties):
if len(test2) == 0:
test2 = testdf.iloc[:, p].values
else:
test2 = np.vstack((test2, testdf.iloc[:, p].values))
test2 = np.transpose(test2)
print(dbs(test2, testdf['TypicalHours'].values))