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
_ = 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
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.14017421024501953
violation: 0.06158195065493214
violation: 0.034777744528724806
violation: 0.023155912689776403
violation: 0.016289564836607165
violation: 0.011732197722809737
violation: 0.009261179153190016
violation: 0.007770502529914328
violation: 0.006957471610159205
violation: 0.006457414370354903
violation: 0.00619111512528213
violation: 0.006057238974457579
violation: 0.006000777806339342
violation: 0.005868357891308765
violation: 0.005802918028533876
violation: 0.005772367658829875
violation: 0.0057569479717776454
violation: 0.005733332889918944
violation: 0.005700606624644907
violation: 0.005667827078790961
violation: 0.005587736630048241
violation: 0.005529135183166926
violation: 0.005460760674075785
violation: 0.005375194673451652
violation: 0.0052880544420749655
violation: 0.005203284939611443
violation: 0.0051102699318453
violation: 0.00500496961331756
violation: 0.00488940194456727
violation: 0.0047786109167946575
violation: 0.0046570407052725785
violation: 0.0045276423083830475
violation: 0.004393717477174942
violation: 0.00426712413892573
violation: 0.004133928133016333
violation: 0.004012755928138938
violation: 0.003891465351926717
violation: 0.0037652602700428426
violation: 0.0036375148218629762
violation: 0.003514710166154274
violation: 0.003396513830358224
violation: 0.003292520557980407
violation: 0.003194164813272251
violation: 0.0031049470293335775
violation: 0.003022167403549904
violation: 0.002938964639033794
violation: 0.002856115850045687
violation: 0.0027738912186804432
violation: 0.002692711668736756
violation: 0.0026129548289078475
violation: 0.002535164470212135
violation: 0.002458740363437937
violation: 0.002384202690790969
violation: 0.0023133039094783534
violation: 0.0022437367434808295
violation: 0.0021751169925786243
violation: 0.0021084094490923023
violation: 0.002043667805248005
violation: 0.001980664359350896
violation: 0.0019243270194360346
violation: 0.0018713261632058973
violation: 0.0018195678200699018
violation: 0.001769274901286733
violation: 0.0017204657491192517
violation: 0.0016731692686995391
violation: 0.001627495035147015
violation: 0.0015839173329699585
violation: 0.0015418960309272517
violation: 0.0015014385431317751
violation: 0.0014629272012161624
violation: 0.0014262081321618017
violation: 0.0013907597658089218
violation: 0.0013601582805155502
violation: 0.001332846482400186
violation: 0.0013065923988233989
violation: 0.0012813357494811687
violation: 0.0012569657401118172
violation: 0.0012363658727396654
violation: 0.001219011469955176
violation: 0.0011992116544500171
violation: 0.001177562262451421
violation: 0.0011582609085417656
violation: 0.0011389415923633629
violation: 0.0011199124929359987
violation: 0.001100675488453869
violation: 0.001083277704027754
violation: 0.0010661363692305197
violation: 0.0010491933694700675
violation: 0.0010318244102607392
violation: 0.0010150792321236934
violation: 0.000998820180930083
violation: 0.0009841318528817364
violation: 0.0009699922960875243
violation: 0.00095459660120113
violation: 0.000939636333138724
violation: 0.0009266599168143967
violation: 0.0009140262172602852
violation: 0.0009015875006378166
violation: 0.0008902182357105069
violation: 0.0008780499311872262
violation: 0.0008660457470919805
violation: 0.0008543517499938871
violation: 0.0008428706003286008
violation: 0.0008315536804371789
violation: 0.0008208847158800633
violation: 0.0008104269807766301
violation: 0.000799752248473831
violation: 0.0007893350738952598
violation: 0.0007791326607912371
violation: 0.0007691414390018545
violation: 0.0007597179067852561
violation: 0.0007504652538889326
violation: 0.0007412456856971755
violation: 0.0007322966170540174
violation: 0.000723591569168282
violation: 0.0007151920055395746
violation: 0.000706937234670545
violation: 0.0006987637535250291
violation: 0.0006907733550823894
violation: 0.0006830298779801299
violation: 0.0006754181243923073
violation: 0.0006679795936492714
violation: 0.0006606893398232501
violation: 0.0006536091296353181
violation: 0.0006466641120996412
violation: 0.0006399762615474951
violation: 0.0006335488650772644
violation: 0.000627395742068922
violation: 0.0006215236000710895
violation: 0.0006161518203757627
violation: 0.00061139181517715
violation: 0.0006071251736135867
violation: 0.0006030938520872915
violation: 0.0005992255771887451
violation: 0.0005955122189369333
violation: 0.0005919356405964396
violation: 0.0005884735105285512
violation: 0.0005851626197890947
violation: 0.0005819472966805275
violation: 0.000578862424247883
violation: 0.0005759087479599299
violation: 0.0005730546137307958
violation: 0.0005702968600986653
violation: 0.0005676053787176668
violation: 0.0005650176785170027
violation: 0.0005624480584365344
violation: 0.0005599281471045897
violation: 0.0005574208102718483
violation: 0.0005549930907513292
violation: 0.0005526263090688115
violation: 0.0005503237863509223
violation: 0.0005480875748007008
violation: 0.0005458976082896356
violation: 0.00054375708539668
violation: 0.0005416726314728254
violation: 0.000539632958222076
violation: 0.0005376381718606799
violation: 0.0005358628850810773
violation: 0.000534256644634569
violation: 0.0005327134944353915
violation: 0.0005311700256180129
violation: 0.000529637490174759
violation: 0.0005281469649350321
violation: 0.0005266549474162278
violation: 0.0005251860718894665
violation: 0.0005237318107591307
violation: 0.0005222955570665478
violation: 0.0005208942964237302
violation: 0.0005195265168842065
violation: 0.0005181813428113475
violation: 0.0005168846752737369
violation: 0.0005156608680271593
violation: 0.0005144616554312788
violation: 0.0005132891688186177
violation: 0.000512151526640206
violation: 0.0005110364330893837
violation: 0.0005099447315065584
violation: 0.0005088753613792363
violation: 0.0005078236610585322
violation: 0.000506790911202322
violation: 0.0005057740763559921
violation: 0.0005047767175616349
violation: 0.0005037958933649443
violation: 0.000502822212927695
violation: 0.0005018650428481349
violation: 0.0005009224423800148
violation: 0.000499997496248823
violation: 0.0004990872395195248
violation: 0.0004981962000747869
violation: 0.0004973147318192331
violation: 0.0004964417296740034
violation: 0.0004955753197883452
violation: 0.0004946901218458259
violation: 0.0004938210437305241
violation: 0.0004929673596844108
violation: 0.0004921226355843065
violation: 0.0004912871202791037
violation: 0.000490459652853891
violation: 0.0004896376456531393
/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(
violation: 1.0
violation: 0.27811881011285317
violation: 0.21103839273442082
violation: 0.16365897573754998
violation: 0.12638124502857284
violation: 0.09689398092857984
violation: 0.07386553913526428
violation: 0.05726304883639141
violation: 0.04639710696895113
violation: 0.03776270101072449
violation: 0.030324671559648582
violation: 0.02400007799856991
violation: 0.01870505431885569
violation: 0.014282427091628254
violation: 0.01067612345146883
violation: 0.008016534827385968
violation: 0.006238616114828485
violation: 0.005124394633030236
violation: 0.004490757479656602
violation: 0.004053115751123452
violation: 0.003744302603668927
violation: 0.003428962811660921
violation: 0.0030323190347559515
violation: 0.002727253739146813
violation: 0.0023865056940470556
violation: 0.0020851628627840783
violation: 0.0017697484695162356
violation: 0.0014925716272857442
violation: 0.0012488601974044746
violation: 0.0010438675111377588
violation: 0.000857323669276244
violation: 0.0006991377766200592
violation: 0.0005706218431927092
violation: 0.00046362862409557806
violation: 0.00037487235479901964
violation: 0.00030325790844274494
violation: 0.00024636638593845614
violation: 0.0001982580479041039
violation: 0.00015827733519299003
violation: 0.00012439075792814813
violation: 9.611089606615765e-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.048 seconds)