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.14017421024502058
violation: 0.061581950654932605
violation: 0.034777744528725146
violation: 0.02315591268977696
violation: 0.016289564836607567
violation: 0.01173219772280987
violation: 0.009261179153190047
violation: 0.007770502529914444
violation: 0.0069574716101591695
violation: 0.006457414370355114
violation: 0.006191115125282096
violation: 0.00605723897445772
violation: 0.006000777806339404
violation: 0.005868357891308819
violation: 0.005802918028534048
violation: 0.005772367658830023
violation: 0.0057569479717779265
violation: 0.005733332889919173
violation: 0.005700606624645006
violation: 0.005667827078790976
violation: 0.005587736630048306
violation: 0.005529135183167072
violation: 0.0054607606740759325
violation: 0.005375194673451681
violation: 0.005288054442075142
violation: 0.005203284939611513
violation: 0.0051102699318454365
violation: 0.00500496961331754
violation: 0.004889401944567452
violation: 0.004778610916794712
violation: 0.004657040705272504
violation: 0.0045276423083831065
violation: 0.00439371747717492
violation: 0.004267124138925789
violation: 0.004133928133016134
violation: 0.004012755928138803
violation: 0.003891465351926888
violation: 0.003765260270042798
violation: 0.0036375148218629905
violation: 0.003514710166154353
violation: 0.0033965138303584685
violation: 0.003292520557980705
violation: 0.00319416481327227
violation: 0.00310494702933349
violation: 0.0030221674035500207
violation: 0.0029389646390341364
violation: 0.002856115850045393
violation: 0.0027738912186804254
violation: 0.002692711668737009
violation: 0.0026129548289078493
violation: 0.002535164470212188
violation: 0.0024587403634381633
violation: 0.0023842026907913705
violation: 0.002313303909478438
violation: 0.0022437367434811123
violation: 0.002175116992578309
violation: 0.002108409449091929
violation: 0.002043667805247795
violation: 0.0019806643593505402
violation: 0.0019243270194361996
violation: 0.00187132616320604
violation: 0.001819567820069506
violation: 0.0017692749012867134
violation: 0.0017204657491191335
violation: 0.0016731692686998206
violation: 0.0016274950351466385
violation: 0.0015839173329700038
violation: 0.0015418960309269286
violation: 0.001501438543131514
violation: 0.0014629272012162135
violation: 0.0014262081321617032
violation: 0.0013907597658089701
violation: 0.0013601582805155411
violation: 0.001332846482400525
violation: 0.0013065923988232143
violation: 0.0012813357494813671
violation: 0.0012569657401122058
violation: 0.001236365872739846
violation: 0.0012190114699550845
violation: 0.0011992116544501785
violation: 0.0011775622624512069
violation: 0.001158260908541634
violation: 0.0011389415923631686
violation: 0.001119912492936143
violation: 0.001100675488454153
violation: 0.001083277704027752
violation: 0.0010661363692306732
violation: 0.001049193369470303
violation: 0.0010318244102609047
violation: 0.0010150792321237461
violation: 0.0009988201809299185
violation: 0.0009841318528819665
violation: 0.0009699922960876266
violation: 0.0009545966012008647
violation: 0.0009396363331383708
violation: 0.0009266599168143289
violation: 0.0009140262172602532
violation: 0.0009015875006376579
violation: 0.0008902182357107061
violation: 0.0008780499311873492
violation: 0.0008660457470919888
violation: 0.0008543517499939163
violation: 0.0008428706003289881
violation: 0.0008315536804371918
violation: 0.0008208847158800624
violation: 0.0008104269807766221
violation: 0.0007997522484734608
violation: 0.0007893350738956101
violation: 0.0007791326607912636
violation: 0.0007691414390018107
violation: 0.0007597179067852347
violation: 0.0007504652538895275
violation: 0.0007412456856973848
violation: 0.000732296617053983
violation: 0.0007235915691687087
violation: 0.0007151920055397624
violation: 0.0007069372346703005
violation: 0.0006987637535248719
violation: 0.0006907733550823975
violation: 0.0006830298779800253
violation: 0.0006754181243925579
violation: 0.0006679795936491591
violation: 0.0006606893398229262
violation: 0.0006536091296351496
violation: 0.0006466641120994819
violation: 0.0006399762615478623
violation: 0.0006335488650772446
violation: 0.0006273957420688533
violation: 0.0006215236000711817
violation: 0.0006161518203755916
violation: 0.0006113918151772975
violation: 0.0006071251736133689
violation: 0.0006030938520875643
violation: 0.0005992255771887291
violation: 0.0005955122189367865
violation: 0.0005919356405962833
violation: 0.0005884735105285296
violation: 0.000585162619789212
violation: 0.000581947296680438
violation: 0.0005788624242478319
violation: 0.0005759087479598676
violation: 0.0005730546137308351
violation: 0.0005702968600982488
violation: 0.0005676053787178955
violation: 0.0005650176785166999
violation: 0.0005624480584370596
violation: 0.0005599281471045995
violation: 0.0005574208102721573
violation: 0.0005549930907515164
violation: 0.000552626309068445
violation: 0.000550323786351137
violation: 0.000548087574800749
violation: 0.0005458976082894449
violation: 0.0005437570853967301
violation: 0.0005416726314724723
violation: 0.0005396329582222986
violation: 0.0005376381718605883
violation: 0.0005358628850812842
violation: 0.0005342566446342563
violation: 0.0005327134944354256
violation: 0.0005311700256178934
violation: 0.00052963749017493
violation: 0.0005281469649352523
violation: 0.000526654947416134
violation: 0.0005251860718893233
violation: 0.0005237318107592547
violation: 0.0005222955570667443
violation: 0.0005208942964240501
violation: 0.0005195265168843448
violation: 0.0005181813428113579
violation: 0.0005168846752736751
violation: 0.000515660868027358
violation: 0.0005144616554314823
violation: 0.0005132891688189883
violation: 0.0005121515266403444
violation: 0.0005110364330893876
violation: 0.0005099447315066841
violation: 0.000508875361379343
violation: 0.0005078236610582169
violation: 0.0005067909112023138
violation: 0.0005057740763559386
violation: 0.0005047767175616301
violation: 0.0005037958933650737
violation: 0.0005028222129279181
violation: 0.0005018650428480077
violation: 0.0005009224423798862
violation: 0.0004999974962486635
violation: 0.0004990872395196625
violation: 0.0004981962000749473
violation: 0.0004973147318190403
violation: 0.000496441729673973
violation: 0.0004955753197883112
violation: 0.0004946901218460011
violation: 0.0004938210437307558
violation: 0.0004929673596845953
violation: 0.0004921226355845504
violation: 0.0004912871202795332
violation: 0.0004904596528540107
violation: 0.0004896376456528619
/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.27811881011285133
violation: 0.21103839273441977
violation: 0.16365897573754912
violation: 0.12638124502857231
violation: 0.09689398092857937
violation: 0.07386553913526402
violation: 0.05726304883639114
violation: 0.046397106968950774
violation: 0.03776270101072411
violation: 0.030324671559648304
violation: 0.024000077998569635
violation: 0.018705054318855444
violation: 0.014282427091628027
violation: 0.010676123451468686
violation: 0.00801653482738582
violation: 0.006238616114828318
violation: 0.005124394633030089
violation: 0.004490757479656482
violation: 0.004053115751123315
violation: 0.003744302603668807
violation: 0.0034289628116608408
violation: 0.003032319034755878
violation: 0.002727253739146753
violation: 0.0023865056940470604
violation: 0.0020851628627840298
violation: 0.0017697484695161992
violation: 0.0014925716272857204
violation: 0.001248860197404455
violation: 0.0010438675111377276
violation: 0.0008573236692761939
violation: 0.0006991377766200503
violation: 0.0005706218431927196
violation: 0.0004636286240955593
violation: 0.00037487235479899053
violation: 0.00030325790844271474
violation: 0.0002463663859384158
violation: 0.00019825804790411713
violation: 0.0001582773351929678
violation: 0.0001243907579281827
violation: 9.611089606616074e-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.171 seconds)