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.1401742102450201
violation: 0.061581950654932466
violation: 0.03477774452872513
violation: 0.02315591268977681
violation: 0.016289564836607505
violation: 0.011732197722809758
violation: 0.009261179153190273
violation: 0.007770502529914235
violation: 0.006957471610159094
violation: 0.0064574143703550625
violation: 0.006191115125282063
violation: 0.006057238974457692
violation: 0.006000777806339404
violation: 0.00586835789130881
violation: 0.005802918028534094
violation: 0.005772367658829976
violation: 0.005756947971777931
violation: 0.0057333328899190185
violation: 0.005700606624644927
violation: 0.005667827078791079
violation: 0.005587736630048425
violation: 0.0055291351831670485
violation: 0.00546076067407593
violation: 0.005375194673451762
violation: 0.005288054442075247
violation: 0.005203284939611516
violation: 0.005110269931845296
violation: 0.005004969613317374
violation: 0.0048894019445671864
violation: 0.004778610916794845
violation: 0.004657040705272649
violation: 0.004527642308382971
violation: 0.0043937174771751025
violation: 0.004267124138925677
violation: 0.004133928133016149
violation: 0.004012755928138677
violation: 0.0038914653519269374
violation: 0.003765260270042664
violation: 0.003637514821862883
violation: 0.0035147101661543107
violation: 0.0033965138303584707
violation: 0.003292520557980287
violation: 0.0031941648132721586
violation: 0.0031049470293333724
violation: 0.0030221674035502116
violation: 0.0029389646390337856
violation: 0.0028561158500452965
violation: 0.0027738912186801804
violation: 0.002692711668736859
violation: 0.0026129548289079456
violation: 0.0025351644702121374
violation: 0.0024587403634378693
violation: 0.0023842026907910313
violation: 0.0023133039094785776
violation: 0.0022437367434811335
violation: 0.002175116992578848
violation: 0.002108409449092053
violation: 0.00204366780524784
violation: 0.0019806643593505762
violation: 0.0019243270194359617
violation: 0.001871326163206062
violation: 0.0018195678200696045
violation: 0.0017692749012867396
violation: 0.0017204657491194277
violation: 0.0016731692686993652
violation: 0.0016274950351468978
violation: 0.0015839173329699498
violation: 0.0015418960309273898
violation: 0.0015014385431312857
violation: 0.0014629272012159822
violation: 0.0014262081321620426
violation: 0.0013907597658089767
violation: 0.0013601582805155788
violation: 0.0013328464824004776
violation: 0.0013065923988231816
violation: 0.0012813357494812193
violation: 0.001256965740112231
violation: 0.0012363658727397565
violation: 0.0012190114699550565
violation: 0.0011992116544498562
violation: 0.0011775622624513203
violation: 0.0011582609085414386
violation: 0.0011389415923629739
violation: 0.001119912492936276
violation: 0.001100675488453796
violation: 0.001083277704027738
violation: 0.0010661363692304336
violation: 0.0010491933694702455
violation: 0.0010318244102606798
violation: 0.0010150792321235726
violation: 0.0009988201809298736
violation: 0.0009841318528818665
violation: 0.0009699922960879204
violation: 0.0009545966012009175
violation: 0.0009396363331388028
violation: 0.0009266599168144245
violation: 0.0009140262172604826
violation: 0.0009015875006376942
violation: 0.0008902182357105081
violation: 0.0008780499311869682
violation: 0.0008660457470920953
violation: 0.000854351749993864
violation: 0.0008428706003288444
violation: 0.0008315536804371078
violation: 0.0008208847158801629
violation: 0.0008104269807764148
violation: 0.0007997522484736351
violation: 0.000789335073895372
violation: 0.0007791326607912121
violation: 0.0007691414390017661
violation: 0.0007597179067853447
violation: 0.0007504652538894118
violation: 0.0007412456856973368
violation: 0.0007322966170541436
violation: 0.0007235915691683064
violation: 0.000715192005539536
violation: 0.0007069372346702944
violation: 0.000698763753524905
violation: 0.0006907733550826609
violation: 0.0006830298779797782
violation: 0.0006754181243926538
violation: 0.0006679795936492877
violation: 0.0006606893398232743
violation: 0.0006536091296354024
violation: 0.0006466641120997396
violation: 0.0006399762615475296
violation: 0.0006335488650772139
violation: 0.0006273957420691132
violation: 0.0006215236000709811
violation: 0.0006161518203753585
violation: 0.0006113918151774933
violation: 0.0006071251736136835
violation: 0.0006030938520871821
violation: 0.000599225577188756
violation: 0.0005955122189364434
violation: 0.0005919356405962234
violation: 0.0005884735105286932
violation: 0.000585162619789163
violation: 0.0005819472966805439
violation: 0.0005788624242481118
violation: 0.0005759087479599016
violation: 0.0005730546137310102
violation: 0.0005702968600981514
violation: 0.0005676053787183063
violation: 0.0005650176785173984
violation: 0.0005624480584369947
violation: 0.0005599281471046271
violation: 0.000557420810271814
violation: 0.0005549930907514525
violation: 0.0005526263090686237
violation: 0.0005503237863510277
violation: 0.0005480875748008733
violation: 0.0005458976082894652
violation: 0.0005437570853967883
violation: 0.0005416726314725638
violation: 0.0005396329582220532
violation: 0.00053763817186094
violation: 0.0005358628850808511
violation: 0.0005342566446344717
violation: 0.0005327134944357183
violation: 0.0005311700256182271
violation: 0.0005296374901748349
violation: 0.0005281469649349473
violation: 0.0005266549474164388
violation: 0.0005251860718893257
violation: 0.0005237318107590046
violation: 0.0005222955570665979
violation: 0.0005208942964240083
violation: 0.0005195265168843019
violation: 0.0005181813428112704
violation: 0.00051688467527367
violation: 0.0005156608680269582
violation: 0.0005144616554314236
violation: 0.0005132891688187668
violation: 0.000512151526640304
violation: 0.0005110364330891447
violation: 0.0005099447315064414
violation: 0.0005088753613791703
violation: 0.0005078236610582414
violation: 0.0005067909112024729
violation: 0.0005057740763556696
violation: 0.0005047767175616971
violation: 0.0005037958933648302
violation: 0.0005028222129275208
violation: 0.0005018650428479448
violation: 0.0005009224423800353
violation: 0.000499997496248943
violation: 0.0004990872395195243
violation: 0.0004981962000746389
violation: 0.000497314731818849
violation: 0.0004964417296738777
violation: 0.0004955753197880815
violation: 0.0004946901218459048
violation: 0.0004938210437306544
violation: 0.0004929673596846914
violation: 0.0004921226355847211
violation: 0.000491287120279452
violation: 0.0004904596528539313
violation: 0.0004896376456528669
/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.27811881011285006
violation: 0.21103839273441835
violation: 0.16365897573754856
violation: 0.12638124502857245
violation: 0.09689398092857993
violation: 0.07386553913526463
violation: 0.05726304883639138
violation: 0.046397106968950975
violation: 0.037762701010724334
violation: 0.030324671559648454
violation: 0.02400007799856974
violation: 0.018705054318855503
violation: 0.014282427091628077
violation: 0.010676123451468573
violation: 0.008016534827385716
violation: 0.006238616114828212
violation: 0.0051243946330300615
violation: 0.004490757479656454
violation: 0.004053115751123322
violation: 0.0037443026036688195
violation: 0.0034289628116608217
violation: 0.003032319034755868
violation: 0.002727253739146754
violation: 0.002386505694046973
violation: 0.002085162862784022
violation: 0.001769748469516186
violation: 0.0014925716272857165
violation: 0.0012488601974044704
violation: 0.0010438675111377504
violation: 0.000857323669276192
violation: 0.0006991377766200252
violation: 0.00057062184319268
violation: 0.0004636286240955267
violation: 0.0003748723547989767
violation: 0.00030325790844275003
violation: 0.000246366385938428
violation: 0.00019825804790407338
violation: 0.00015827733519296997
violation: 0.00012439075792815973
violation: 9.611089606616231e-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.174 seconds)