Python sklearn davies_bouldin_score для многомерных данных - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь кластеризовать данные и измерить качество кластеризации с помощью индекса Дэвиса-Болдина. Итак, у меня есть почасовые данные о температуре и солнечном излучении (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))

...