- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个要从中减去基线的光谱。光谱数据为:
1.484043000000000001e+00 1.121043091000000004e+03
1.472555999999999976e+00 1.140899658000000045e+03
1.461239999999999872e+00 1.135047851999999921e+03
1.450093000000000076e+00 1.153286499000000049e+03
1.439112000000000169e+00 1.158624877999999853e+03
1.428292000000000117e+00 1.249718872000000147e+03
1.417629999999999946e+00 1.491854857999999922e+03
1.407121999999999984e+00 2.524922362999999677e+03
1.396767000000000092e+00 4.102439940999999635e+03
1.386559000000000097e+00 4.013319579999999860e+03
1.376497999999999999e+00 3.128252441000000090e+03
1.366578000000000070e+00 2.633181152000000111e+03
1.356797999999999949e+00 2.340077147999999852e+03
1.347154999999999880e+00 2.099404540999999881e+03
1.337645999999999891e+00 2.012083983999999873e+03
1.328268000000000004e+00 2.052154540999999881e+03
1.319018999999999942e+00 2.061067871000000196e+03
1.309895999999999949e+00 2.205770507999999609e+03
1.300896999999999970e+00 2.199266602000000148e+03
1.292019000000000029e+00 2.317792235999999775e+03
1.283260000000000067e+00 2.357031494000000293e+03
1.274618000000000029e+00 2.434981689000000188e+03
1.266089999999999938e+00 2.540746337999999923e+03
1.257675000000000098e+00 2.605709472999999889e+03
1.249370000000000092e+00 2.667244141000000127e+03
1.241172999999999860e+00 2.800522704999999860e+03
我只从实际数据文件中提取了每 20 个数据点,但保留了一般形状。
import matplotlib.pyplot as plt
share = the_above_array
plt.plot(share)
原始光谱
在高 x 值周围有明显的尾部。假设尾部是人工制品,需要去除。我尝试过使用 ALS algorithm 的解决方案作者:P. Eilers,一个 rubberband approach , 和 peakutils包,但这些最终会减去尾部并在低 x 值周围产生上升或不产生合适的基线。
ALS 算法,在这个例子中我使用了 lam=1E6
和 p=0.001
;这些是我能够手动找到的最佳参数:
# ALS approach
from scipy import sparse
from scipy.sparse.linalg import spsolve
def baseline_als(y, lam, p, niter=10):
L = len(y)
D = sparse.csc_matrix(np.diff(np.eye(L), 2))
w = np.ones(L)
for i in range(niter):
W = sparse.spdiags(w, 0, L, L)
Z = W + lam * D.dot(D.transpose())
z = spsolve(Z, w*y)
w = p * (y > z) + (1-p) * (y < z)
return z
baseline = baseline_als(share[:,1], 1E6, 0.001)
baseline_subtracted = share[:,1] - baseline
plt.plot(baseline_subtracted)
橡皮筋方法:
# rubberband approach
from scipy.spatial import ConvexHull
def rubberband(x, y):
# Find the convex hull
v = ConvexHull(share).vertices
# Rotate convex hull vertices until they start from the lowest one
v = np.roll(v, v.argmax())
# Leave only the ascending part
v = v[:v.argmax()]
# Create baseline using linear interpolation between vertices
return np.interp(x, x[v], y[v])
baseline_rubber = rubberband(share[:,0], share[:,1])
intensity_rubber = share[:,1] - baseline_rubber
plt.plot(intensity_rubber)
peakutils 包:
# peakutils approach
import peakutils
baseline_peakutils = peakutils.baseline(share[:,1])
intensity_peakutils = share[:,1] - baseline_peakutils
plt.plot(intensity_peakutils)
除了屏蔽低 x 值数据之外,是否有任何建议可以构建基线并减去尾部而不增加低 x 值?
最佳答案
我找到了一组类似的ALS算法here .其中一种算法,非对称重新加权惩罚最小二乘平滑 (arpls
),比 als
的拟合效果稍好。
# arpls approach
from scipy.linalg import cholesky
def arpls(y, lam=1e4, ratio=0.05, itermax=100):
r"""
Baseline correction using asymmetrically
reweighted penalized least squares smoothing
Sung-June Baek, Aaron Park, Young-Jin Ahna and Jaebum Choo,
Analyst, 2015, 140, 250 (2015)
"""
N = len(y)
D = sparse.eye(N, format='csc')
D = D[1:] - D[:-1] # numpy.diff( ,2) does not work with sparse matrix. This is a workaround.
D = D[1:] - D[:-1]
H = lam * D.T * D
w = np.ones(N)
for i in range(itermax):
W = sparse.diags(w, 0, shape=(N, N))
WH = sparse.csc_matrix(W + H)
C = sparse.csc_matrix(cholesky(WH.todense()))
z = spsolve(C, spsolve(C.T, w * y))
d = y - z
dn = d[d < 0]
m = np.mean(dn)
s = np.std(dn)
wt = 1. / (1 + np.exp(2 * (d - (2 * s - m)) / s))
if np.linalg.norm(w - wt) / np.linalg.norm(w) < ratio:
break
w = wt
return z
baseline = baseline_als(share[:,1], 1E6, 0.001)
baseline_subtracted = share[:,1] - baseline
plt.plot(baseline_subtracted, 'r', label='als')
baseline_arpls = arpls(share[:,1], 1e5, 0.1)
intensity_arpls = share[:,1] - baseline_arpls
plt.plot(intensity_arpls, label='arpls')
plt.legend()
ARPLS 图
幸运的是,当使用来自整个频谱的数据时,这种改进变得更好:
请注意,两种算法的参数都不同。目前,我认为 arpls
算法是我所能得到的最接近的算法,至少对于看起来像这样的光谱来说是这样。我们将看到该算法如何稳健地拟合具有不同形状的光谱。当然,我总是乐于接受建议或改进!
关于python - 如何从 python 中尾部上升的频谱中减去基线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66039235/
我发现了一些令人费解的行为。给定一个包含 50 个日期的列表: structure(c("15513", "12830", "16503", "-3628", "15833", "13553", "4
我正在尝试创建单链表,但我不知道我做错了什么。 在插入元素 5、6、7、2、3、4 后,尾部应该是 4,但我得到的是 3,我不明白为什么。 这是我的代码: public void Insert(int
这是我的尾部代码(前 10 行): #include #include #include typedef char storage_datatype; #define MAXLINESIZE 1
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
是否有一种有效的方法可以从 List 中删除 X 元素的范围(例如尾部),例如LinkedList 在 Java 中? 显然可以一个一个地删除最后一个元素,这应该会导致 O(X) 级别的性能。至少对于
在之前的一篇文章我们介绍了《如何向php数组中头部和尾部添加元素》既然有添加元素,那么就有删除元素,今天这篇文章详细介绍如何删除数组中的头部元素和尾部元素,还有任意数组元素。 删除末尾元素:arr
在双向链表的实现中,我使用了典型的结构: struct node { void *data; struct node *prev; struct node *next; };
ECMA-335,III.2.4指定可以在递归函数中使用的tail.前缀。但是,我在C#和F#代码中都找不到它的用法。有使用in的示例吗? 最佳答案 您不会在当前的MS C#编译器生成的任何代码中找到
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
这个问题在这里已经有了答案: How to 'grep' a continuous stream? (13 个答案) 关闭 8 年前。 Tail 有以下选项: -f The -f opti
我试图弄清楚一旦我击中某个字符,如何从尾部修剪 Bash 中的字符串。 示例:如果我的字符串是这个(或任何链接):https://www.cnpp.usda.gov/Innovations/DataS
我试图弄清楚一旦我击中某个字符,如何从尾部修剪 Bash 中的字符串。 示例:如果我的字符串是这个(或任何链接):https://www.cnpp.usda.gov/Innovations/DataS
当我执行这段代码时,循环总是在第一次结束(即使 auth.log 的最后两行不包含“exit”),这意味着 $c总是得到一些字符串: while true; do c=$(tail -2 /v
我正在尝试编写一个“添加”函数,该函数接受节点中保存的值(表示为“n”),以及节点要添加到链表中的位置(表示为“pos”)。 我看到代码中有 3 个单独的添加函数 - addAtBeginning、a
为什么我不能得到“cd fjadf”? 程序总是向我显示 Bus error: 10... 我想用这个super_cut_tail()函数来截断用户指定的///fjdakf。但是为什么这个功能不能实现
有一个简化的表 mytable,其中列 ('id', 'mycolumn') 为 int 和 varchar(255 )分别。 在 mycolumn 中查找当前字符串具有最长公共(public)右侧部
这个问题已经有答案了: 已关闭13 年前。 Possible Duplicate: Get last n lines of a file with Python, similar to tail 你好
我想通过对写出的响应主体进行哈希处理来计算响应的实体标签。当我计算实体标签时,将实体标签添加到响应 header 已经太晚了。我想将实体标签添加到预告片中。我看到 net/http 包支持编写预告片,
我正在尝试通过 script.sh 从第 2 行到第 5 行打印文件 (myfile) 的内容。脚本无法从位置 2 打开文件。并且内容从第 1 行打印到第 4 行。以下是文件内容、命令和命令的输出。
在一个特殊的控制台上,我喜欢从/var/log/syslog 中过滤一些信息。这并不是很棘手: tail -f /var/log/syslog | awk '{print $2,$1,$9,$3,"\
我是一名优秀的程序员,十分优秀!