Как увидеть вариацию отдельного кластера и количества точек в кластере для алгоритма k-средних в Python? - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь нарисовать линии поддержки / сопротивления для финансовых активов, используя алгоритм k-средних в Python (используя метод Elbow для определения оптимального количества кластеров):

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans

def get_optimum_clusters(df):
    '''
    :param df: dataframe
    :param saturation_point: The amount of difference we are willing to detect
    :return: clusters with optimum K centers
    This method uses elbow method to find the optimum number of K clusters
    We initialize different K-means with 1..30 centers and compare the inertias
    If the difference is no more than saturation_point, we choose that as K and move on
    '''

    wcss = []
    k_models = []

    size = min(30, len(df.index))
    for i in range(1, size):
        kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=500, n_init=30, random_state=0)
        kmeans.fit(df)
        wcss.append(kmeans.inertia_)
        k_models.append(kmeans)

    # Compare differences in inertias until it's no more than saturation_point
    optimum_k = len(wcss)-1
    for i in range(0, len(wcss)-1):
        diff = abs(wcss[i+1] - wcss[i])
        if diff < saturation_point:
            optimum_k = i
            break

    print("Optimum K is " + str(optimum_k + 1))
    optimum_clusters = k_models[optimum_k]

    return optimum_clusters

#data here is the DataFrame containing info on Date, Open,High,Low,Close,Volume
lows = pd.DataFrame(data=data, index=data.index, columns=["Low"])
highs = pd.DataFrame(data=data, index=data.index, columns=["High"])

saturation_point=data['Adj Close'].mean()/2

low_clusters = get_optimum_clusters(lows)
low_centers = low_clusters.cluster_centers_
low_centers = np.sort(low_centers, axis=0)


high_clusters = get_optimum_clusters(highs)
high_centers = high_clusters.cluster_centers_
high_centers = np.sort(high_centers, axis=0)

По сути, я встаю до 30 кластеров (линий) для сопротивления (high_centers) и поддержки (low_centers). Я хочу ранжировать их по следующим критериям:

1) Количество точек в кластере> = 3

2) Минимально возможная сумма расстояний от центра до точек.

Идея состоит в том, чтобы оставить лучшие линии сопротивления / поддержки. Есть ли способ получить количество точек и вариации отдельного кластера в библиотеке Sklearn Kmeans? Я не смог найти в документации.

...