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.14017421024501966
violation: 0.06158195065493221
violation: 0.034777744528724994
violation: 0.023155912689776733
violation: 0.016289564836607318
violation: 0.011732197722809697
violation: 0.00926117915319
violation: 0.0077705025299142725
violation: 0.0069574716101590585
violation: 0.0064574143703548074
violation: 0.006191115125281969
violation: 0.006057238974457676
violation: 0.006000777806339413
violation: 0.005868357891308873
violation: 0.005802918028534048
violation: 0.0057723676588298176
violation: 0.005756947971777862
violation: 0.005733332889919024
violation: 0.005700606624644816
violation: 0.00566782707879088
violation: 0.005587736630048359
violation: 0.00552913518316707
violation: 0.0054607606740759585
violation: 0.005375194673451684
violation: 0.005288054442075067
violation: 0.005203284939611618
violation: 0.005110269931845284
violation: 0.005004969613317544
violation: 0.004889401944567129
violation: 0.004778610916794844
violation: 0.004657040705272554
violation: 0.004527642308383181
violation: 0.004393717477175045
violation: 0.004267124138925829
violation: 0.004133928133016262
violation: 0.0040127559281385545
violation: 0.003891465351926838
violation: 0.0037652602700425403
violation: 0.0036375148218628344
violation: 0.003514710166154575
violation: 0.0033965138303584867
violation: 0.003292520557980626
violation: 0.0031941648132722327
violation: 0.0031049470293335493
violation: 0.0030221674035501283
violation: 0.0029389646390336017
violation: 0.002856115850045369
violation: 0.0027738912186802307
violation: 0.002692711668736854
violation: 0.002612954828907821
violation: 0.002535164470212069
violation: 0.002458740363438116
violation: 0.0023842026907913315
violation: 0.0023133039094785698
violation: 0.002243736743481014
violation: 0.0021751169925785215
violation: 0.0021084094490922047
violation: 0.0020436678052480647
violation: 0.0019806643593504587
violation: 0.0019243270194362347
violation: 0.0018713261632056432
violation: 0.0018195678200697656
violation: 0.00176927490128652
violation: 0.0017204657491194284
violation: 0.0016731692686995931
violation: 0.0016274950351469891
violation: 0.001583917332970043
violation: 0.0015418960309273348
violation: 0.0015014385431314412
violation: 0.0014629272012158128
violation: 0.0014262081321620693
violation: 0.001390759765808969
violation: 0.0013601582805158766
violation: 0.00133284648240024
violation: 0.0013065923988232263
violation: 0.0012813357494812674
violation: 0.0012569657401122081
violation: 0.0012363658727397363
violation: 0.0012190114699548022
violation: 0.0011992116544500384
violation: 0.0011775622624514048
violation: 0.0011582609085414365
violation: 0.0011389415923630903
violation: 0.0011199124929361186
violation: 0.0011006754884538828
violation: 0.0010832777040278886
violation: 0.0010661363692303586
violation: 0.0010491933694700638
violation: 0.001031824410260873
violation: 0.001015079232123621
violation: 0.0009988201809301488
violation: 0.0009841318528818065
violation: 0.0009699922960879146
violation: 0.0009545966012007134
violation: 0.0009396363331383321
violation: 0.0009266599168146153
violation: 0.0009140262172602139
violation: 0.0009015875006377659
violation: 0.000890218235710683
violation: 0.0008780499311872016
violation: 0.0008660457470917937
violation: 0.0008543517499939823
violation: 0.0008428706003288108
violation: 0.0008315536804372988
violation: 0.0008208847158801169
violation: 0.0008104269807766277
violation: 0.0007997522484735821
violation: 0.0007893350738951595
violation: 0.000779132660791472
violation: 0.0007691414390018481
violation: 0.0007597179067852993
violation: 0.0007504652538891981
violation: 0.0007412456856972726
violation: 0.0007322966170540656
violation: 0.0007235915691682405
violation: 0.000715192005539641
violation: 0.0007069372346704045
violation: 0.0006987637535249009
violation: 0.0006907733550823482
violation: 0.0006830298779799367
violation: 0.0006754181243922771
violation: 0.000667979593649403
violation: 0.0006606893398230673
violation: 0.000653609129635224
violation: 0.0006466641120995711
violation: 0.0006399762615475718
violation: 0.0006335488650769405
violation: 0.0006273957420692242
violation: 0.0006215236000712524
violation: 0.0006161518203755239
violation: 0.0006113918151769482
violation: 0.0006071251736137467
violation: 0.0006030938520872013
violation: 0.000599225577188918
violation: 0.0005955122189367826
violation: 0.0005919356405960135
violation: 0.000588473510528835
violation: 0.0005851626197890064
violation: 0.0005819472966803524
violation: 0.0005788624242479441
violation: 0.0005759087479598791
violation: 0.0005730546137310743
violation: 0.0005702968600984346
violation: 0.0005676053787181136
violation: 0.0005650176785171563
violation: 0.0005624480584371278
violation: 0.0005599281471046661
violation: 0.0005574208102720339
violation: 0.0005549930907511999
violation: 0.0005526263090687924
violation: 0.0005503237863512036
violation: 0.0005480875748008357
violation: 0.0005458976082896069
violation: 0.000543757085396962
violation: 0.0005416726314726675
violation: 0.0005396329582218069
violation: 0.000537638171860748
violation: 0.0005358628850809262
violation: 0.000534256644634192
violation: 0.0005327134944358451
violation: 0.0005311700256182773
violation: 0.0005296374901745973
violation: 0.0005281469649349328
violation: 0.0005266549474160436
violation: 0.0005251860718893535
violation: 0.0005237318107590795
violation: 0.000522295557066695
violation: 0.0005208942964239106
violation: 0.0005195265168841329
violation: 0.0005181813428111656
violation: 0.0005168846752736739
violation: 0.0005156608680270607
violation: 0.0005144616554311392
violation: 0.0005132891688188841
violation: 0.0005121515266407146
violation: 0.0005110364330893908
violation: 0.0005099447315066368
violation: 0.0005088753613793409
violation: 0.0005078236610580267
violation: 0.000506790911202266
violation: 0.0005057740763562715
violation: 0.0005047767175615209
violation: 0.0005037958933648183
violation: 0.000502822212927731
violation: 0.0005018650428477987
violation: 0.0005009224423797293
violation: 0.0004999974962490527
violation: 0.0004990872395198007
violation: 0.0004981962000749047
violation: 0.0004973147318191813
violation: 0.0004964417296740824
violation: 0.0004955753197882631
violation: 0.0004946901218460251
violation: 0.0004938210437303651
violation: 0.0004929673596844964
violation: 0.0004921226355843617
violation: 0.0004912871202791226
violation: 0.000490459652854206
violation: 0.000489637645653106
/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.27811881011285533
violation: 0.21103839273442254
violation: 0.1636589757375508
violation: 0.12638124502857337
violation: 0.09689398092858008
violation: 0.07386553913526447
violation: 0.057263048836391356
violation: 0.04639710696895103
violation: 0.0377627010107243
violation: 0.03032467155964839
violation: 0.024000077998569663
violation: 0.018705054318855413
violation: 0.014282427091627985
violation: 0.01067612345146864
violation: 0.00801653482738586
violation: 0.006238616114828259
violation: 0.005124394633030146
violation: 0.004490757479656564
violation: 0.004053115751123455
violation: 0.0037443026036688932
violation: 0.00342896281166092
violation: 0.0030323190347559745
violation: 0.0027272537391467614
violation: 0.0023865056940470418
violation: 0.0020851628627840666
violation: 0.0017697484695162326
violation: 0.0014925716272857527
violation: 0.001248860197404475
violation: 0.0010438675111377194
violation: 0.0008573236692762057
violation: 0.0006991377766200576
violation: 0.000570621843192711
violation: 0.00046362862409555063
violation: 0.00037487235479899785
violation: 0.00030325790844271957
violation: 0.0002463663859384407
violation: 0.00019825804790404934
violation: 0.00015827733519297398
violation: 0.00012439075792816833
violation: 9.61108960661476e-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.935 seconds)