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.1401742102450194
violation: 0.06158195065493216
violation: 0.03477774452872496
violation: 0.023155912689776726
violation: 0.01628956483660726
violation: 0.011732197722809768
violation: 0.009261179153190071
violation: 0.0077705025299144885
violation: 0.00695747161015908
violation: 0.006457414370355016
violation: 0.006191115125281992
violation: 0.006057238974457616
violation: 0.00600077780633925
violation: 0.005868357891308796
violation: 0.0058029180285339675
violation: 0.0057723676588298245
violation: 0.005756947971778088
violation: 0.005733332889918859
violation: 0.0057006066246449915
violation: 0.0056678270787908405
violation: 0.005587736630048312
violation: 0.005529135183167032
violation: 0.005460760674075993
violation: 0.005375194673451711
violation: 0.005288054442075031
violation: 0.005203284939611561
violation: 0.005110269931845252
violation: 0.005004969613317495
violation: 0.004889401944567261
violation: 0.004778610916794623
violation: 0.00465704070527256
violation: 0.004527642308383249
violation: 0.004393717477174846
violation: 0.0042671241389258706
violation: 0.004133928133016135
violation: 0.0040127559281388095
violation: 0.003891465351926765
violation: 0.0037652602700428044
violation: 0.003637514821863034
violation: 0.0035147101661545757
violation: 0.003396513830357997
violation: 0.00329252055798041
violation: 0.0031941648132722674
violation: 0.003104947029333657
violation: 0.0030221674035500095
violation: 0.0029389646390340788
violation: 0.0028561158500457
violation: 0.0027738912186802255
violation: 0.0026927116687367665
violation: 0.002612954828908097
violation: 0.002535164470212289
violation: 0.0024587403634380492
violation: 0.0023842026907910812
violation: 0.0023133039094787237
violation: 0.0022437367434812094
violation: 0.002175116992578566
violation: 0.0021084094490923647
violation: 0.002043667805247794
violation: 0.0019806643593508096
violation: 0.0019243270194360547
violation: 0.0018713261632057967
violation: 0.0018195678200698315
violation: 0.0017692749012865943
violation: 0.00172046574911939
violation: 0.0016731692686996348
violation: 0.0016274950351470494
violation: 0.001583917332969761
violation: 0.0015418960309271593
violation: 0.0015014385431314436
violation: 0.0014629272012162203
violation: 0.0014262081321618244
violation: 0.0013907597658088624
violation: 0.0013601582805158772
violation: 0.0013328464824002553
violation: 0.0013065923988233167
violation: 0.00128133574948112
violation: 0.0012569657401118363
violation: 0.0012363658727398057
violation: 0.0012190114699549013
violation: 0.0011992116544501685
violation: 0.0011775622624514738
violation: 0.001158260908541725
violation: 0.0011389415923632245
violation: 0.0011199124929361763
violation: 0.0011006754884537843
violation: 0.0010832777040278767
violation: 0.0010661363692304074
violation: 0.0010491933694703778
violation: 0.0010318244102605245
violation: 0.0010150792321234941
violation: 0.0009988201809299263
violation: 0.0009841318528819169
violation: 0.0009699922960875548
violation: 0.0009545966012007573
violation: 0.0009396363331382381
violation: 0.0009266599168143158
violation: 0.0009140262172599893
violation: 0.0009015875006378317
violation: 0.0008902182357107581
violation: 0.0008780499311870463
violation: 0.0008660457470918188
violation: 0.0008543517499939394
violation: 0.000842870600328921
violation: 0.0008315536804371934
violation: 0.0008208847158802581
violation: 0.000810426980776453
violation: 0.0007997522484735488
violation: 0.0007893350738953225
violation: 0.0007791326607914324
violation: 0.0007691414390017095
violation: 0.0007597179067851642
violation: 0.0007504652538890455
violation: 0.0007412456856972998
violation: 0.0007322966170540011
violation: 0.0007235915691683565
violation: 0.0007151920055396036
violation: 0.0007069372346704302
violation: 0.0006987637535249091
violation: 0.0006907733550821664
violation: 0.0006830298779801684
violation: 0.0006754181243925866
violation: 0.0006679795936492671
violation: 0.0006606893398228888
violation: 0.0006536091296352463
violation: 0.0006466641120995726
violation: 0.0006399762615473245
violation: 0.000633548865077371
violation: 0.0006273957420686764
violation: 0.0006215236000711336
violation: 0.0006161518203756043
violation: 0.0006113918151773417
violation: 0.0006071251736132964
violation: 0.0006030938520873783
violation: 0.0005992255771889458
violation: 0.0005955122189367669
violation: 0.0005919356405962316
violation: 0.0005884735105285869
violation: 0.0005851626197889404
violation: 0.0005819472966806289
violation: 0.0005788624242480624
violation: 0.000575908747959858
violation: 0.0005730546137308356
violation: 0.0005702968600985573
violation: 0.0005676053787183491
violation: 0.0005650176785173085
violation: 0.0005624480584370735
violation: 0.000559928147104534
violation: 0.0005574208102720796
violation: 0.0005549930907513166
violation: 0.0005526263090686481
violation: 0.0005503237863511231
violation: 0.0005480875748006472
violation: 0.0005458976082892833
violation: 0.0005437570853966572
violation: 0.0005416726314723026
violation: 0.0005396329582220378
violation: 0.0005376381718606558
violation: 0.0005358628850810735
violation: 0.0005342566446342015
violation: 0.0005327134944356665
violation: 0.0005311700256181058
violation: 0.0005296374901745137
violation: 0.0005281469649349658
violation: 0.0005266549474161253
violation: 0.0005251860718895532
violation: 0.0005237318107590678
violation: 0.0005222955570668801
violation: 0.0005208942964237429
violation: 0.0005195265168843592
violation: 0.0005181813428111508
violation: 0.0005168846752736508
violation: 0.0005156608680271687
violation: 0.0005144616554309007
violation: 0.0005132891688188308
violation: 0.0005121515266402603
violation: 0.000511036433089428
violation: 0.000509944731506634
violation: 0.0005088753613792603
violation: 0.0005078236610581758
violation: 0.0005067909112022891
violation: 0.0005057740763560505
violation: 0.0005047767175614698
violation: 0.0005037958933649785
violation: 0.0005028222129278095
violation: 0.0005018650428480294
violation: 0.0005009224423799002
violation: 0.0004999974962491379
violation: 0.0004990872395197645
violation: 0.0004981962000748544
violation: 0.0004973147318192968
violation: 0.0004964417296742145
violation: 0.0004955753197881482
violation: 0.0004946901218459831
violation: 0.0004938210437306959
violation: 0.0004929673596845696
violation: 0.0004921226355845508
violation: 0.0004912871202793666
violation: 0.0004904596528539722
violation: 0.0004896376456530449
/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.2781188101128569
violation: 0.21103839273442296
violation: 0.16365897573755084
violation: 0.12638124502857265
violation: 0.09689398092857915
violation: 0.07386553913526336
violation: 0.05726304883639071
violation: 0.04639710696895027
violation: 0.03776270101072345
violation: 0.030324671559647506
violation: 0.024000077998568816
violation: 0.018705054318854622
violation: 0.014282427091627253
violation: 0.010676123451467947
violation: 0.008016534827385385
violation: 0.006238616114828064
violation: 0.0051243946330299835
violation: 0.004490757479656495
violation: 0.004053115751123361
violation: 0.003744302603668854
violation: 0.0034289628116608833
violation: 0.0030323190347558595
violation: 0.0027272537391466716
violation: 0.0023865056940469663
violation: 0.0020851628627839803
violation: 0.0017697484695161358
violation: 0.0014925716272856495
violation: 0.0012488601974043854
violation: 0.0010438675111376818
violation: 0.0008573236692761227
violation: 0.0006991377766200047
violation: 0.0005706218431926344
violation: 0.00046362862409549257
violation: 0.00037487235479894895
violation: 0.00030325790844267463
violation: 0.0002463663859384208
violation: 0.0001982580479040678
violation: 0.00015827733519295205
violation: 0.0001243907579281368
violation: 9.611089606614611e-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.086 seconds)