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.14017421024501975
violation: 0.06158195065493261
violation: 0.034777744528725105
violation: 0.023155912689776736
violation: 0.0162895648366074
violation: 0.011732197722809841
violation: 0.00926117915319006
violation: 0.007770502529914436
violation: 0.006957471610159158
violation: 0.006457414370354929
violation: 0.006191115125282061
violation: 0.006057238974457667
violation: 0.006000777806339459
violation: 0.005868357891308724
violation: 0.005802918028534011
violation: 0.005772367658829918
violation: 0.00575694797177782
violation: 0.0057333328899190515
violation: 0.005700606624644935
violation: 0.005667827078791007
violation: 0.005587736630048222
violation: 0.005529135183166923
violation: 0.005460760674076014
violation: 0.005375194673451733
violation: 0.0052880544420750505
violation: 0.005203284939611703
violation: 0.005110269931845364
violation: 0.005004969613317475
violation: 0.004889401944567311
violation: 0.004778610916794676
violation: 0.004657040705272573
violation: 0.0045276423083833416
violation: 0.004393717477174851
violation: 0.004267124138925855
violation: 0.004133928133016349
violation: 0.004012755928138701
violation: 0.0038914653519268845
violation: 0.0037652602700426925
violation: 0.0036375148218629264
violation: 0.003514710166154557
violation: 0.00339651383035847
violation: 0.0032925205579802594
violation: 0.0031941648132723715
violation: 0.0031049470293335996
violation: 0.0030221674035501803
violation: 0.0029389646390340007
violation: 0.002856115850045503
violation: 0.0027738912186803183
violation: 0.0026927116687368202
violation: 0.002612954828907898
violation: 0.002535164470212091
violation: 0.0024587403634379777
violation: 0.0023842026907910457
violation: 0.002313303909478649
violation: 0.0022437367434810073
violation: 0.002175116992578621
violation: 0.002108409449092321
violation: 0.002043667805247861
violation: 0.0019806643593505728
violation: 0.0019243270194358975
violation: 0.0018713261632055792
violation: 0.0018195678200696051
violation: 0.0017692749012868571
violation: 0.0017204657491193445
violation: 0.001673169268699762
violation: 0.0016274950351472532
violation: 0.0015839173329702308
violation: 0.0015418960309272877
violation: 0.0015014385431315032
violation: 0.0014629272012162474
violation: 0.0014262081321617698
violation: 0.0013907597658089409
violation: 0.0013601582805156127
violation: 0.0013328464824007194
violation: 0.0013065923988236049
violation: 0.0012813357494812609
violation: 0.001256965740111679
violation: 0.0012363658727394182
violation: 0.001219011469954833
violation: 0.0011992116544500013
violation: 0.0011775622624514443
violation: 0.0011582609085413432
violation: 0.001138941592363228
violation: 0.0011199124929362877
violation: 0.001100675488453787
violation: 0.0010832777040278088
violation: 0.001066136369230282
violation: 0.001049193369470216
violation: 0.0010318244102606583
violation: 0.001015079232123484
violation: 0.0009988201809298066
violation: 0.000984131852881819
violation: 0.0009699922960878191
violation: 0.00095459660120076
violation: 0.0009396363331383977
violation: 0.000926659916814126
violation: 0.0009140262172602463
violation: 0.0009015875006382453
violation: 0.0008902182357105183
violation: 0.0008780499311870638
violation: 0.0008660457470918912
violation: 0.000854351749994063
violation: 0.0008428706003289261
violation: 0.0008315536804370219
violation: 0.000820884715880302
violation: 0.0008104269807768049
violation: 0.0007997522484735047
violation: 0.000789335073895446
violation: 0.0007791326607911924
violation: 0.0007691414390018283
violation: 0.0007597179067852727
violation: 0.0007504652538893893
violation: 0.0007412456856970949
violation: 0.0007322966170538398
violation: 0.0007235915691683608
violation: 0.0007151920055395478
violation: 0.0007069372346702273
violation: 0.0006987637535247561
violation: 0.0006907733550823392
violation: 0.0006830298779801129
violation: 0.0006754181243923755
violation: 0.0006679795936492402
violation: 0.0006606893398232356
violation: 0.0006536091296353802
violation: 0.0006466641120994325
violation: 0.0006399762615474898
violation: 0.0006335488650769172
violation: 0.0006273957420691602
violation: 0.0006215236000710733
violation: 0.0006161518203755266
violation: 0.000611391815177165
violation: 0.0006071251736134758
violation: 0.0006030938520871724
violation: 0.0005992255771890021
violation: 0.0005955122189367937
violation: 0.0005919356405961753
violation: 0.0005884735105285636
violation: 0.000585162619789193
violation: 0.0005819472966806381
violation: 0.0005788624242479812
violation: 0.0005759087479598433
violation: 0.0005730546137310236
violation: 0.0005702968600984264
violation: 0.0005676053787180107
violation: 0.0005650176785171641
violation: 0.0005624480584369839
violation: 0.0005599281471048094
violation: 0.000557420810272022
violation: 0.000554993090751435
violation: 0.0005526263090686773
violation: 0.0005503237863512417
violation: 0.0005480875748005012
violation: 0.0005458976082894269
violation: 0.0005437570853969382
violation: 0.0005416726314724092
violation: 0.0005396329582222428
violation: 0.0005376381718608484
violation: 0.0005358628850810167
violation: 0.0005342566446345739
violation: 0.0005327134944358197
violation: 0.0005311700256184178
violation: 0.0005296374901748879
violation: 0.0005281469649348769
violation: 0.0005266549474164082
violation: 0.0005251860718893348
violation: 0.0005237318107590101
violation: 0.0005222955570664195
violation: 0.0005208942964236315
violation: 0.0005195265168844449
violation: 0.0005181813428114353
violation: 0.0005168846752735873
violation: 0.0005156608680270024
violation: 0.0005144616554311482
violation: 0.0005132891688189943
violation: 0.0005121515266403706
violation: 0.000511036433089422
violation: 0.000509944731506793
violation: 0.000508875361379318
violation: 0.0005078236610581064
violation: 0.0005067909112027196
violation: 0.0005057740763557983
violation: 0.0005047767175617288
violation: 0.0005037958933649445
violation: 0.0005028222129274855
violation: 0.0005018650428478353
violation: 0.0005009224423799638
violation: 0.0004999974962488613
violation: 0.0004990872395196799
violation: 0.000498196200074747
violation: 0.0004973147318189475
violation: 0.0004964417296742771
violation: 0.0004955753197881753
violation: 0.0004946901218457813
violation: 0.0004938210437307031
violation: 0.0004929673596847406
violation: 0.0004921226355843833
violation: 0.0004912871202790937
violation: 0.0004904596528538273
violation: 0.0004896376456531024
/home/runner/work/spectrochempy/spectrochempy/.venv/lib/python3.13/site-packages/sklearn/decomposition/_nmf.py:1728: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
warnings.warn(
violation: 1.0
violation: 0.27811881011285117
violation: 0.21103839273441968
violation: 0.16365897573754948
violation: 0.12638124502857292
violation: 0.09689398092858002
violation: 0.07386553913526472
violation: 0.05726304883639127
violation: 0.04639710696895093
violation: 0.03776270101072433
violation: 0.030324671559648474
violation: 0.024000077998569784
violation: 0.01870505431885562
violation: 0.014282427091628244
violation: 0.01067612345146883
violation: 0.008016534827385879
violation: 0.006238616114828397
violation: 0.005124394633030124
violation: 0.004490757479656563
violation: 0.0040531157511234095
violation: 0.003744302603668883
violation: 0.003428962811660902
violation: 0.0030323190347559524
violation: 0.0027272537391468277
violation: 0.002386505694047062
violation: 0.0020851628627840788
violation: 0.0017697484695162566
violation: 0.0014925716272857603
violation: 0.001248860197404494
violation: 0.001043867511137788
violation: 0.0008573236692762261
violation: 0.0006991377766200701
violation: 0.0005706218431927162
violation: 0.0004636286240955501
violation: 0.00037487235479898625
violation: 0.0003032579084427291
violation: 0.0002463663859384474
violation: 0.00019825804790407183
violation: 0.0001582773351929844
violation: 0.00012439075792819437
violation: 9.611089606616693e-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.098 seconds)