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.14017421024502127
violation: 0.061581950654933826
violation: 0.03477774452872546
violation: 0.023155912689777042
violation: 0.016289564836609184
violation: 0.011732197722809793
violation: 0.009261179153190403
violation: 0.007770502529914062
violation: 0.006957471610160011
violation: 0.006457414370354482
violation: 0.006191115125281784
violation: 0.00605723897445866
violation: 0.006000777806338005
violation: 0.005868357891308065
violation: 0.005802918028534201
violation: 0.0057723676588300075
violation: 0.005756947971777424
violation: 0.005733332889919695
violation: 0.005700606624645367
violation: 0.005667827078790364
violation: 0.005587736630048782
violation: 0.005529135183167177
violation: 0.005460760674077021
violation: 0.005375194673451167
violation: 0.005288054442075085
violation: 0.0052032849396118335
violation: 0.0051102699318468555
violation: 0.005004969613317136
violation: 0.004889401944567056
violation: 0.0047786109167943435
violation: 0.004657040705272313
violation: 0.004527642308382896
violation: 0.004393717477174037
violation: 0.004267124138926665
violation: 0.004133928133016141
violation: 0.004012755928139356
violation: 0.0038914653519254243
violation: 0.0037652602700432238
violation: 0.0036375148218637915
violation: 0.0035147101661553047
violation: 0.0033965138303589
violation: 0.003292520557980335
violation: 0.0031941648132733525
violation: 0.0031049470293327457
violation: 0.0030221674035478376
violation: 0.002938964639034419
violation: 0.0028561158500442544
violation: 0.002773891218677405
violation: 0.002692711668735708
violation: 0.0026129548289069633
violation: 0.0025351644702110007
violation: 0.0024587403634368163
violation: 0.0023842026907917703
violation: 0.0023133039094777163
violation: 0.002243736743479336
violation: 0.002175116992576574
violation: 0.0021084094490927503
violation: 0.002043667805248291
violation: 0.0019806643593497895
violation: 0.001924327019435219
violation: 0.0018713261632068755
violation: 0.0018195678200694564
violation: 0.0017692749012854616
violation: 0.001720465749120261
violation: 0.001673169268700397
violation: 0.0016274950351480397
violation: 0.001583917332972016
violation: 0.001541896030926935
violation: 0.0015014385431312614
violation: 0.001462927201215481
violation: 0.0014262081321628462
violation: 0.001390759765809342
violation: 0.0013601582805178492
violation: 0.001332846482399246
violation: 0.0013065923988251535
violation: 0.0012813357494808454
violation: 0.0012569657401110706
violation: 0.0012363658727428631
violation: 0.0012190114699541551
violation: 0.0011992116544480395
violation: 0.0011775622624531279
violation: 0.001158260908540583
violation: 0.001138941592361496
violation: 0.0011199124929367167
violation: 0.0011006754884545526
violation: 0.0010832777040281547
violation: 0.0010661363692293115
violation: 0.0010491933694714596
violation: 0.0010318244102619433
violation: 0.0010150792321222916
violation: 0.000998820180932654
violation: 0.0009841318528800722
violation: 0.000969992296090054
violation: 0.0009545966012019707
violation: 0.0009396363331373757
violation: 0.0009266599168129175
violation: 0.0009140262172582329
violation: 0.0009015875006402203
violation: 0.0008902182357114041
violation: 0.0008780499311873902
violation: 0.0008660457470904542
violation: 0.0008543517499935869
violation: 0.000842870600327799
violation: 0.0008315536804372186
violation: 0.0008208847158776002
violation: 0.0008104269807768907
violation: 0.0007997522484743117
violation: 0.0007893350738927441
violation: 0.0007791326607905994
violation: 0.0007691414390022516
violation: 0.0007597179067852884
violation: 0.0007504652538920262
violation: 0.0007412456856969733
violation: 0.0007322966170526217
violation: 0.0007235915691701638
violation: 0.0007151920055412937
violation: 0.0007069372346689271
violation: 0.0006987637535251452
violation: 0.0006907733550831009
violation: 0.0006830298779806952
violation: 0.0006754181243958113
violation: 0.0006679795936486543
violation: 0.0006606893398238414
violation: 0.0006536091296337679
violation: 0.0006466641120983276
violation: 0.000639976261545883
violation: 0.0006335488650773283
violation: 0.0006273957420704415
violation: 0.0006215236000722087
violation: 0.0006161518203744127
violation: 0.000611391815178053
violation: 0.0006071251736123368
violation: 0.0006030938520877273
violation: 0.000599225577188373
violation: 0.0005955122189361343
violation: 0.0005919356405977104
violation: 0.0005884735105273066
violation: 0.000585162619786853
violation: 0.0005819472966811845
violation: 0.0005788624242487594
violation: 0.0005759087479592877
violation: 0.0005730546137309848
violation: 0.000570296860096508
violation: 0.0005676053787187555
violation: 0.000565017678518973
violation: 0.0005624480584347158
violation: 0.000559928147105663
violation: 0.0005574208102717317
violation: 0.0005549930907533312
violation: 0.0005526263090676975
violation: 0.0005503237863486965
violation: 0.0005480875748001755
violation: 0.0005458976082852943
violation: 0.0005437570853942309
violation: 0.0005416726314724124
violation: 0.0005396329582208715
violation: 0.0005376381718610252
violation: 0.0005358628850825949
violation: 0.0005342566446347802
violation: 0.000532713494436358
violation: 0.0005311700256185654
violation: 0.0005296374901732
violation: 0.0005281469649343341
violation: 0.0005266549474177626
violation: 0.0005251860718880421
violation: 0.0005237318107618877
violation: 0.0005222955570670862
violation: 0.0005208942964242912
violation: 0.0005195265168815941
violation: 0.0005181813428130216
violation: 0.0005168846752707565
violation: 0.0005156608680284391
violation: 0.0005144616554313265
violation: 0.0005132891688175729
violation: 0.0005121515266419433
violation: 0.0005110364330921025
violation: 0.0005099447315060061
violation: 0.0005088753613810507
violation: 0.00050782366105686
violation: 0.0005067909112002909
violation: 0.0005057740763565619
violation: 0.0005047767175622686
violation: 0.0005037958933653865
violation: 0.0005028222129282473
violation: 0.0005018650428453911
violation: 0.0005009224423804026
violation: 0.0004999974962471319
violation: 0.0004990872395159317
violation: 0.000498196200071766
violation: 0.0004973147318199833
violation: 0.0004964417296737588
violation: 0.0004955753197870234
violation: 0.0004946901218475447
violation: 0.0004938210437310126
violation: 0.0004929673596852946
violation: 0.0004921226355864977
violation: 0.0004912871202805151
violation: 0.0004904596528548249
violation: 0.000489637645655255
/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.27811881011286815
violation: 0.21103839273442937
violation: 0.16365897573755378
violation: 0.12638124502857387
violation: 0.09689398092857893
violation: 0.07386553913526282
violation: 0.057263048836391404
violation: 0.04639710696895097
violation: 0.037762701010723806
violation: 0.03032467155964754
violation: 0.02400007799856863
violation: 0.018705054318854143
violation: 0.014282427091626556
violation: 0.010676123451467423
violation: 0.008016534827384722
violation: 0.006238616114827668
violation: 0.005124394633029814
violation: 0.004490757479656399
violation: 0.004053115751123398
violation: 0.003744302603668911
violation: 0.003428962811661062
violation: 0.0030323190347557984
violation: 0.0027272537391466053
violation: 0.002386505694046717
violation: 0.0020851628627836342
violation: 0.0017697484695159975
violation: 0.0014925716272855551
violation: 0.0012488601974042636
violation: 0.0010438675111375101
violation: 0.0008573236692759703
violation: 0.0006991377766199034
violation: 0.0005706218431925661
violation: 0.000463628624095466
violation: 0.0003748723547988424
violation: 0.0003032579084426153
violation: 0.00024636638593832354
violation: 0.0001982580479039745
violation: 0.0001582773351928877
violation: 0.0001243907579281227
violation: 9.61108960661097e-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.464 seconds)