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
_ = 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.14017421024501944
violation: 0.06158195065493232
violation: 0.03477774452872508
violation: 0.02315591268977686
violation: 0.016289564836607488
violation: 0.011732197722809715
violation: 0.009261179153190247
violation: 0.007770502529914529
violation: 0.006957471610159094
violation: 0.006457414370354996
violation: 0.006191115125282007
violation: 0.006057238974457763
violation: 0.0060007778063394905
violation: 0.00586835789130881
violation: 0.00580291802853415
violation: 0.005772367658830112
violation: 0.005756947971777843
violation: 0.005733332889919145
violation: 0.005700606624644882
violation: 0.005667827078790944
violation: 0.005587736630048273
violation: 0.005529135183167044
violation: 0.0054607606740759655
violation: 0.005375194673451714
violation: 0.005288054442075035
violation: 0.005203284939611439
violation: 0.005110269931845615
violation: 0.005004969613317459
violation: 0.0048894019445670355
violation: 0.004778610916794772
violation: 0.004657040705272713
violation: 0.004527642308383004
violation: 0.0043937174771749715
violation: 0.004267124138925874
violation: 0.004133928133016142
violation: 0.004012755928139109
violation: 0.003891465351926805
violation: 0.0037652602700426812
violation: 0.0036375148218628964
violation: 0.003514710166154517
violation: 0.0033965138303580986
violation: 0.00329252055798057
violation: 0.0031941648132720792
violation: 0.0031049470293337154
violation: 0.0030221674035499765
violation: 0.0029389646390340736
violation: 0.0028561158500458018
violation: 0.002773891218680144
violation: 0.002692711668736647
violation: 0.0026129548289078285
violation: 0.0025351644702119105
violation: 0.0024587403634379
violation: 0.002384202690790893
violation: 0.002313303909478575
violation: 0.0022437367434810255
violation: 0.002175116992578551
violation: 0.002108409449092761
violation: 0.002043667805247687
violation: 0.001980664359350624
violation: 0.0019243270194360122
violation: 0.0018713261632060496
violation: 0.001819567820069595
violation: 0.001769274901286681
violation: 0.0017204657491193037
violation: 0.0016731692686998013
violation: 0.0016274950351469252
violation: 0.0015839173329697648
violation: 0.0015418960309271448
violation: 0.001501438543131257
violation: 0.0014629272012159644
violation: 0.0014262081321621705
violation: 0.001390759765809032
violation: 0.001360158280515724
violation: 0.0013328464824004349
violation: 0.0013065923988232694
violation: 0.0012813357494809933
violation: 0.001256965740111885
violation: 0.0012363658727397996
violation: 0.001219011469955003
violation: 0.0011992116544499664
violation: 0.0011775622624513307
violation: 0.001158260908541522
violation: 0.001138941592362889
violation: 0.0011199124929362563
violation: 0.0011006754884540575
violation: 0.0010832777040277973
violation: 0.00106613636923076
violation: 0.0010491933694700157
violation: 0.001031824410260744
violation: 0.0010150792321235887
violation: 0.0009988201809300265
violation: 0.0009841318528820905
violation: 0.0009699922960873968
violation: 0.0009545966012010965
violation: 0.0009396363331386381
violation: 0.0009266599168144295
violation: 0.0009140262172600659
violation: 0.0009015875006377294
violation: 0.0008902182357105688
violation: 0.0008780499311871372
violation: 0.0008660457470921
violation: 0.0008543517499939907
violation: 0.0008428706003287789
violation: 0.0008315536804370072
violation: 0.0008208847158803234
violation: 0.0008104269807767027
violation: 0.0007997522484736127
violation: 0.0007893350738955032
violation: 0.0007791326607913421
violation: 0.0007691414390019424
violation: 0.0007597179067853
violation: 0.0007504652538892262
violation: 0.0007412456856970914
violation: 0.0007322966170539507
violation: 0.0007235915691684728
violation: 0.0007151920055394786
violation: 0.0007069372346701015
violation: 0.0006987637535250286
violation: 0.000690773355082286
violation: 0.0006830298779800111
violation: 0.0006754181243923288
violation: 0.0006679795936492603
violation: 0.0006606893398229022
violation: 0.0006536091296353778
violation: 0.000646664112099591
violation: 0.000639976261547651
violation: 0.0006335488650773315
violation: 0.0006273957420688576
violation: 0.0006215236000713032
violation: 0.0006161518203756036
violation: 0.0006113918151774559
violation: 0.0006071251736135695
violation: 0.0006030938520872878
violation: 0.0005992255771888347
violation: 0.0005955122189367694
violation: 0.0005919356405962567
violation: 0.0005884735105289462
violation: 0.0005851626197892308
violation: 0.0005819472966803584
violation: 0.0005788624242479912
violation: 0.000575908747959726
violation: 0.0005730546137309741
violation: 0.0005702968600986857
violation: 0.0005676053787181111
violation: 0.0005650176785169482
violation: 0.0005624480584368665
violation: 0.0005599281471046307
violation: 0.0005574208102721977
violation: 0.0005549930907512712
violation: 0.0005526263090687756
violation: 0.0005503237863512697
violation: 0.0005480875748007181
violation: 0.0005458976082896736
violation: 0.0005437570853970841
violation: 0.0005416726314724292
violation: 0.0005396329582222966
violation: 0.0005376381718605049
violation: 0.0005358628850808885
violation: 0.0005342566446342493
violation: 0.0005327134944356776
violation: 0.0005311700256181475
violation: 0.0005296374901747195
violation: 0.0005281469649349795
violation: 0.0005266549474161583
violation: 0.000525186071889736
violation: 0.0005237318107590936
violation: 0.0005222955570665523
violation: 0.0005208942964238545
violation: 0.0005195265168845279
violation: 0.0005181813428115649
violation: 0.0005168846752736944
violation: 0.0005156608680268982
violation: 0.0005144616554312061
violation: 0.0005132891688187811
violation: 0.0005121515266404445
violation: 0.0005110364330893286
violation: 0.0005099447315066025
violation: 0.0005088753613791162
violation: 0.0005078236610584383
violation: 0.0005067909112024895
violation: 0.000505774076356248
violation: 0.0005047767175615323
violation: 0.0005037958933645919
violation: 0.0005028222129280352
violation: 0.0005018650428479888
violation: 0.0005009224423799922
violation: 0.0004999974962485681
violation: 0.0004990872395193776
violation: 0.000498196200074924
violation: 0.0004973147318190451
violation: 0.0004964417296739598
violation: 0.0004955753197882653
violation: 0.0004946901218457909
violation: 0.0004938210437305581
violation: 0.000492967359684499
violation: 0.000492122635584445
violation: 0.0004912871202795222
violation: 0.0004904596528539727
violation: 0.0004896376456530609
/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.2781188101128537
violation: 0.21103839273442107
violation: 0.16365897573755028
violation: 0.12638124502857326
violation: 0.09689398092858005
violation: 0.07386553913526449
violation: 0.05726304883639139
violation: 0.04639710696895103
violation: 0.0377627010107244
violation: 0.03032467155964852
violation: 0.02400007799856985
violation: 0.018705054318855642
violation: 0.014282427091628193
violation: 0.010676123451468827
violation: 0.008016534827385896
violation: 0.006238616114828358
violation: 0.005124394633030249
violation: 0.004490757479656648
violation: 0.004053115751123501
violation: 0.0037443026036689977
violation: 0.003428962811660967
violation: 0.003032319034756024
violation: 0.0027272537391468663
violation: 0.0023865056940471255
violation: 0.0020851628627841204
violation: 0.0017697484695162738
violation: 0.001492571627285761
violation: 0.0012488601974045396
violation: 0.0010438675111377896
violation: 0.0008573236692762146
violation: 0.0006991377766200846
violation: 0.0005706218431927408
violation: 0.00046362862409553816
violation: 0.0003748723547989673
violation: 0.000303257908442729
violation: 0.0002463663859384414
violation: 0.00019825804790409926
violation: 0.00015827733519297235
violation: 0.00012439075792817578
violation: 9.611089606617029e-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.174 seconds)