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.14017421024501978
violation: 0.06158195065493257
violation: 0.03477774452872515
violation: 0.0231559126897769
violation: 0.01628956483660732
violation: 0.011732197722809874
violation: 0.009261179153190344
violation: 0.007770502529914284
violation: 0.006957471610159132
violation: 0.006457414370355002
violation: 0.006191115125282092
violation: 0.0060572389744576296
violation: 0.006000777806339355
violation: 0.005868357891308814
violation: 0.005802918028533975
violation: 0.005772367658829855
violation: 0.005756947971777895
violation: 0.005733332889919041
violation: 0.005700606624645023
violation: 0.0056678270787907815
violation: 0.0055877366300482855
violation: 0.0055291351831671465
violation: 0.005460760674076068
violation: 0.005375194673451654
violation: 0.0052880544420750315
violation: 0.005203284939611519
violation: 0.00511026993184547
violation: 0.005004969613317419
violation: 0.004889401944567257
violation: 0.004778610916794528
violation: 0.004657040705272694
violation: 0.004527642308383221
violation: 0.004393717477174938
violation: 0.0042671241389258706
violation: 0.004133928133016205
violation: 0.004012755928138753
violation: 0.003891465351926747
violation: 0.00376526027004279
violation: 0.003637514821862776
violation: 0.0035147101661546203
violation: 0.003396513830358227
violation: 0.0032925205579805027
violation: 0.003194164813272368
violation: 0.003104947029333498
violation: 0.0030221674035501135
violation: 0.0029389646390339656
violation: 0.0028561158500456656
violation: 0.0027738912186801444
violation: 0.0026927116687368094
violation: 0.002612954828907699
violation: 0.0025351644702121296
violation: 0.002458740363438468
violation: 0.0023842026907910977
violation: 0.002313303909478606
violation: 0.0022437367434811977
violation: 0.0021751169925786087
violation: 0.0021084094490923548
violation: 0.002043667805247953
violation: 0.001980664359350534
violation: 0.0019243270194361714
violation: 0.0018713261632057755
violation: 0.0018195678200697589
violation: 0.0017692749012864905
violation: 0.0017204657491193243
violation: 0.0016731692686998657
violation: 0.0016274950351470381
violation: 0.0015839173329700795
violation: 0.001541896030927183
violation: 0.0015014385431315197
violation: 0.0014629272012162474
violation: 0.0014262081321622475
violation: 0.0013907597658087848
violation: 0.001360158280515439
violation: 0.0013328464824003113
violation: 0.001306592398823213
violation: 0.0012813357494811052
violation: 0.0012569657401118827
violation: 0.0012363658727396806
violation: 0.0012190114699549303
violation: 0.001199211654450214
violation: 0.0011775622624512348
violation: 0.0011582609085416234
violation: 0.0011389415923629773
violation: 0.0011199124929361412
violation: 0.0011006754884537932
violation: 0.0010832777040275152
violation: 0.0010661363692305507
violation: 0.001049193369469965
violation: 0.0010318244102608645
violation: 0.0010150792321231075
violation: 0.000998820180930011
violation: 0.000984131852881491
violation: 0.0009699922960874968
violation: 0.0009545966012009457
violation: 0.0009396363331386996
violation: 0.0009266599168141418
violation: 0.0009140262172598516
violation: 0.0009015875006377595
violation: 0.0008902182357106546
violation: 0.0008780499311870851
violation: 0.0008660457470920349
violation: 0.0008543517499941231
violation: 0.0008428706003286076
violation: 0.0008315536804369769
violation: 0.0008208847158802429
violation: 0.0008104269807766936
violation: 0.0007997522484737117
violation: 0.0007893350738953587
violation: 0.0007791326607912242
violation: 0.0007691414390018293
violation: 0.0007597179067852058
violation: 0.0007504652538891296
violation: 0.0007412456856971898
violation: 0.0007322966170538064
violation: 0.0007235915691683434
violation: 0.0007151920055395052
violation: 0.0007069372346705242
violation: 0.0006987637535247766
violation: 0.0006907733550823918
violation: 0.0006830298779801241
violation: 0.0006754181243923799
violation: 0.0006679795936493214
violation: 0.000660689339822934
violation: 0.0006536091296349774
violation: 0.0006466641120997251
violation: 0.0006399762615476428
violation: 0.0006335488650774156
violation: 0.0006273957420689213
violation: 0.0006215236000714626
violation: 0.0006161518203755967
violation: 0.0006113918151773959
violation: 0.0006071251736135867
violation: 0.0006030938520871622
violation: 0.0005992255771888533
violation: 0.00059551221893683
violation: 0.0005919356405962673
violation: 0.000588473510528758
violation: 0.0005851626197890164
violation: 0.000581947296680716
violation: 0.0005788624242479022
violation: 0.0005759087479597813
violation: 0.0005730546137310244
violation: 0.0005702968600985063
violation: 0.0005676053787182102
violation: 0.0005650176785172103
violation: 0.0005624480584369215
violation: 0.0005599281471043036
violation: 0.0005574208102721707
violation: 0.0005549930907511366
violation: 0.0005526263090690016
violation: 0.00055032378635114
violation: 0.0005480875748005854
violation: 0.0005458976082893521
violation: 0.0005437570853967752
violation: 0.0005416726314727177
violation: 0.000539632958222288
violation: 0.0005376381718606448
violation: 0.0005358628850808555
violation: 0.0005342566446342118
violation: 0.0005327134944357187
violation: 0.0005311700256179392
violation: 0.0005296374901749812
violation: 0.0005281469649346941
violation: 0.0005266549474160974
violation: 0.0005251860718896876
violation: 0.0005237318107589822
violation: 0.000522295557066626
violation: 0.0005208942964238067
violation: 0.0005195265168840468
violation: 0.0005181813428113621
violation: 0.0005168846752735255
violation: 0.0005156608680270886
violation: 0.0005144616554314345
violation: 0.000513289168818562
violation: 0.0005121515266401873
violation: 0.0005110364330893394
violation: 0.0005099447315066031
violation: 0.0005088753613796274
violation: 0.0005078236610583071
violation: 0.0005067909112025662
violation: 0.0005057740763562728
violation: 0.0005047767175614345
violation: 0.0005037958933649702
violation: 0.0005028222129276786
violation: 0.0005018650428481125
violation: 0.0005009224423795844
violation: 0.0004999974962490268
violation: 0.0004990872395197992
violation: 0.0004981962000749507
violation: 0.0004973147318189693
violation: 0.0004964417296739963
violation: 0.0004955753197883365
violation: 0.0004946901218455715
violation: 0.0004938210437304487
violation: 0.0004929673596846995
violation: 0.0004921226355845338
violation: 0.0004912871202794597
violation: 0.0004904596528541339
violation: 0.000489637645653131
/home/runner/work/spectrochempy/spectrochempy/.venv/lib/python3.13/site-packages/sklearn/decomposition/_nmf.py:1728: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
warnings.warn(
violation: 1.0
violation: 0.2781188101128571
violation: 0.21103839273442343
violation: 0.1636589757375511
violation: 0.12638124502857298
violation: 0.09689398092857923
violation: 0.07386553913526343
violation: 0.0572630488363905
violation: 0.046397106968950046
violation: 0.037762701010723286
violation: 0.03032467155964734
violation: 0.024000077998568653
violation: 0.018705054318854455
violation: 0.014282427091627093
violation: 0.010676123451467835
violation: 0.008016534827385215
violation: 0.006238616114827887
violation: 0.005124394633029958
violation: 0.004490757479656451
violation: 0.004053115751123393
violation: 0.003744302603668924
violation: 0.0034289628116609384
violation: 0.003032319034755894
violation: 0.0027272537391467605
violation: 0.0023865056940470066
violation: 0.002085162862784008
violation: 0.0017697484695161603
violation: 0.0014925716272856963
violation: 0.0012488601974044113
violation: 0.0010438675111376853
violation: 0.0008573236692761419
violation: 0.000699137776620014
violation: 0.0005706218431926929
violation: 0.00046362862409549295
violation: 0.0003748723547989817
violation: 0.00030325790844269393
violation: 0.0002463663859383916
violation: 0.0001982580479040549
violation: 0.00015827733519292844
violation: 0.00012439075792815851
violation: 9.61108960661524e-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.097 seconds)