【问题标题】:Finding global maxima while filtering the noise in Python在 Python 中过滤噪声时找到全局最大值
【发布时间】:2022-01-04 01:49:05
【问题描述】:

对于我目前正在开发的新应用,我一直在尝试在 Python 中执行以下操作:

输入:

  1. list_of_points - n 个样本点 x。每个都有 d 个维度(每个都表示为一个列表),其中 d 被假定为很大(越大越好)。

  2. list_of_values - n 值“隐藏函数” f.即list_of_values[i] = f(list_of_points[i]) + noise

  3. domain - 定义 f 的 d-minsional 范围,因此 list_of_points 也在此域中。域可能是整个 R^d。

输出:domain 上 f 的全局最大值的点列表。

为了过滤噪声,我决定使用回归来估计 f,然后才寻找它的最大值点。

将以上内容总结为伪代码,我们得到:

def filter_noise_and_return_global_maxima(list_of_points, list_of_values, domain, degree_of_regression_polynomial):
    f = polynomial_regression(list_of_points, list_of_values, degree = degree_of_regression_polynomial)
    return f.global_maxima(domain)

现在我试图弄清楚如何做到这一点,但我找不到任何方法,特别是如果我希望代码在合理的时间内运行(考虑到维度 d 相当大)。

对于多项式回归,我在网上找到了以下内容:

from sklearn.preprocessing import PolynomialFeatures
from sklearn import linear_model

X = [[0.44, 0.68], [0.99, 0.23]]
vector = [109.85, 155.72]
predict= [0.49, 0.18]

poly = PolynomialFeatures(degree=2)
X_ = poly.fit_transform(X)
predict_ = poly.fit_transform(predict)

clf = linear_model.LinearRegression()
clf.fit(X_, vector)
print(clf.predict(predict_))

但不幸的是,这会引发错误。另外,我不确定如何生成下面使用的 sympy 的多项式。

最后,为了找到全局最大值,我发现了这个:

from sympy.calculus.util import *
x = symbols('x')
f = (x**3 / 3) - (2 * x**2) - 3 * x + 1

print(minimum(f, x, ivl))
print(maximum(f, x, ivl))
print(stationary_points(f, x, ivl))

但我不确定选择符号计算是否是一个好的选择,因为我处理的是大尺寸,而且我也没有意识到如何将它用于多变量情况。例如,以下不起作用f = x[0]**2+ 2*x[1]

【问题讨论】:

  • 您的数据集上是否有 y 或因变量?或者您只有 x 或自变量(训练和测试)?如果你没有 y,那么你就不能适应。
  • 是的,当然。我编辑了我的问题以强调这一点
  • 你能在list_of_points中给一个样品吗?
  • list_of_points=[[1,2,3.2],[2,4.2, 5.1], [-1,0.1, 0.9]] list_of_values=[4,5,6], domain=[[-10,10], [-10,10], [-10, 10]]#-10<=x,y,z<=10, degree_of_regression_polynomial=1
  • p1=[1,2,3.2], p2=[2,4.2, 5.1], p3=[-1,0.1, 0.9] 对应的值分别为 4、5、6。这是正确的吗?我们将创建一个适合这些值的模型。从给定的具有维度 3 的 p1 加上它的值,我们现在正在处理 4D 数据,对吗? Output: list of points that are global maxima of f on domain.到底是什么意思,是不是说我们建好模型后,会搜索最大值的点?

标签: python machine-learning optimization regression


【解决方案1】:

这是一种使用伪代码的多项式特征的线性回归方法。

代码

import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn import linear_model
from sklearn.metrics import mean_squared_error


def minimize_mse():
    num_processor = 1
    X_train = [[0.44, 0.68], [0.99, 0.23]]
    X_test = [[0.24, 0.48], [0.29, 0.73]]

    print(f'X_train rows: {np.array(X_train).shape[0]}, X_train columns: {np.array(X_train).shape[1]}')

    y_train = [109.85, 155.72]
    y_test = [0.24, 0.58]

    best_mse = None
    best_degree = 1

    for d in range(1, 4):  # 1 to 3 degrees
        poly = PolynomialFeatures(degree=d)

        # Increase the number of features or column based on degree to improve the fit.
        # Rows or number of datasets are not increased.
        X_train_p = poly.fit_transform(X_train)
        X_test_p = poly.fit_transform(X_test)

        clf = linear_model.LinearRegression(n_jobs=num_processor)  # our model
        clf.fit(X_train_p, y_train)

        y_pred = clf.predict(X_test_p)
        mse = mean_squared_error(y_test, y_pred)
        print(f'degree: {d}, ytest: {y_test}, ypred: {y_pred}, mse: {mse}')

        if best_mse is None or mse < best_mse:
            best_mse = mse
            best_degree = d

    print(f'best mse: {best_mse:0.2f}, best degree: {best_degree}')


# start
minimize_mse()

输出

X_train rows: 2, X_train columns: 2
degree: 1, ytest: [0.24, 0.58], ypred: [108.03336634 100.31267327], mse: 10783.007971615527
degree: 2, ytest: [0.24, 0.58], ypred: [109.1846578  102.28740262], mse: 11106.667105279808
degree: 3, ytest: [0.24, 0.58], ypred: [109.68924338 103.82600437], mse: 11319.43714729889
best mse: 10783.01, best degree: 1

【讨论】:

  • 感谢您的回答!但我想要做一个多项式回归以获得一些函数 f,然后在某个域上找到 f 的最大值,例如在 d 维单位球体上,你能告诉我怎么做吗? (实际上,这是我遇到最大困难的地方)
  • 但是你已经写了input: n sample points of a function f 这意味着 f() 是一个输入。抱歉,我认为您需要正确描述问题。
  • 按照您的建议,我编辑了我的问题,并将其简化为我面临的主要困难。
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2012-09-18
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多