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.1401742102450195
violation: 0.061581950654932265
violation: 0.034777744528724834
violation: 0.02315591268977661
violation: 0.01628956483660728
violation: 0.01173219772280974
violation: 0.009261179153190082
violation: 0.007770502529914423
violation: 0.006957471610158928
violation: 0.006457414370354985
violation: 0.0061911151252820465
violation: 0.006057238974457553
violation: 0.006000777806339408
violation: 0.005868357891308877
violation: 0.005802918028534221
violation: 0.0057723676588298046
violation: 0.005756947971778046
violation: 0.0057333328899189535
violation: 0.005700606624645108
violation: 0.005667827078790998
violation: 0.005587736630048324
violation: 0.005529135183167082
violation: 0.005460760674075945
violation: 0.005375194673451558
violation: 0.005288054442074817
violation: 0.005203284939611548
violation: 0.0051102699318454105
violation: 0.005004969613317585
violation: 0.004889401944567158
violation: 0.004778610916794777
violation: 0.004657040705272685
violation: 0.0045276423083831325
violation: 0.004393717477174748
violation: 0.004267124138925767
violation: 0.004133928133016317
violation: 0.004012755928138943
violation: 0.0038914653519268173
violation: 0.00376526027004267
violation: 0.0036375148218629853
violation: 0.003514710166154426
violation: 0.003396513830358316
violation: 0.003292520557980604
violation: 0.0031941648132722713
violation: 0.0031049470293335103
violation: 0.0030221674035500632
violation: 0.0029389646390339755
violation: 0.002856115850045624
violation: 0.002773891218680178
violation: 0.0026927116687366177
violation: 0.0026129548289077335
violation: 0.002535164470212121
violation: 0.0024587403634384027
violation: 0.002384202690791289
violation: 0.0023133039094785294
violation: 0.0022437367434808815
violation: 0.0021751169925787925
violation: 0.0021084094490922273
violation: 0.0020436678052479624
violation: 0.001980664359350834
violation: 0.001924327019436239
violation: 0.001871326163205807
violation: 0.0018195678200698265
violation: 0.0017692749012867507
violation: 0.0017204657491195266
violation: 0.0016731692686998403
violation: 0.0016274950351469817
violation: 0.0015839173329696339
violation: 0.0015418960309271062
violation: 0.0015014385431313987
violation: 0.0014629272012160273
violation: 0.0014262081321618006
violation: 0.0013907597658088114
violation: 0.0013601582805158
violation: 0.0013328464824006936
violation: 0.001306592398823674
violation: 0.0012813357494810573
violation: 0.0012569657401121706
violation: 0.0012363658727395043
violation: 0.0012190114699549592
violation: 0.0011992116544501073
violation: 0.0011775622624513396
violation: 0.0011582609085414213
violation: 0.0011389415923632896
violation: 0.001119912492936034
violation: 0.0011006754884536468
violation: 0.0010832777040274955
violation: 0.0010661363692305165
violation: 0.0010491933694701241
violation: 0.0010318244102605516
violation: 0.0010150792321237067
violation: 0.0009988201809299586
violation: 0.000984131852881716
violation: 0.0009699922960877968
violation: 0.0009545966012006805
violation: 0.0009396363331384808
violation: 0.0009266599168142798
violation: 0.0009140262172600692
violation: 0.0009015875006378899
violation: 0.0008902182357106378
violation: 0.0008780499311870594
violation: 0.0008660457470923347
violation: 0.0008543517499941177
violation: 0.0008428706003290755
violation: 0.0008315536804369154
violation: 0.0008208847158800423
violation: 0.0008104269807765771
violation: 0.0007997522484737539
violation: 0.0007893350738953357
violation: 0.0007791326607913533
violation: 0.0007691414390020238
violation: 0.0007597179067854144
violation: 0.000750465253889046
violation: 0.0007412456856969965
violation: 0.0007322966170539528
violation: 0.0007235915691683456
violation: 0.000715192005539666
violation: 0.0007069372346703499
violation: 0.000698763753524809
violation: 0.0006907733550825634
violation: 0.0006830298779797399
violation: 0.0006754181243923724
violation: 0.0006679795936492866
violation: 0.0006606893398230861
violation: 0.0006536091296352696
violation: 0.0006466641120996227
violation: 0.000639976261547148
violation: 0.0006335488650770141
violation: 0.0006273957420687865
violation: 0.0006215236000712773
violation: 0.0006161518203756668
violation: 0.0006113918151772602
violation: 0.0006071251736134936
violation: 0.0006030938520872888
violation: 0.0005992255771889659
violation: 0.0005955122189367278
violation: 0.0005919356405966222
violation: 0.0005884735105285502
violation: 0.0005851626197891701
violation: 0.000581947296680552
violation: 0.0005788624242479006
violation: 0.0005759087479599656
violation: 0.0005730546137308392
violation: 0.0005702968600984646
violation: 0.0005676053787179994
violation: 0.0005650176785170324
violation: 0.000562448058436781
violation: 0.0005599281471047549
violation: 0.0005574208102721409
violation: 0.0005549930907513545
violation: 0.0005526263090685759
violation: 0.0005503237863510698
violation: 0.0005480875748008552
violation: 0.0005458976082891166
violation: 0.0005437570853969546
violation: 0.0005416726314727833
violation: 0.0005396329582219153
violation: 0.0005376381718605329
violation: 0.0005358628850810525
violation: 0.0005342566446341905
violation: 0.0005327134944356405
violation: 0.00053117002561813
violation: 0.0005296374901747739
violation: 0.0005281469649344275
violation: 0.0005266549474159198
violation: 0.0005251860718892614
violation: 0.0005237318107591769
violation: 0.0005222955570664562
violation: 0.0005208942964237116
violation: 0.0005195265168845077
violation: 0.0005181813428111599
violation: 0.0005168846752736335
violation: 0.0005156608680272821
violation: 0.0005144616554313185
violation: 0.0005132891688190373
violation: 0.0005121515266404614
violation: 0.0005110364330895827
violation: 0.0005099447315062811
violation: 0.000508875361379162
violation: 0.0005078236610580062
violation: 0.0005067909112024869
violation: 0.0005057740763560471
violation: 0.0005047767175615723
violation: 0.0005037958933648386
violation: 0.0005028222129276463
violation: 0.0005018650428481755
violation: 0.0005009224423798642
violation: 0.000499997496248725
violation: 0.0004990872395198891
violation: 0.000498196200074838
violation: 0.0004973147318191085
violation: 0.0004964417296739118
violation: 0.0004955753197882396
violation: 0.000494690121845699
violation: 0.0004938210437307136
violation: 0.0004929673596844494
violation: 0.0004921226355843143
violation: 0.000491287120279364
violation: 0.0004904596528540811
violation: 0.0004896376456527315
/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.27811881011284667
violation: 0.21103839273441655
violation: 0.16365897573754826
violation: 0.12638124502857287
violation: 0.09689398092858081
violation: 0.07386553913526565
violation: 0.0572630488363918
violation: 0.04639710696895148
violation: 0.03776270101072497
violation: 0.030324671559649137
violation: 0.024000077998570544
violation: 0.018705054318856322
violation: 0.014282427091628904
violation: 0.010676123451469365
violation: 0.008016534827386184
violation: 0.006238616114828559
violation: 0.005124394633030265
violation: 0.004490757479656591
violation: 0.004053115751123437
violation: 0.0037443026036688394
violation: 0.0034289628116608724
violation: 0.0030323190347559667
violation: 0.0027272537391467956
violation: 0.0023865056940470895
violation: 0.0020851628627841325
violation: 0.001769748469516264
violation: 0.0014925716272857416
violation: 0.0012488601974045106
violation: 0.0010438675111378232
violation: 0.0008573236692762732
violation: 0.0006991377766201078
violation: 0.0005706218431927184
violation: 0.0004636286240955929
violation: 0.00037487235479900945
violation: 0.0003032579084427278
violation: 0.00024636638593845386
violation: 0.00019825804790410718
violation: 0.00015827733519301117
violation: 0.0001243907579281985
violation: 9.611089606618853e-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.252 seconds)