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.1401742102450195
violation: 0.06158195065493213
violation: 0.03477774452872506
violation: 0.023155912689776535
violation: 0.016289564836607415
violation: 0.011732197722809775
violation: 0.009261179153190122
violation: 0.007770502529914203
violation: 0.006957471610159003
violation: 0.0064574143703549775
violation: 0.006191115125282124
violation: 0.00605723897445768
violation: 0.006000777806339426
violation: 0.0058683578913088395
violation: 0.005802918028534073
violation: 0.005772367658829877
violation: 0.0057569479717776055
violation: 0.005733332889918998
violation: 0.005700606624644816
violation: 0.005667827078790794
violation: 0.005587736630048237
violation: 0.0055291351831671665
violation: 0.005460760674075787
violation: 0.005375194673451674
violation: 0.0052880544420750575
violation: 0.005203284939611643
violation: 0.00511026993184538
violation: 0.005004969613317597
violation: 0.00488940194456728
violation: 0.004778610916794722
violation: 0.004657040705272601
violation: 0.004527642308383206
violation: 0.004393717477174992
violation: 0.00426712413892576
violation: 0.004133928133016257
violation: 0.004012755928138766
violation: 0.003891465351926864
violation: 0.0037652602700427936
violation: 0.0036375148218631003
violation: 0.003514710166154561
violation: 0.0033965138303583575
violation: 0.0032925205579803787
violation: 0.0031941648132721816
violation: 0.0031049470293333767
violation: 0.003022167403549865
violation: 0.0029389646390340102
violation: 0.0028561158500455715
violation: 0.002773891218680445
violation: 0.0026927116687366524
violation: 0.0026129548289078675
violation: 0.002535164470211856
violation: 0.002458740363438335
violation: 0.002384202690791026
violation: 0.0023133039094784366
violation: 0.002243736743481139
violation: 0.002175116992578617
violation: 0.0021084094490923305
violation: 0.002043667805247769
violation: 0.0019806643593506005
violation: 0.0019243270194359533
violation: 0.0018713261632056337
violation: 0.0018195678200698788
violation: 0.0017692749012866227
violation: 0.0017204657491192616
violation: 0.0016731692686998312
violation: 0.0016274950351470637
violation: 0.00158391733297011
violation: 0.0015418960309272634
violation: 0.0015014385431314527
violation: 0.0014629272012160366
violation: 0.0014262081321619585
violation: 0.0013907597658092297
violation: 0.0013601582805158432
violation: 0.0013328464824004457
violation: 0.0013065923988236285
violation: 0.001281335749481103
violation: 0.0012569657401122264
violation: 0.001236365872739954
violation: 0.0012190114699549694
violation: 0.0011992116544502118
violation: 0.001177562262451419
violation: 0.001158260908541379
violation: 0.0011389415923630918
violation: 0.0011199124929362223
violation: 0.0011006754884538654
violation: 0.001083277704027615
violation: 0.0010661363692305954
violation: 0.0010491933694700914
violation: 0.0010318244102605217
violation: 0.0010150792321236863
violation: 0.0009988201809299619
violation: 0.000984131852881304
violation: 0.0009699922960874953
violation: 0.0009545966012008632
violation: 0.0009396363331386154
violation: 0.000926659916814318
violation: 0.0009140262172602225
violation: 0.0009015875006376196
violation: 0.0008902182357106761
violation: 0.000878049931187313
violation: 0.0008660457470917375
violation: 0.0008543517499939988
violation: 0.0008428706003289847
violation: 0.0008315536804371828
violation: 0.0008208847158801346
violation: 0.0008104269807766447
violation: 0.0007997522484735444
violation: 0.0007893350738953119
violation: 0.0007791326607915689
violation: 0.0007691414390017531
violation: 0.0007597179067853027
violation: 0.0007504652538890927
violation: 0.0007412456856971079
violation: 0.0007322966170539696
violation: 0.0007235915691685927
violation: 0.0007151920055396431
violation: 0.0007069372346708391
violation: 0.0006987637535249582
violation: 0.000690773355082336
violation: 0.000683029877980053
violation: 0.0006754181243925688
violation: 0.0006679795936492206
violation: 0.0006606893398227227
violation: 0.0006536091296352061
violation: 0.000646664112099769
violation: 0.0006399762615476115
violation: 0.0006335488650772795
violation: 0.0006273957420690463
violation: 0.0006215236000711037
violation: 0.0006161518203754874
violation: 0.0006113918151772465
violation: 0.000607125173613402
violation: 0.0006030938520871513
violation: 0.0005992255771886412
violation: 0.0005955122189370805
violation: 0.0005919356405964533
violation: 0.0005884735105286414
violation: 0.0005851626197894201
violation: 0.0005819472966807625
violation: 0.0005788624242481974
violation: 0.0005759087479597516
violation: 0.0005730546137309294
violation: 0.0005702968600984928
violation: 0.0005676053787181832
violation: 0.0005650176785170156
violation: 0.000562448058436829
violation: 0.0005599281471046352
violation: 0.0005574208102720652
violation: 0.0005549930907512613
violation: 0.0005526263090685751
violation: 0.0005503237863508542
violation: 0.0005480875748004708
violation: 0.0005458976082893547
violation: 0.0005437570853967711
violation: 0.0005416726314726632
violation: 0.0005396329582219489
violation: 0.0005376381718608365
violation: 0.000535862885080972
violation: 0.0005342566446342799
violation: 0.0005327134944356631
violation: 0.0005311700256181422
violation: 0.000529637490174668
violation: 0.00052814696493502
violation: 0.0005266549474162799
violation: 0.000525186071889449
violation: 0.0005237318107591822
violation: 0.0005222955570666517
violation: 0.0005208942964237266
violation: 0.000519526516884102
violation: 0.0005181813428110782
violation: 0.000516884675273645
violation: 0.0005156608680272921
violation: 0.0005144616554310942
violation: 0.0005132891688189559
violation: 0.0005121515266401688
violation: 0.000511036433089129
violation: 0.0005099447315064168
violation: 0.0005088753613797102
violation: 0.0005078236610582673
violation: 0.0005067909112024244
violation: 0.0005057740763559991
violation: 0.0005047767175616726
violation: 0.0005037958933649121
violation: 0.0005028222129277275
violation: 0.0005018650428479921
violation: 0.0005009224423798875
violation: 0.0004999974962488203
violation: 0.0004990872395197587
violation: 0.0004981962000748369
violation: 0.0004973147318189502
violation: 0.0004964417296739202
violation: 0.0004955753197881864
violation: 0.000494690121845826
violation: 0.000493821043730676
violation: 0.0004929673596844245
violation: 0.000492122635584527
violation: 0.0004912871202792705
violation: 0.0004904596528540398
violation: 0.0004896376456531364
/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.27811881011285733
violation: 0.21103839273442335
violation: 0.16365897573755092
violation: 0.12638124502857284
violation: 0.09689398092857915
violation: 0.07386553913526343
violation: 0.05726304883639091
violation: 0.04639710696895069
violation: 0.03776270101072398
violation: 0.030324671559648013
violation: 0.024000077998569257
violation: 0.01870505431885505
violation: 0.014282427091627642
violation: 0.01067612345146838
violation: 0.008016534827385673
violation: 0.006238616114828245
violation: 0.005124394633030189
violation: 0.004490757479656695
violation: 0.004053115751123557
violation: 0.0037443026036690107
violation: 0.003428962811661068
violation: 0.0030323190347560382
violation: 0.0027272537391468685
violation: 0.002386505694047085
violation: 0.0020851628627841117
violation: 0.0017697484695162553
violation: 0.001492571627285781
violation: 0.001248860197404488
violation: 0.0010438675111377478
violation: 0.00085732366927616
violation: 0.000699137776620049
violation: 0.0005706218431926954
violation: 0.0004636286240955544
violation: 0.00037487235479898533
violation: 0.0003032579084427362
violation: 0.00024636638593843223
violation: 0.00019825804790406668
violation: 0.00015827733519297073
violation: 0.0001243907579282048
violation: 9.611089606616894e-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)