我一直在使用该numpy.polyfit功能进行一些预测.如果我放入1度,它可以工作,但我需要做二次多项式拟合.在某些情况下它可以工作,在其他情况下,预测图会下降然后永远上升.例如:
import matplotlib.pyplot as plt
from numpy import *
x=[1,2,3,4,5,6,7,8,9,10]
y=[100,85,72,66,52,48,39,33,29,32]
fit = polyfit(x, y, degree)
fitfunction = poly1d(z4)
to_predict=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
plt.plot(to_predict,fitfunction(to_predict))
plt.show()
Run Code Online (Sandbox Code Playgroud)
在我运行之后,这显示了(我尝试放一张照片,但stackoverflow不会让我).
我想强迫它通过零.
我该怎么办?
我试图glm()使用变量而不是列名来适应R,但它不起作用.这可以帮助我自动生成glms.当我glm使用列名称时,程序运行正常,当我用包含列名的变量交换列名时,程序给出并出错.
这是我的命令的样子:
##The data
mydata <- structure(list(var1 = c(10L, 100L, 50L, 40L, 20L, 50L, 60L, 55L,
45L), var2 = c(1.5, 1.2, 1, 1.4, 1.2, 1.4, 1.3, 1.4, 1.3), var3 = c(5L,
3L, 4L, 1L, 5L, 2L, 7L, 5L, 4L), group = structure(c(1L, 1L,
2L, 2L, 1L, 1L, 2L, 1L, 1L), .Label = c("A", "B"), class = "factor")), .Names = c("var1",
"var2", "var3", "group"), class = "data.frame", row.names = c(NA,
-9L))
## My variable
x <- c("var1+var2") …Run Code Online (Sandbox Code Playgroud) 我正在使用 gamlss 包中的示例代码来绘制百分位数曲线:
library(gamlss)
data(abdom)
lms(y,x , data=abdom, n.cyc=30)
Run Code Online (Sandbox Code Playgroud)

它正在绘制自己的一组百分位曲线。我如何选择只绘制第 10、50 和 90% 的曲线?我也想避免绘制点,以便只绘制曲线。谢谢你的帮助。
我正在尝试将 Boltzmann sigmoid 拟合1/(1+exp((x-p1)/p2))到这个小型实验数据集:
xdata <- c(-60,-50,-40,-30,-20,-10,-0,10)
ydata <- c(0.04, 0.09, 0.38, 0.63, 0.79, 1, 0.83, 0.56)
Run Code Online (Sandbox Code Playgroud)
我知道这很简单。例如,使用nls:
fit <-nls(ydata ~ 1/(1+exp((xdata-p1)/p2)),start=list(p1=mean(xdata),p2=-5))
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
Formula: ydata ~ 1/(1 + exp((xdata - p1)/p2))
Parameters:
Estimate Std. Error t value Pr(>|t|)
p1 -33.671 4.755 -7.081 0.000398 ***
p2 -10.336 4.312 -2.397 0.053490 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.1904 on 6 degrees of freedom
Number of …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 ipython --pylab 将数据集拟合到超策略方程中:y = ax / (b + x)
from scipy import optimize as opti
import numpy as np
from pandas import DataFrame
x = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8])
y = np.array([0.375, 0.466, 0.509, 0.520, 0.525, 0.536, 0.541])
y_stdev = np.array([0.025, 0.016, 0.009, 0.009, 0.025, 0.019])
def func(x, a, b):
return a*x / (b + x)
popt, pcov = opti.curve_fit(func, x, y)
print(popt)
print("a = ", popt.ix[0])
print("b = ", popt.ix[1])
Run Code Online (Sandbox Code Playgroud)
a和b的值应该在 …
不幸的是,当我尝试使用标准lognorm.pdf()时,拟合分布的形状非常不同。我想这是因为我的数据已经分箱了。这是代码:
times, data, bin_points = ReadHistogramFile(filename)
xmin = 200
xmax = 800
x = np.linspace(xmin, xmax, 1000)
shape, loc, scale = stats.lognorm.fit(data, floc=0)
pdf = stats.lognorm.pdf(x, shape, loc=loc, scale=scale)
area=data.sum()
plt.bar(bars, data, width=10, color='b')
plt.plot(x*area, pdf, 'k' )
Run Code Online (Sandbox Code Playgroud)
这是拟合分布的样子:
显然,缩放也有问题。不过我不太关心这个。我的主要问题是分布的形状。这可能与:this question但我找不到正确的解决方案重复。我试过了,仍然得到与上述操作非常相似的形状。谢谢你的帮助!
更新:
通过使用curve_fit()我能够得到一些适合。但我还不满意。我想要原始垃圾箱而不是统一垃圾箱。此外,我不确定到底发生了什么,以及是否没有更合适的。这是代码:
def normalize_integral(data, bin_size):
normalized_data = np.zeros(size(data))
print bin_size
sum = data.sum()
integral = bin_size*sum
for i in range(0, size(data)-1):
normalized_data[i] = data[i]/integral
print 'integral:', normalized_data.sum()*bin_size
return normalized_data
def pdf(x, mu, …Run Code Online (Sandbox Code Playgroud) 我试图适应这个数据集:
#Mydataset damped sine wave data
#X ---- Y
45.80 320.0
91.60 -254.0
137.4 198.0
183.2 -156.0
229.0 126.0
274.8 -100.0
320.6 80.0
366.4 -64.0
412.2 52.0
458.0 -40.0
503.8 34.0
549.6 -26.0
595.4 22.0
641.2 -18.0
Run Code Online (Sandbox Code Playgroud)
所以我首先设置了适合的宏
f(x) = exp(-a*x)*sin(b*x)
Run Code Online (Sandbox Code Playgroud)
然后我做了适当的合身
fit f(x) 'data.txt' via a,b
iter chisq delta/lim lambda a b
0 2.7377200000e+05 0.00e+00 1.10e-19 1.000000e+00 1.000000e+00
Current data point
=========================
# = 1 out of 14
x = -5.12818e+20
z = 320
Current set of parameters …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 scipy.optimize.curve_fit 拟合一些数据。我的拟合函数是:
def fitfun(x, a):
return np.exp(a*(x - b))
Run Code Online (Sandbox Code Playgroud)
我想要的是定义a为拟合参数,以及b根据我想要拟合的数据而变化的参数。这意味着对于一组数据,我希望拟合函数:np.exp(a*(x - 10))而对于另一组数据,我希望拟合函数np.exp(a*(x - 20))。原则上,我希望参数 b 作为任何值传入。
我目前调用 curve_fit 的方式是:
coeffs, coeffs_cov = curve_fit(fitfun, xdata, ydata)
Run Code Online (Sandbox Code Playgroud)
但我想要的是这样的:
b=10
coeffs, coeffs_cov = curve_fit(fitfun(b), xdata, ydata)
b=20
coeffs2, coeffs_cov2 = curve_fit(fitfun(b), xdata, ydata)
Run Code Online (Sandbox Code Playgroud)
这样我就可以得到两种情况下的系数 a(b=10 和 b=20)。
我是 python 的新手,所以我无法让它工作,即使我试图阅读文档。任何帮助将不胜感激。
我有以下数据点想要曲线拟合:
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
t = np.array([15474.6, 15475.6, 15476.6, 15477.6, 15478.6, 15479.6, 15480.6,
15481.6, 15482.6, 15483.6, 15484.6, 15485.6, 15486.6, 15487.6,
15488.6, 15489.6, 15490.6, 15491.6, 15492.6, 15493.6, 15494.6,
15495.6, 15496.6, 15497.6, 15498.6, 15499.6, 15500.6, 15501.6,
15502.6, 15503.6, 15504.6, 15505.6, 15506.6, 15507.6, 15508.6,
15509.6, 15510.6, 15511.6, 15512.6, 15513.6])
v = np.array([4.082, 4.133, 4.136, 4.138, 4.139, 4.14, 4.141, 4.142, 4.143,
4.144, 4.144, 4.145, 4.145, 4.147, 4.146, 4.147, 4.148, 4.148,
4.149, 4.149, 4.149, 4.15, 4.15, …Run Code Online (Sandbox Code Playgroud) 我在 x0 和 y0 数组中有对数正态分布数据:
x0.ravel() = array([19.8815 , 19.0141 , 18.1857 , 17.3943 , 16.6382 , 15.9158 ,
15.2254 , 14.5657 , 13.9352 , 13.3325 , 12.7564 , 12.2056 ,
11.679 , 11.1755 , 10.6941 , 10.2338 , 9.79353, 9.37249,
8.96979, 8.58462, 8.21619, 7.86376, 7.52662, 7.20409,
6.89552, 6.6003 , 6.31784, 6.04757, 5.78897, 5.54151,
5.30472, 5.07812, 4.86127, 4.65375, 4.45514, 4.26506,
4.08314, 3.90903, 3.74238, 3.58288, 3.4302 , 3.28407,
3.14419, 3.01029, 2.88212, 2.75943, 2.64198, 2.52955,
2.42192, 2.31889, 2.22026, 2.12583, 2.03543, 1.94889,
1.86604, …Run Code Online (Sandbox Code Playgroud) curve-fitting ×10
python ×5
scipy ×4
r ×3
data-fitting ×2
numpy ×2
bar-chart ×1
character ×1
exponential ×1
gamlss ×1
glm ×1
gnuplot ×1
nls ×1
percentile ×1
plot ×1
python-3.x ×1
statistics ×1