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

plot nmf

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.

model = scp.NMF(n_components=4, log_level="INFO")

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.14017421024501886
violation: 0.0615819506549319
violation: 0.03477774452872472
violation: 0.02315591268977657
violation: 0.016289564836607106
violation: 0.011732197722809517
violation: 0.009261179153189952
violation: 0.007770502529914237
violation: 0.006957471610159019
violation: 0.00645741437035496
violation: 0.006191115125282049
violation: 0.006057238974457628
violation: 0.006000777806339407
violation: 0.005868357891308755
violation: 0.005802918028533894
violation: 0.005772367658829779
violation: 0.005756947971777944
violation: 0.005733332889918854
violation: 0.005700606624645001
violation: 0.0056678270787908595
violation: 0.005587736630048398
violation: 0.005529135183167156
violation: 0.005460760674075917
violation: 0.0053751946734516415
violation: 0.005288054442074853
violation: 0.0052032849396115195
violation: 0.00511026993184535
violation: 0.005004969613317448
violation: 0.004889401944567163
violation: 0.004778610916794841
violation: 0.004657040705272594
violation: 0.0045276423083831846
violation: 0.004393717477174968
violation: 0.0042671241389257986
violation: 0.004133928133016248
violation: 0.004012755928138818
violation: 0.0038914653519267514
violation: 0.0037652602700428764
violation: 0.0036375148218629775
violation: 0.0035147101661543944
violation: 0.0033965138303583627
violation: 0.0032925205579804324
violation: 0.003194164813272155
violation: 0.0031049470293336616
violation: 0.0030221674035500893
violation: 0.0029389646390337843
violation: 0.0028561158500457337
violation: 0.0027738912186802203
violation: 0.002692711668736585
violation: 0.00261295482890814
violation: 0.002535164470212152
violation: 0.0024587403634382205
violation: 0.0023842026907912785
violation: 0.002313303909478483
violation: 0.0022437367434813157
violation: 0.0021751169925787735
violation: 0.0021084094490923
violation: 0.0020436678052480157
violation: 0.001980664359350732
violation: 0.0019243270194359173
violation: 0.0018713261632055133
violation: 0.0018195678200698044
violation: 0.0017692749012867123
violation: 0.0017204657491194692
violation: 0.0016731692686996046
violation: 0.0016274950351469488
violation: 0.0015839173329698008
violation: 0.0015418960309272083
violation: 0.00150143854313149
violation: 0.0014629272012162866
violation: 0.0014262081321619795
violation: 0.0013907597658089747
violation: 0.0013601582805159557
violation: 0.001332846482400409
violation: 0.0013065923988234153
violation: 0.0012813357494812078
violation: 0.0012569657401120928
violation: 0.0012363658727396127
violation: 0.0012190114699548074
violation: 0.0011992116544499902
violation: 0.001177562262451196
violation: 0.001158260908541662
violation: 0.0011389415923630736
violation: 0.0011199124929360856
violation: 0.0011006754884539877
violation: 0.0010832777040280573
violation: 0.0010661363692306288
violation: 0.0010491933694702082
violation: 0.001031824410260974
violation: 0.0010150792321234978
violation: 0.0009988201809301477
violation: 0.0009841318528815849
violation: 0.0009699922960875246
violation: 0.000954596601200847
violation: 0.0009396363331386612
violation: 0.0009266599168143904
violation: 0.0009140262172603922
violation: 0.0009015875006378345
violation: 0.0008902182357106185
violation: 0.0008780499311870563
violation: 0.000866045747091839
violation: 0.000854351749994179
violation: 0.000842870600328811
violation: 0.0008315536804366498
violation: 0.0008208847158800011
violation: 0.0008104269807763564
violation: 0.0007997522484736773
violation: 0.0007893350738951205
violation: 0.0007791326607912936
violation: 0.0007691414390015943
violation: 0.0007597179067851729
violation: 0.0007504652538886618
violation: 0.0007412456856970495
violation: 0.0007322966170538642
violation: 0.000723591569168392
violation: 0.0007151920055396939
violation: 0.0007069372346701578
violation: 0.0006987637535250594
violation: 0.0006907733550825735
violation: 0.0006830298779799963
violation: 0.000675418124392526
violation: 0.0006679795936493782
violation: 0.000660689339823235
violation: 0.0006536091296351166
violation: 0.000646664112099758
violation: 0.0006399762615476848
violation: 0.0006335488650775192
violation: 0.0006273957420687948
violation: 0.0006215236000713499
violation: 0.0006161518203756149
violation: 0.0006113918151773623
violation: 0.0006071251736135831
violation: 0.0006030938520872211
violation: 0.0005992255771889362
violation: 0.0005955122189365712
violation: 0.000591935640596235
violation: 0.0005884735105288073
violation: 0.0005851626197891781
violation: 0.0005819472966804132
violation: 0.0005788624242480904
violation: 0.0005759087479598292
violation: 0.0005730546137309889
violation: 0.0005702968600984374
violation: 0.0005676053787182234
violation: 0.0005650176785170945
violation: 0.000562448058436848
violation: 0.0005599281471046298
violation: 0.0005574208102720959
violation: 0.0005549930907511867
violation: 0.0005526263090688035
violation: 0.0005503237863511776
violation: 0.0005480875748006055
violation: 0.0005458976082892495
violation: 0.0005437570853969203
violation: 0.000541672631472761
violation: 0.0005396329582222408
violation: 0.0005376381718607097
violation: 0.000535862885081079
violation: 0.0005342566446344014
violation: 0.0005327134944356552
violation: 0.0005311700256183186
violation: 0.0005296374901746779
violation: 0.0005281469649348017
violation: 0.0005266549474160384
violation: 0.0005251860718892028
violation: 0.0005237318107592292
violation: 0.0005222955570666149
violation: 0.0005208942964241354
violation: 0.0005195265168845111
violation: 0.0005181813428111846
violation: 0.0005168846752735461
violation: 0.0005156608680272509
violation: 0.0005144616554309252
violation: 0.0005132891688188495
violation: 0.000512151526640549
violation: 0.0005110364330895511
violation: 0.0005099447315068019
violation: 0.0005088753613792772
violation: 0.0005078236610584595
violation: 0.0005067909112023406
violation: 0.0005057740763562593
violation: 0.0005047767175614159
violation: 0.0005037958933649628
violation: 0.0005028222129280595
violation: 0.000501865042848263
violation: 0.0005009224423798839
violation: 0.0004999974962490277
violation: 0.0004990872395196433
violation: 0.0004981962000752139
violation: 0.000497314731819179
violation: 0.0004964417296737531
violation: 0.0004955753197882701
violation: 0.0004946901218458794
violation: 0.0004938210437309183
violation: 0.0004929673596845667
violation: 0.0004921226355846732
violation: 0.0004912871202794128
violation: 0.0004904596528541337
violation: 0.0004896376456532125
/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.27811881011284917
violation: 0.21103839273441857
violation: 0.16365897573754926
violation: 0.12638124502857317
violation: 0.09689398092858066
violation: 0.07386553913526538
violation: 0.05726304883639191
violation: 0.04639710696895149
violation: 0.03776270101072492
violation: 0.030324671559649123
violation: 0.02400007799857049
violation: 0.018705054318856267
violation: 0.014282427091628837
violation: 0.010676123451469415
violation: 0.008016534827386188
violation: 0.006238616114828591
violation: 0.005124394633030255
violation: 0.004490757479656587
violation: 0.004053115751123353
violation: 0.0037443026036687943
violation: 0.003428962811660801
violation: 0.0030323190347559463
violation: 0.002727253739146805
violation: 0.002386505694047081
violation: 0.0020851628627841044
violation: 0.0017697484695162594
violation: 0.0014925716272857904
violation: 0.0012488601974045346
violation: 0.0010438675111377911
violation: 0.0008573236692762737
violation: 0.0006991377766201068
violation: 0.0005706218431927553
violation: 0.0004636286240955712
violation: 0.00037487235479902604
violation: 0.0003032579084427323
violation: 0.0002463663859384274
violation: 0.00019825804790408831
violation: 0.0001582773351930114
violation: 0.00012439075792817556
violation: 9.611089606619829e-05
Converged at iteration 42

Plot results

_ = C.T.plot(title="Concentration", colormap=None, legend=C.k.labels)
Concentration
m = St.ptp()
for i in range(St.shape[0]):
    St.data[i] -= i * m / 2
ax = St.plot(title="Components", colormap=None, legend=St.k.labels)
ax.set_yticks([])
Components
[]

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.210 seconds)