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.14017421024502003
violation: 0.06158195065493243
violation: 0.03477774452872511
violation: 0.023155912689776785
violation: 0.016289564836607283
violation: 0.011732197722809782
violation: 0.009261179153190162
violation: 0.007770502529914507
violation: 0.006957471610159129
violation: 0.006457414370354953
violation: 0.006191115125281956
violation: 0.006057238974457805
violation: 0.0060007778063394255
violation: 0.005868357891308793
violation: 0.0058029180285338895
violation: 0.005772367658829867
violation: 0.005756947971777939
violation: 0.005733332889918983
violation: 0.005700606624644822
violation: 0.005667827078790904
violation: 0.005587736630048417
violation: 0.005529135183167037
violation: 0.005460760674075924
violation: 0.005375194673451822
violation: 0.005288054442074974
violation: 0.00520328493961174
violation: 0.00511026993184542
violation: 0.005004969613317336
violation: 0.004889401944567315
violation: 0.004778610916794641
violation: 0.004657040705272675
violation: 0.004527642308383124
violation: 0.004393717477174926
violation: 0.004267124138925818
violation: 0.0041339281330161825
violation: 0.0040127559281387054
violation: 0.0038914653519268568
violation: 0.0037652602700427385
violation: 0.0036375148218630127
violation: 0.003514710166154382
violation: 0.0033965138303583475
violation: 0.0032925205579803934
violation: 0.003194164813272427
violation: 0.00310494702933336
violation: 0.0030221674035503005
violation: 0.0029389646390338233
violation: 0.002856115850045608
violation: 0.0027738912186802264
violation: 0.002692711668737097
violation: 0.0026129548289078076
violation: 0.002535164470212078
violation: 0.0024587403634379955
violation: 0.0023842026907913852
violation: 0.0023133039094785242
violation: 0.002243736743480962
violation: 0.0021751169925785592
violation: 0.002108409449092608
violation: 0.00204366780524783
violation: 0.00198066435935054
violation: 0.001924327019435828
violation: 0.0018713261632057878
violation: 0.001819567820069909
violation: 0.001769274901286519
violation: 0.0017204657491192927
violation: 0.0016731692686997885
violation: 0.0016274950351469783
violation: 0.001583917332970072
violation: 0.0015418960309270618
violation: 0.0015014385431315004
violation: 0.001462927201215883
violation: 0.0014262081321617843
violation: 0.0013907597658086844
violation: 0.0013601582805157098
violation: 0.0013328464824002156
violation: 0.0013065923988232818
violation: 0.0012813357494811627
violation: 0.0012569657401120338
violation: 0.001236365872739914
violation: 0.00121901146995483
violation: 0.001199211654449924
violation: 0.0011775622624518975
violation: 0.0011582609085416039
violation: 0.0011389415923630161
violation: 0.0011199124929361396
violation: 0.0011006754884538763
violation: 0.001083277704027713
violation: 0.0010661363692303987
violation: 0.001049193369470272
violation: 0.001031824410260922
violation: 0.001015079232123759
violation: 0.0009988201809297962
violation: 0.0009841318528815818
violation: 0.0009699922960875339
violation: 0.0009545966012010328
violation: 0.0009396363331387711
violation: 0.000926659916814504
violation: 0.0009140262172599847
violation: 0.000901587500637837
violation: 0.0008902182357105545
violation: 0.0008780499311872886
violation: 0.0008660457470919664
violation: 0.0008543517499941812
violation: 0.0008428706003289147
violation: 0.0008315536804370846
violation: 0.0008208847158801456
violation: 0.0008104269807764973
violation: 0.0007997522484736288
violation: 0.0007893350738951565
violation: 0.0007791326607916331
violation: 0.0007691414390017031
violation: 0.0007597179067852469
violation: 0.0007504652538892443
violation: 0.0007412456856970432
violation: 0.0007322966170542883
violation: 0.0007235915691682489
violation: 0.0007151920055393904
violation: 0.0007069372346703881
violation: 0.0006987637535247346
violation: 0.0006907733550824898
violation: 0.0006830298779799747
violation: 0.0006754181243922751
violation: 0.0006679795936491391
violation: 0.0006606893398230879
violation: 0.0006536091296351987
violation: 0.0006466641120994642
violation: 0.0006399762615476608
violation: 0.0006335488650772817
violation: 0.0006273957420689867
violation: 0.0006215236000710331
violation: 0.0006161518203756192
violation: 0.0006113918151774124
violation: 0.0006071251736134226
violation: 0.0006030938520872095
violation: 0.000599225577188929
violation: 0.0005955122189369419
violation: 0.0005919356405963339
violation: 0.000588473510528622
violation: 0.0005851626197890726
violation: 0.0005819472966807058
violation: 0.0005788624242480877
violation: 0.0005759087479599968
violation: 0.0005730546137311137
violation: 0.0005702968600985285
violation: 0.000567605378718049
violation: 0.0005650176785171141
violation: 0.0005624480584368722
violation: 0.0005599281471044251
violation: 0.000557420810271836
violation: 0.0005549930907510911
violation: 0.0005526263090688127
violation: 0.0005503237863509411
violation: 0.0005480875748008554
violation: 0.0005458976082892629
violation: 0.000543757085396764
violation: 0.0005416726314724945
violation: 0.0005396329582219312
violation: 0.0005376381718607085
violation: 0.000535862885081083
violation: 0.0005342566446344994
violation: 0.0005327134944354479
violation: 0.0005311700256181635
violation: 0.0005296374901746657
violation: 0.0005281469649347933
violation: 0.000526654947415799
violation: 0.0005251860718894168
violation: 0.0005237318107590588
violation: 0.0005222955570666991
violation: 0.0005208942964235441
violation: 0.0005195265168842477
violation: 0.0005181813428113679
violation: 0.0005168846752739557
violation: 0.0005156608680271171
violation: 0.0005144616554314371
violation: 0.0005132891688186557
violation: 0.0005121515266402974
violation: 0.0005110364330891719
violation: 0.000509944731506586
violation: 0.0005088753613792077
violation: 0.0005078236610580078
violation: 0.0005067909112021609
violation: 0.0005057740763558282
violation: 0.0005047767175615255
violation: 0.0005037958933648721
violation: 0.0005028222129277328
violation: 0.0005018650428480294
violation: 0.0005009224423798505
violation: 0.0004999974962488187
violation: 0.0004990872395197678
violation: 0.0004981962000745383
violation: 0.000497314731819021
violation: 0.0004964417296739801
violation: 0.0004955753197880821
violation: 0.000494690121845972
violation: 0.0004938210437306795
violation: 0.0004929673596844295
violation: 0.0004921226355842484
violation: 0.0004912871202792837
violation: 0.0004904596528538901
violation: 0.000489637645652958
/home/runner/work/spectrochempy/spectrochempy/.venv/lib/python3.10/site-packages/sklearn/decomposition/_nmf.py:1742: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
warnings.warn(
violation: 1.0
violation: 0.27811881011285733
violation: 0.21103839273442332
violation: 0.16365897573755064
violation: 0.12638124502857234
violation: 0.09689398092857858
violation: 0.07386553913526281
violation: 0.057263048836390405
violation: 0.04639710696895008
violation: 0.03776270101072333
violation: 0.030324671559647413
violation: 0.02400007799856874
violation: 0.018705054318854594
violation: 0.014282427091627227
violation: 0.010676123451467932
violation: 0.008016534827385407
violation: 0.006238616114828166
violation: 0.00512439463303009
violation: 0.004490757479656537
violation: 0.004053115751123407
violation: 0.0037443026036688854
violation: 0.0034289628116609128
violation: 0.003032319034755907
violation: 0.0027272537391468165
violation: 0.002386505694046995
violation: 0.002085162862784004
violation: 0.0017697484695161113
violation: 0.0014925716272856744
violation: 0.0012488601974043954
violation: 0.001043867511137712
violation: 0.0008573236692761598
violation: 0.0006991377766199918
violation: 0.0005706218431926758
violation: 0.00046362862409554613
violation: 0.00037487235479894386
violation: 0.0003032579084426579
violation: 0.0002463663859383888
violation: 0.0001982580479040266
violation: 0.00015827733519294864
violation: 0.00012439075792816675
violation: 9.611089606616848e-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.161 seconds)