Я пытаюсь впервые использовать Сципи и Сципи свести к минимуму.Я прочитал документацию и увидел несколько учебных пособий по YT. Кажется, что каждый раз, когда нам нужно минимизировать переменную, нам нужно написать математическое представление проблемы.
В моем случае у меня есть игрушечный пример, который представляет мойнабор данных.У меня есть:
- список продуктов
- список клиентов и бинарный ответ о том, купили они продукт или нет
- количество кластеров, которыми я являюсьпытаясь классифицировать моих клиентов с.Сохраненное значение представляет центр кластера, перед этапом оптимизации он устанавливается равным 0.
То, что я делаю, довольно просто, для каждого кластера я вычисляю квадратный корень квадратной разности между каждымстоимость кластера и клиентские транзакции.Чтобы у каждого клиента было значение расстояния для каждого кластера.
Затем я беру для каждого клиента наименьшее значение расстояния и суммирую их.
- Это общее количество, которое я хочу минимизировать, это моя цель
- Переменные решения - это все 0 в кластере,
- ограничения (Связано?), центр кластеров должен оставаться в пределах 0,00 и 1,00
Поскольку я использую exp, функция не линейна, поэтому я использую SLSQP, и мое дикое предположение было попробовать это:
sol = minimize(total_distance_to_minimize, dataframe[clusters.keys()], method='SLSQP', Bounds=((0,1)), options={'disp'=True})
на следующем примере с игрушкой:
#utf8
import pandas as pd
import numpy as np
from scipy.optimize import minimize, Bounds
import math
#dict holoding distances between customers and clusters
distances = dict()
product_list = ['banana juice','pinnaple juice' ,
'maracudja',
'cupuacu',
'goava',
'coconut',
'apple',
'grappe',
'acai']
customer_dict = {'Bilbon Saquet' :[0,1,0,1,0,1,0,0,0],
'Gandalft':[0,0,0,1,0,0,0,0,0],
'Thorin':[1,1,1,0,0,0,0,0,0],
'Smaug':[0,0,1,1,0,1,0,0,1],
'Radagast':[0,1,1,1,1,1,0,0,0],
'Elrond':[0,0,0,1,0,1,1,0,1],
'Balin':[0,0,0,0,0,1,0,0,0]}
clusters = {'Clusters 1' :[0,0,0,0,0,0,0,0,0],
'Clusters 2':[0,0,0,0,0,0,0,0,0],
'Clusters 3':[0,0,0,0,0,0,0,0,0],
'Clusters 4':[0,0,0,0,0,0,0,0,0]}
data = pd.DataFrame(customer_dict, index= product_list)
clusters = pd.DataFrame(clusters, index=product_list)
dataframe = pd.concat([data, clusters], axis='columns')
for k in clusters :
for customer in customer_dict:
distances.setdefault(customer, [])
distances[customer].append(math.sqrt(((dataframe[k]-dataframe[customer])**2).sum()))
distances = pd.DataFrame(distances, index=clusters.keys())
total_distance_to_minimize = distances.min().sum()
Может быть, я создал много разных фреймов данных для того, чтобы это работало?
Каков будет правильный способиспользуя Scipy.minimize, чтобы минимизировать это общее расстояние?