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) which correspond to saturated parts of the spectra. Note that 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 functionalities 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
_ = dataset.plot()

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
violation: 1.0
violation: 0.14017421024501997
violation: 0.06158195065493246
violation: 0.034777744528725
violation: 0.02315591268977684
violation: 0.016289564836607356
violation: 0.011732197722809729
violation: 0.009261179153190078
violation: 0.007770502529914399
violation: 0.006957471610159276
violation: 0.0064574143703549115
violation: 0.006191115125282092
violation: 0.006057238974457655
violation: 0.006000777806339514
violation: 0.005868357891308722
violation: 0.005802918028533877
violation: 0.005772367658829856
violation: 0.005756947971777887
violation: 0.005733332889918885
violation: 0.005700606624644934
violation: 0.005667827078790959
violation: 0.005587736630048284
violation: 0.005529135183167143
violation: 0.0054607606740760565
violation: 0.00537519467345162
violation: 0.0052880544420751685
violation: 0.0052032849396116505
violation: 0.005110269931845363
violation: 0.0050049696133173584
violation: 0.004889401944567311
violation: 0.004778610916794717
violation: 0.0046570407052727815
violation: 0.004527642308383061
violation: 0.004393717477175027
violation: 0.00426712413892579
violation: 0.004133928133016262
violation: 0.004012755928138743
violation: 0.0038914653519267154
violation: 0.003765260270042713
violation: 0.0036375148218630825
violation: 0.00351471016615435
violation: 0.0033965138303582564
violation: 0.0032925205579806523
violation: 0.003194164813272306
violation: 0.003104947029333422
violation: 0.003022167403550045
violation: 0.0029389646390339023
violation: 0.002856115850045506
violation: 0.0027738912186801488
violation: 0.002692711668736704
violation: 0.00261295482890778
violation: 0.0025351644702121417
violation: 0.0024587403634382574
violation: 0.0023842026907913124
violation: 0.002313303909478386
violation: 0.0022437367434809865
violation: 0.002175116992578803
violation: 0.002108409449092366
violation: 0.002043667805247798
violation: 0.0019806643593505632
violation: 0.0019243270194360905
violation: 0.0018713261632057464
violation: 0.0018195678200698757
violation: 0.0017692749012865841
violation: 0.001720465749119247
violation: 0.001673169268699802
violation: 0.0016274950351470479
violation: 0.0015839173329699895
violation: 0.0015418960309271108
violation: 0.0015014385431315605
violation: 0.001462927201215972
violation: 0.0014262081321620294
violation: 0.0013907597658089938
violation: 0.001360158280515739
violation: 0.0013328464824003282
violation: 0.0013065923988234305
violation: 0.0012813357494813125
violation: 0.0012569657401119891
violation: 0.0012363658727397632
violation: 0.001219011469955013
violation: 0.0011992116544499686
violation: 0.001177562262450998
violation: 0.0011582609085417203
violation: 0.001138941592363183
violation: 0.001119912492935986
violation: 0.0011006754884537178
violation: 0.0010832777040277978
violation: 0.0010661363692305585
violation: 0.0010491933694698693
violation: 0.0010318244102608236
violation: 0.0010150792321237329
violation: 0.0009988201809299159
violation: 0.000984131852881824
violation: 0.0009699922960876265
violation: 0.0009545966012006738
violation: 0.0009396363331384461
violation: 0.000926659916814281
violation: 0.000914026217260123
violation: 0.0009015875006377856
violation: 0.0008902182357105556
violation: 0.0008780499311870253
violation: 0.000866045747091962
violation: 0.0008543517499941442
violation: 0.0008428706003287194
violation: 0.0008315536804370376
violation: 0.0008208847158800326
violation: 0.0008104269807764804
violation: 0.0007997522484736512
violation: 0.0007893350738951652
violation: 0.0007791326607913702
violation: 0.0007691414390018421
violation: 0.0007597179067855492
violation: 0.0007504652538891681
violation: 0.0007412456856971366
violation: 0.0007322966170538879
violation: 0.0007235915691683436
violation: 0.000715192005539587
violation: 0.0007069372346704177
violation: 0.0006987637535249587
violation: 0.0006907733550822545
violation: 0.0006830298779799634
violation: 0.0006754181243924579
violation: 0.0006679795936490538
violation: 0.0006606893398233186
violation: 0.0006536091296351834
violation: 0.0006466641120995115
violation: 0.0006399762615475389
violation: 0.0006335488650771384
violation: 0.0006273957420689925
violation: 0.0006215236000709624
violation: 0.0006161518203753221
violation: 0.00061139181517756
violation: 0.0006071251736135551
violation: 0.0006030938520874036
violation: 0.0005992255771886548
violation: 0.0005955122189366179
violation: 0.000591935640596026
violation: 0.0005884735105285237
violation: 0.0005851626197891712
violation: 0.0005819472966805278
violation: 0.0005788624242482421
violation: 0.0005759087479596693
violation: 0.0005730546137308865
violation: 0.000570296860098468
violation: 0.0005676053787180415
violation: 0.0005650176785169518
violation: 0.0005624480584370004
violation: 0.0005599281471045727
violation: 0.0005574208102720868
violation: 0.0005549930907510944
violation: 0.0005526263090685432
violation: 0.0005503237863509324
violation: 0.000548087574800366
violation: 0.0005458976082893337
violation: 0.0005437570853968242
violation: 0.0005416726314727438
violation: 0.0005396329582222618
violation: 0.0005376381718610155
violation: 0.0005358628850809582
violation: 0.0005342566446342485
violation: 0.0005327134944357017
violation: 0.0005311700256181483
violation: 0.0005296374901746895
violation: 0.0005281469649347276
violation: 0.0005266549474163845
violation: 0.0005251860718894083
violation: 0.0005237318107588288
violation: 0.0005222955570667163
violation: 0.0005208942964237812
violation: 0.0005195265168844056
violation: 0.0005181813428113825
violation: 0.0005168846752736741
violation: 0.0005156608680271047
violation: 0.0005144616554311799
violation: 0.0005132891688187936
violation: 0.0005121515266402741
violation: 0.0005110364330894949
violation: 0.0005099447315067957
violation: 0.0005088753613791537
violation: 0.0005078236610582774
violation: 0.0005067909112026392
violation: 0.0005057740763561035
violation: 0.0005047767175613981
violation: 0.0005037958933648499
violation: 0.000502822212927529
violation: 0.0005018650428478291
violation: 0.0005009224423798668
violation: 0.0004999974962489344
violation: 0.0004990872395200156
violation: 0.0004981962000746231
violation: 0.0004973147318190953
violation: 0.0004964417296740992
violation: 0.0004955753197883229
violation: 0.0004946901218457436
violation: 0.0004938210437304455
violation: 0.0004929673596847161
violation: 0.0004921226355847043
violation: 0.0004912871202792737
violation: 0.0004904596528542734
violation: 0.0004896376456532266
/home/runner/work/spectrochempy/spectrochempy/.venv/lib/python3.13/site-packages/sklearn/decomposition/_nmf.py:1723: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
warnings.warn(
Get the results
The concentration \(C\) and the transposed matrix of spectra \(S^T\) can be obtained as follow
C = model.transform()
St = model.components
violation: 1.0
violation: 0.2781188101128542
violation: 0.21103839273442146
violation: 0.1636589757375502
violation: 0.1263812450285727
violation: 0.09689398092857943
violation: 0.07386553913526392
violation: 0.05726304883639112
violation: 0.04639710696895077
violation: 0.03776270101072402
violation: 0.030324671559648096
violation: 0.02400007799856944
violation: 0.018705054318855212
violation: 0.014282427091627827
violation: 0.010676123451468457
violation: 0.008016534827385662
violation: 0.006238616114828215
violation: 0.0051243946330300156
violation: 0.004490757479656446
violation: 0.004053115751123278
violation: 0.0037443026036687874
violation: 0.003428962811660762
violation: 0.003032319034755846
violation: 0.002727253739146668
violation: 0.0023865056940469806
violation: 0.002085162862783972
violation: 0.0017697484695161892
violation: 0.0014925716272857082
violation: 0.00124886019740448
violation: 0.001043867511137713
violation: 0.00085732366927618
violation: 0.0006991377766200488
violation: 0.0005706218431926803
violation: 0.0004636286240955422
violation: 0.0003748723547989925
violation: 0.0003032579084427421
violation: 0.0002463663859384233
violation: 0.00019825804790406373
violation: 0.00015827733519296894
violation: 0.00012439075792817882
violation: 9.61108960661468e-05
Converged at iteration 42
Plot results
_ = C.T.plot(title="Concentration", colormap=None, legend=C.k.labels)


Uncomment the following line to display all figures when running the script directly with Python.
# scp.show()
Total running time of the script: (0 minutes 1.136 seconds)