首页 > 解决方案 > 使用 scipy.optimize.curve_fit 的逻辑曲线拟合问题

问题描述

当我使用“fx(vv)”(多项式)时,图表上的线没问题。但是当我尝试使用“fL(vv)”时,输出线在数据中点 (x0) 的高度是水平的。非常欢迎任何帮助!

from scipy.optimize import curve_fit
from math import log, e, pi
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd

df = pd.read_excel(r'caminho/arquivo.xlsx')
y_data = df['Rating']
x_data = df['P']

#x_data = np.array(x_data)
#y_data = np.array(y_data)

#------------------------ Logística 1PL (Rasch) -----------------------------------
def fL1(x, a, L, x0):
    return L/(1+e**(-a*(x-x0)))
ppL1, covL1 = curve_fit(fL1, x_data, y_data)
print(f'Parâmetros da regressão: {ppL1}')

def fL(x):
    a = ppL1[0]; L = ppL1[1]; x0 = ppL1[2]
    return L/(1+e**(-a*(x-x0)))

# ------------------------- Polinômio ---------------------------
def func2(x, p0, p1, p2, p3, p4, p5, p6, p7, p8):
    return p0 + p1 * x + p2 * x ** 2 + p3 * x ** 3 + p4 * x ** 4 + p5 * x ** 5 + p6 * x ** 6 + p7 * x ** 7 + p8 * x ** 8
pp2, cov2 = curve_fit(func2, x_data, y_data)

def fx(x):
    return pp2[0] + pp2[1]*x + pp2[2]*x**2 + pp2[3]*x**3 + pp2[4]*x**4 + pp2[5]*x**5 + pp2[6]*x**6 + pp2[7]*x**7 + pp2[8]*x**8

modelo = []; x_linha = []; n_range = 100
for ww in range(n_range):
    vv = min(x_data) + (max(x_data)*ww - min(x_data)*ww) / n_range
    modelo.append(fx(vv))
    x_linha.append(vv)
 
plt.plot(x_linha, modelo, 'red', alpha=0.5)
plt.scatter(x_data, y_data)
plt.tight_layout()
plt.show()

在此处输入图像描述 在此处输入图像描述

标签: pythonoptimizationscipylogistic-regressionscipy-optimize

解决方案


推荐阅读