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.1401742102450197
violation: 0.06158195065493221
violation: 0.034777744528725035
violation: 0.023155912689776476
violation: 0.01628956483660721
violation: 0.011732197722809696
violation: 0.009261179153190179
violation: 0.007770502529914382
violation: 0.0069574716101590784
violation: 0.006457414370354954
violation: 0.006191115125282217
violation: 0.006057238974457623
violation: 0.006000777806339346
violation: 0.005868357891308678
violation: 0.005802918028534078
violation: 0.005772367658830086
violation: 0.005756947971777786
violation: 0.005733332889919103
violation: 0.005700606624644769
violation: 0.005667827078791008
violation: 0.005587736630048297
violation: 0.005529135183166995
violation: 0.00546076067407566
violation: 0.005375194673451726
violation: 0.005288054442075127
violation: 0.005203284939611751
violation: 0.005110269931845202
violation: 0.005004969613317431
violation: 0.004889401944567211
violation: 0.004778610916794873
violation: 0.0046570407052726045
violation: 0.004527642308383132
violation: 0.004393717477174871
violation: 0.004267124138925933
violation: 0.004133928133016316
violation: 0.004012755928138858
violation: 0.0038914653519268078
violation: 0.0037652602700427094
violation: 0.0036375148218630647
violation: 0.003514710166154517
violation: 0.0033965138303585466
violation: 0.0032925205579808392
violation: 0.0031941648132722826
violation: 0.0031049470293336187
violation: 0.003022167403550224
violation: 0.002938964639034079
violation: 0.002856115850045515
violation: 0.002773891218680452
violation: 0.002692711668737032
violation: 0.0026129548289078454
violation: 0.0025351644702122414
violation: 0.002458740363438229
violation: 0.0023842026907908783
violation: 0.0023133039094787003
violation: 0.002243736743480904
violation: 0.0021751169925783576
violation: 0.0021084094490924675
violation: 0.0020436678052481146
violation: 0.0019806643593506448
violation: 0.0019243270194362217
violation: 0.0018713261632054639
violation: 0.0018195678200697795
violation: 0.001769274901286944
violation: 0.001720465749119251
violation: 0.0016731692686997707
violation: 0.0016274950351469475
violation: 0.0015839173329697824
violation: 0.0015418960309272283
violation: 0.001501438543131207
violation: 0.00146292720121613
violation: 0.0014262081321622618
violation: 0.0013907597658089593
violation: 0.0013601582805155233
violation: 0.001332846482400285
violation: 0.0013065923988231458
violation: 0.0012813357494811382
violation: 0.0012569657401121728
violation: 0.0012363658727400134
violation: 0.0012190114699548668
violation: 0.001199211654449945
violation: 0.0011775622624512368
violation: 0.0011582609085413296
violation: 0.0011389415923634032
violation: 0.0011199124929360635
violation: 0.0011006754884539053
violation: 0.0010832777040275076
violation: 0.0010661363692303838
violation: 0.001049193369470462
violation: 0.0010318244102606408
violation: 0.001015079232123456
violation: 0.0009988201809296982
violation: 0.0009841318528815025
violation: 0.0009699922960877931
violation: 0.0009545966012011336
violation: 0.000939636333138618
violation: 0.0009266599168139814
violation: 0.0009140262172601734
violation: 0.000901587500637715
violation: 0.0008902182357108467
violation: 0.0008780499311868301
violation: 0.0008660457470919867
violation: 0.000854351749993594
violation: 0.0008428706003292241
violation: 0.0008315536804371429
violation: 0.0008208847158801529
violation: 0.0008104269807765564
violation: 0.0007997522484735114
violation: 0.0007893350738952551
violation: 0.0007791326607914677
violation: 0.000769141439001458
violation: 0.0007597179067854084
violation: 0.0007504652538891995
violation: 0.0007412456856969702
violation: 0.0007322966170541079
violation: 0.0007235915691681587
violation: 0.0007151920055400911
violation: 0.0007069372346703193
violation: 0.0006987637535245828
violation: 0.0006907733550827528
violation: 0.0006830298779796196
violation: 0.0006754181243929116
violation: 0.0006679795936491573
violation: 0.0006606893398230558
violation: 0.0006536091296351816
violation: 0.0006466641120997783
violation: 0.0006399762615476088
violation: 0.0006335488650774164
violation: 0.0006273957420688345
violation: 0.000621523600071374
violation: 0.0006161518203756296
violation: 0.0006113918151775462
violation: 0.0006071251736137143
violation: 0.0006030938520869573
violation: 0.0005992255771888558
violation: 0.0005955122189372059
violation: 0.0005919356405959056
violation: 0.0005884735105279698
violation: 0.0005851626197889293
violation: 0.000581947296680374
violation: 0.0005788624242479656
violation: 0.0005759087479595976
violation: 0.0005730546137311166
violation: 0.0005702968600987632
violation: 0.0005676053787182601
violation: 0.0005650176785170406
violation: 0.0005624480584372072
violation: 0.0005599281471045847
violation: 0.0005574208102719905
violation: 0.0005549930907514921
violation: 0.000552626309068813
violation: 0.0005503237863511824
violation: 0.0005480875748007051
violation: 0.000545897608289249
violation: 0.0005437570853970054
violation: 0.000541672631472773
violation: 0.0005396329582219164
violation: 0.0005376381718605051
violation: 0.0005358628850810264
violation: 0.0005342566446345432
violation: 0.0005327134944358746
violation: 0.0005311700256177045
violation: 0.0005296374901745713
violation: 0.0005281469649348568
violation: 0.0005266549474164491
violation: 0.0005251860718894904
violation: 0.0005237318107594751
violation: 0.0005222955570667396
violation: 0.0005208942964238494
violation: 0.0005195265168840896
violation: 0.0005181813428112756
violation: 0.0005168846752736596
violation: 0.0005156608680272159
violation: 0.0005144616554312388
violation: 0.0005132891688191711
violation: 0.000512151526640372
violation: 0.000511036433089302
violation: 0.0005099447315064673
violation: 0.0005088753613795605
violation: 0.0005078236610580041
violation: 0.0005067909112023809
violation: 0.0005057740763560038
violation: 0.000504776717561477
violation: 0.0005037958933651398
violation: 0.0005028222129276259
violation: 0.0005018650428478226
violation: 0.0005009224423802033
violation: 0.0004999974962489175
violation: 0.0004990872395198625
violation: 0.000498196200074654
violation: 0.0004973147318192402
violation: 0.0004964417296736974
violation: 0.0004955753197878713
violation: 0.0004946901218457917
violation: 0.0004938210437306247
violation: 0.000492967359684711
violation: 0.0004921226355842758
violation: 0.0004912871202793557
violation: 0.0004904596528538888
violation: 0.0004896376456526639
/home/docs/.asdf/installs/python/3.13.14/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.27811881011285594
violation: 0.21103839273442268
violation: 0.16365897573755106
violation: 0.12638124502857342
violation: 0.09689398092857991
violation: 0.07386553913526427
violation: 0.057263048836391175
violation: 0.04639710696895089
violation: 0.03776270101072422
violation: 0.030324671559648346
violation: 0.024000077998569614
violation: 0.018705054318855344
violation: 0.014282427091627959
violation: 0.010676123451468615
violation: 0.008016534827385796
violation: 0.006238616114828358
violation: 0.005124394633030324
violation: 0.004490757479656721
violation: 0.004053115751123675
violation: 0.003744302603669099
violation: 0.0034289628116611383
violation: 0.0030323190347560994
violation: 0.002727253739146926
violation: 0.002386505694047164
violation: 0.0020851628627841733
violation: 0.0017697484695163115
violation: 0.0014925716272858132
violation: 0.0012488601974045379
violation: 0.001043867511137814
violation: 0.0008573236692762394
violation: 0.000699137776620069
violation: 0.0005706218431927152
violation: 0.0004636286240955409
violation: 0.0003748723547989912
violation: 0.00030325790844272835
violation: 0.00024636638593843755
violation: 0.00019825804790408772
violation: 0.00015827733519297235
violation: 0.00012439075792818454
violation: 9.611089606618188e-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 0.985 seconds)