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.14017421024501955
violation: 0.06158195065493216
violation: 0.03477774452872487
violation: 0.023155912689776594
violation: 0.01628956483660717
violation: 0.011732197722809761
violation: 0.009261179153190127
violation: 0.007770502529914226
violation: 0.006957471610159089
violation: 0.0064574143703548924
violation: 0.006191115125282078
violation: 0.006057238974457544
violation: 0.006000777806339339
violation: 0.005868357891308524
violation: 0.00580291802853384
violation: 0.0057723676588298505
violation: 0.005756947971777822
violation: 0.005733332889918946
violation: 0.00570060662464477
violation: 0.005667827078791006
violation: 0.005587736630048283
violation: 0.005529135183166966
violation: 0.0054607606740758
violation: 0.005375194673451594
violation: 0.005288054442075037
violation: 0.0052032849396114475
violation: 0.005110269931845372
violation: 0.005004969613317475
violation: 0.004889401944567181
violation: 0.004778610916794574
violation: 0.00465704070527271
violation: 0.004527642308383066
violation: 0.004393717477174941
violation: 0.004267124138925647
violation: 0.0041339281330161235
violation: 0.004012755928138813
violation: 0.0038914653519268112
violation: 0.003765260270042726
violation: 0.0036375148218625915
violation: 0.003514710166154156
violation: 0.003396513830358267
violation: 0.0032925205579804983
violation: 0.0031941648132721686
violation: 0.003104947029333482
violation: 0.003022167403549887
violation: 0.0029389646390339265
violation: 0.0028561158500454136
violation: 0.0027738912186803183
violation: 0.0026927116687368636
violation: 0.0026129548289077196
violation: 0.0025351644702121872
violation: 0.0024587403634381455
violation: 0.0023842026907912187
violation: 0.002313303909478892
violation: 0.0022437367434811006
violation: 0.0021751169925784118
violation: 0.002108409449092357
violation: 0.0020436678052477364
violation: 0.0019806643593507675
violation: 0.0019243270194361185
violation: 0.0018713261632057991
violation: 0.001819567820069859
violation: 0.0017692749012867403
violation: 0.0017204657491190353
violation: 0.0016731692686997436
violation: 0.0016274950351472185
violation: 0.0015839173329699951
violation: 0.0015418960309275
violation: 0.0015014385431316509
violation: 0.0014629272012161873
violation: 0.0014262081321621755
violation: 0.001390759765808835
violation: 0.0013601582805157506
violation: 0.0013328464824001944
violation: 0.001306592398823477
violation: 0.0012813357494812596
violation: 0.0012569657401120054
violation: 0.001236365872739742
violation: 0.0012190114699549945
violation: 0.0011992116544502897
violation: 0.0011775622624511646
violation: 0.001158260908541617
violation: 0.0011389415923629984
violation: 0.001119912492936096
violation: 0.0011006754884538522
violation: 0.0010832777040279272
violation: 0.0010661363692307695
violation: 0.0010491933694697355
violation: 0.0010318244102607138
violation: 0.0010150792321237587
violation: 0.0009988201809300096
violation: 0.0009841318528816287
violation: 0.0009699922960878336
violation: 0.0009545966012011805
violation: 0.000939636333138523
violation: 0.0009266599168144464
violation: 0.0009140262172605033
violation: 0.000901587500637787
violation: 0.0008902182357107887
violation: 0.0008780499311871581
violation: 0.0008660457470919475
violation: 0.0008543517499941734
violation: 0.0008428706003285201
violation: 0.0008315536804369667
violation: 0.0008208847158802887
violation: 0.0008104269807764692
violation: 0.0007997522484735859
violation: 0.0007893350738952371
violation: 0.000779132660791569
violation: 0.0007691414390016129
violation: 0.0007597179067850527
violation: 0.0007504652538892772
violation: 0.0007412456856974879
violation: 0.0007322966170540297
violation: 0.0007235915691683146
violation: 0.0007151920055397923
violation: 0.0007069372346701131
violation: 0.00069876375352477
violation: 0.0006907733550825155
violation: 0.0006830298779799992
violation: 0.0006754181243926568
violation: 0.0006679795936490814
violation: 0.00066068933982315
violation: 0.0006536091296354512
violation: 0.000646664112099576
violation: 0.0006399762615478232
violation: 0.000633548865077239
violation: 0.0006273957420689258
violation: 0.0006215236000710716
violation: 0.0006161518203758253
violation: 0.0006113918151772693
violation: 0.0006071251736133402
violation: 0.000603093852087205
violation: 0.0005992255771884848
violation: 0.0005955122189368152
violation: 0.000591935640595852
violation: 0.000588473510528427
violation: 0.0005851626197891345
violation: 0.0005819472966803265
violation: 0.0005788624242480341
violation: 0.0005759087479601001
violation: 0.0005730546137309571
violation: 0.0005702968600984491
violation: 0.0005676053787180087
violation: 0.0005650176785169075
violation: 0.0005624480584368546
violation: 0.0005599281471046773
violation: 0.0005574208102723051
violation: 0.000554993090751176
violation: 0.0005526263090686709
violation: 0.0005503237863513232
violation: 0.0005480875748006565
violation: 0.0005458976082891899
violation: 0.0005437570853967783
violation: 0.0005416726314725566
violation: 0.0005396329582222985
violation: 0.0005376381718605983
violation: 0.0005358628850811443
violation: 0.0005342566446343963
violation: 0.0005327134944357097
violation: 0.0005311700256181395
violation: 0.0005296374901746921
violation: 0.0005281469649349857
violation: 0.0005266549474163146
violation: 0.0005251860718893418
violation: 0.0005237318107591268
violation: 0.0005222955570666963
violation: 0.0005208942964236861
violation: 0.000519526516884508
violation: 0.0005181813428113591
violation: 0.0005168846752735825
violation: 0.000515660868027219
violation: 0.0005144616554309468
violation: 0.0005132891688188931
violation: 0.0005121515266404569
violation: 0.0005110364330892137
violation: 0.0005099447315065673
violation: 0.0005088753613790917
violation: 0.0005078236610583228
violation: 0.0005067909112025417
violation: 0.0005057740763559305
violation: 0.0005047767175618703
violation: 0.0005037958933648816
violation: 0.0005028222129277471
violation: 0.0005018650428478904
violation: 0.0005009224423798585
violation: 0.0004999974962490227
violation: 0.0004990872395199254
violation: 0.0004981962000748716
violation: 0.0004973147318190668
violation: 0.0004964417296742334
violation: 0.0004955753197881884
violation: 0.0004946901218458751
violation: 0.0004938210437305869
violation: 0.0004929673596846159
violation: 0.0004921226355847787
violation: 0.0004912871202794453
violation: 0.0004904596528539579
violation: 0.0004896376456530138
/home/runner/work/spectrochempy/spectrochempy/.venv/lib/python3.13/site-packages/sklearn/decomposition/_nmf.py:1720: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
warnings.warn(
violation: 1.0
violation: 0.2781188101128439
violation: 0.21103839273441488
violation: 0.16365897573754729
violation: 0.1263812450285727
violation: 0.09689398092858108
violation: 0.07386553913526611
violation: 0.057263048836391967
violation: 0.0463971069689515
violation: 0.03776270101072486
violation: 0.030324671559649193
violation: 0.024000077998570558
violation: 0.0187050543188564
violation: 0.01428242709162897
violation: 0.010676123451469389
violation: 0.008016534827386087
violation: 0.0062386161148284295
violation: 0.005124394633030009
violation: 0.004490757479656262
violation: 0.004053115751123053
violation: 0.0037443026036685133
violation: 0.0034289628116605498
violation: 0.003032319034755714
violation: 0.002727253739146565
violation: 0.00238650569404687
violation: 0.0020851628627839573
violation: 0.0017697484695161601
violation: 0.0014925716272856996
violation: 0.0012488601974044618
violation: 0.0010438675111377174
violation: 0.0008573236692762001
violation: 0.0006991377766200604
violation: 0.0005706218431927158
violation: 0.00046362862409556993
violation: 0.0003748723547990133
violation: 0.0003032579084427741
violation: 0.00024636638593843993
violation: 0.0001982580479041134
violation: 0.00015827733519297224
violation: 0.00012439075792820064
violation: 9.61108960661872e-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 0.955 seconds)