【发布时间】:2019-05-08 14:53:25
【问题描述】:
我第一次尝试使用 Scipy 和 Scipy 最小化。我已阅读文档并查看了一些 YT 教程,似乎每次我们需要最小化变量时,我们都需要编写手头问题的数学表示。
就我而言,我有一个代表我的数据集的玩具示例。我有:
- 产品列表
- 客户列表和关于他们是否购买产品的二元响应
- 我正在尝试对我的客户进行分类的多个集群。存储的值表示集群的中心,在优化步骤之前它被设置为 0。
我所做的非常基础,对于每个集群,我都在计算每个集群值与客户交易之间的平方差的平方根。这样每个客户对每个集群都有一个距离值。
然后我为每个客户取最低距离值并总结它们。
- 这个总距离是我想要最小化的总距离,这是我的目标
- 决策变量在集群中全为 0,
- 约束条件(Bound?),聚类中心应保持在 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()
我是否已经创建了许多不同的 DataFrame 以使其正常工作?
使用 Scipy.minimize 最小化总距离的正确方法是什么?
【问题讨论】:
-
Scipy 以外的解决方案也非常受欢迎,只要距离最小化。
标签: python pandas scipy statistics