Note
Go to the end to download the full example code.
NMF analysis example
Import the spectrochempy API package
import spectrochempy as scp
Prepare the dataset to NMF factorize
Here we use a FTIR dataset corresponding the dehydration of a NH4Y zeolite and recorded in the OMNIC format.
dataset = scp.read_omnic("irdata/nh4y-activation.spg")
Mask some columns (features) wich correspond to saturated part of the spectra. Note taht we use float number for defining the limits for masking as coordinates (integer numbers would mean point index and s would lead t incorrect results)
dataset[:, 882.0:1280.0] = scp.MASKED
Make sure all data are positive. For this we use the math fonctionalities of NDDataset
objects (min
function to find the minimum value of the dataset
and the -
operator for subtrating this value to all spectra of the dataset.
Plot it for a visual check

Create a NMF object
As argument of the object constructor we define log_level to "INFO"
to
obtain verbose output during fit, and we set the number of component to use at 4.
Fit the model
model.fit(dataset)
# Get the results
# ---------------
#
# The concentration :math:`C` and the transposed matrix of spectra :math:`S^T` can
# be obtained as follow
C = model.transform()
St = model.components
violation: 1.0
violation: 0.14017421024502047
violation: 0.06158195065493263
violation: 0.034777744528725084
violation: 0.023155912689776806
violation: 0.0162895648366074
violation: 0.011732197722809836
violation: 0.009261179153189992
violation: 0.007770502529914356
violation: 0.00695747161015926
violation: 0.006457414370354963
violation: 0.006191115125282132
violation: 0.00605723897445761
violation: 0.006000777806339305
violation: 0.005868357891308803
violation: 0.005802918028533935
violation: 0.005772367658829866
violation: 0.005756947971777924
violation: 0.005733332889919033
violation: 0.005700606624644818
violation: 0.005667827078790818
violation: 0.005587736630048407
violation: 0.005529135183167047
violation: 0.005460760674075832
violation: 0.005375194673451784
violation: 0.005288054442075133
violation: 0.005203284939611594
violation: 0.005110269931845368
violation: 0.00500496961331764
violation: 0.004889401944567251
violation: 0.0047786109167946384
violation: 0.004657040705272484
violation: 0.004527642308383088
violation: 0.004393717477175065
violation: 0.004267124138925639
violation: 0.004133928133016109
violation: 0.0040127559281387185
violation: 0.0038914653519269153
violation: 0.0037652602700425737
violation: 0.0036375148218629277
violation: 0.0035147101661542573
violation: 0.003396513830358311
violation: 0.003292520557980672
violation: 0.0031941648132723607
violation: 0.003104947029333421
violation: 0.0030221674035499193
violation: 0.0029389646390338676
violation: 0.0028561158500456122
violation: 0.002773891218680115
violation: 0.0026927116687367626
violation: 0.002612954828907723
violation: 0.0025351644702121478
violation: 0.002458740363437938
violation: 0.0023842026907911567
violation: 0.002313303909478467
violation: 0.002243736743481188
violation: 0.0021751169925785657
violation: 0.002108409449092316
violation: 0.002043667805247838
violation: 0.0019806643593506187
violation: 0.0019243270194359541
violation: 0.0018713261632059184
violation: 0.0018195678200698434
violation: 0.0017692749012865302
violation: 0.0017204657491193638
violation: 0.0016731692686996215
violation: 0.00162749503514699
violation: 0.001583917332969875
violation: 0.0015418960309272305
violation: 0.0015014385431314258
violation: 0.0014629272012160043
violation: 0.0014262081321621191
violation: 0.0013907597658088808
violation: 0.0013601582805155834
violation: 0.0013328464824001584
violation: 0.001306592398823305
violation: 0.0012813357494812145
violation: 0.0012569657401119729
violation: 0.0012363658727394778
violation: 0.0012190114699549847
violation: 0.001199211654450155
violation: 0.0011775622624510735
violation: 0.001158260908541525
violation: 0.0011389415923631508
violation: 0.0011199124929362483
violation: 0.0011006754884538815
violation: 0.0010832777040276904
violation: 0.0010661363692304417
violation: 0.0010491933694703947
violation: 0.0010318244102606403
violation: 0.0010150792321235885
violation: 0.000998820180930219
violation: 0.000984131852881739
violation: 0.0009699922960875011
violation: 0.0009545966012005248
violation: 0.0009396363331388397
violation: 0.0009266599168143198
violation: 0.0009140262172602291
violation: 0.0009015875006379615
violation: 0.0008902182357104602
violation: 0.0008780499311872943
violation: 0.0008660457470919849
violation: 0.0008543517499941186
violation: 0.0008428706003289803
violation: 0.0008315536804371756
violation: 0.000820884715880259
violation: 0.0008104269807763656
violation: 0.0007997522484735932
violation: 0.0007893350738955414
violation: 0.0007791326607914431
violation: 0.0007691414390019153
violation: 0.0007597179067853764
violation: 0.000750465253889359
violation: 0.0007412456856971726
violation: 0.000732296617053831
violation: 0.0007235915691681262
violation: 0.0007151920055398259
violation: 0.0007069372346701718
violation: 0.0006987637535246275
violation: 0.0006907733550824732
violation: 0.0006830298779799123
violation: 0.0006754181243924448
violation: 0.0006679795936492645
violation: 0.0006606893398233241
violation: 0.0006536091296356544
violation: 0.0006466641120998018
violation: 0.0006399762615478118
violation: 0.0006335488650771577
violation: 0.0006273957420689908
violation: 0.0006215236000710545
violation: 0.0006161518203755029
violation: 0.0006113918151773503
violation: 0.0006071251736131763
violation: 0.0006030938520874749
violation: 0.0005992255771885685
violation: 0.0005955122189366781
violation: 0.0005919356405961738
violation: 0.0005884735105288106
violation: 0.000585162619789059
violation: 0.0005819472966806484
violation: 0.0005788624242479704
violation: 0.0005759087479596257
violation: 0.0005730546137308648
violation: 0.0005702968600982799
violation: 0.000567605378718009
violation: 0.0005650176785165846
violation: 0.0005624480584369633
violation: 0.0005599281471047651
violation: 0.0005574208102719684
violation: 0.0005549930907511937
violation: 0.0005526263090686803
violation: 0.0005503237863511584
violation: 0.0005480875748008812
violation: 0.0005458976082894407
violation: 0.0005437570853969856
violation: 0.0005416726314723748
violation: 0.000539632958222284
violation: 0.0005376381718608016
violation: 0.0005358628850810191
violation: 0.0005342566446342798
violation: 0.0005327134944355072
violation: 0.000531170025618011
violation: 0.0005296374901745119
violation: 0.0005281469649351376
violation: 0.0005266549474161031
violation: 0.000525186071889449
violation: 0.0005237318107590474
violation: 0.0005222955570666379
violation: 0.0005208942964238483
violation: 0.0005195265168840684
violation: 0.0005181813428110051
violation: 0.0005168846752735405
violation: 0.0005156608680271
violation: 0.0005144616554313547
violation: 0.0005132891688188986
violation: 0.0005121515266403605
violation: 0.0005110364330892761
violation: 0.0005099447315065785
violation: 0.0005088753613790582
violation: 0.0005078236610581583
violation: 0.0005067909112023607
violation: 0.0005057740763557847
violation: 0.0005047767175614994
violation: 0.0005037958933649218
violation: 0.0005028222129277074
violation: 0.0005018650428478355
violation: 0.0005009224423795297
violation: 0.0004999974962488276
violation: 0.0004990872395196958
violation: 0.0004981962000749504
violation: 0.000497314731819097
violation: 0.0004964417296739585
violation: 0.0004955753197880844
violation: 0.0004946901218459079
violation: 0.0004938210437304903
violation: 0.0004929673596843116
violation: 0.0004921226355847308
violation: 0.0004912871202791513
violation: 0.0004904596528540617
violation: 0.0004896376456529243
/home/runner/work/spectrochempy/spectrochempy/.venv/lib/python3.13/site-packages/sklearn/decomposition/_nmf.py:1742: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
warnings.warn(
violation: 1.0
violation: 0.27811881011285344
violation: 0.21103839273442085
violation: 0.16365897573755042
violation: 0.1263812450285737
violation: 0.09689398092858068
violation: 0.07386553913526514
violation: 0.05726304883639127
violation: 0.04639710696895082
violation: 0.0377627010107241
violation: 0.03032467155964823
violation: 0.024000077998569548
violation: 0.018705054318855323
violation: 0.014282427091627914
violation: 0.01067612345146853
violation: 0.008016534827385596
violation: 0.00623861611482815
violation: 0.005124394633030163
violation: 0.004490757479656644
violation: 0.004053115751123487
violation: 0.0037443026036689813
violation: 0.003428962811661001
violation: 0.0030323190347559953
violation: 0.0027272537391468503
violation: 0.002386505694047064
violation: 0.0020851628627841044
violation: 0.0017697484695162126
violation: 0.0014925716272857182
violation: 0.0012488601974044592
violation: 0.0010438675111377326
violation: 0.0008573236692761643
violation: 0.0006991377766200544
violation: 0.0005706218431926584
violation: 0.0004636286240955614
violation: 0.00037487235479897676
violation: 0.0003032579084427361
violation: 0.00024636638593840795
violation: 0.00019825804790407704
violation: 0.00015827733519296224
violation: 0.0001243907579281501
violation: 9.611089606618107e-05
Converged at iteration 42
Plot results
C.T.plot(title="Concentration", colormap=None, legend=C.k.labels)


[]
This ends the example ! The following line can be uncommented if no plot shows when running the .py script with python
# scp.show()
Total running time of the script: (0 minutes 1.278 seconds)