python - 使用 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()
解决方案
推荐阅读
- f# - 如何以 1 种记录类型或功能制定配方
- qt - Qt:当多个排队的信号调用同一个槽时如何避免死锁
- ruby-on-rails - 覆盖编辑功能 Devise, rails
- python - 我的 Kivy 程序在左下角随机出现一个白色方块
- python - aiohttp 并发 GET 请求导致 ClientConnectorError(8, 'nodename nor servname provided, or not known')
- swift - NSWindow 标题栏不能完全透明?
- javascript - 在 OPTIONS 为 CORS 返回 200 后,Axios 不处理来自 POST 的 500
- azure - 如何修复为 Linux 上托管的 Azure Function Core 创建事件网格订阅的错误?
- python - Optimizing dictionary look up using dict.items() for large dataset
- reactjs - Rendering when mapping over normalized redux state