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.14017421024501994
violation: 0.06158195065493233
violation: 0.03477774452872507
violation: 0.023155912689776823
violation: 0.016289564836607574
violation: 0.011732197722809814
violation: 0.009261179153190144
violation: 0.0077705025299143445
violation: 0.0069574716101591175
violation: 0.006457414370354967
violation: 0.006191115125282082
violation: 0.006057238974457721
violation: 0.0060007778063394055
violation: 0.005868357891308836
violation: 0.005802918028534052
violation: 0.0057723676588299164
violation: 0.005756947971777738
violation: 0.005733332889918916
violation: 0.005700606624644782
violation: 0.005667827078790809
violation: 0.0055877366300483705
violation: 0.005529135183167017
violation: 0.005460760674075725
violation: 0.005375194673451671
violation: 0.005288054442074991
violation: 0.005203284939611725
violation: 0.005110269931845316
violation: 0.005004969613317455
violation: 0.004889401944567244
violation: 0.004778610916794592
violation: 0.004657040705272565
violation: 0.004527642308383194
violation: 0.0043937174771749785
violation: 0.004267124138925564
violation: 0.004133928133016245
violation: 0.004012755928138803
violation: 0.0038914653519269765
violation: 0.0037652602700427797
violation: 0.003637514821863052
violation: 0.003514710166154303
violation: 0.003396513830358435
violation: 0.0032925205579805487
violation: 0.0031941648132721716
violation: 0.0031049470293336556
violation: 0.003022167403549963
violation: 0.0029389646390338645
violation: 0.0028561158500454644
violation: 0.0027738912186803847
violation: 0.0026927116687368445
violation: 0.00261295482890787
violation: 0.002535164470212204
violation: 0.002458740363438011
violation: 0.002384202690791221
violation: 0.002313303909478601
violation: 0.0022437367434808043
violation: 0.0021751169925786347
violation: 0.002108409449092343
violation: 0.0020436678052478487
violation: 0.001980664359350588
violation: 0.0019243270194360701
violation: 0.0018713261632057987
violation: 0.0018195678200698254
violation: 0.0017692749012863567
violation: 0.0017204657491194605
violation: 0.0016731692686996816
violation: 0.0016274950351470071
violation: 0.0015839173329700558
violation: 0.001541896030926723
violation: 0.0015014385431315223
violation: 0.0014629272012160377
violation: 0.0014262081321619962
violation: 0.0013907597658087548
violation: 0.00136015828051555
violation: 0.0013328464824005095
violation: 0.001306592398823609
violation: 0.0012813357494811713
violation: 0.0012569657401120882
violation: 0.0012363658727400312
violation: 0.0012190114699549618
violation: 0.0011992116544500423
violation: 0.00117756226245124
violation: 0.0011582609085415863
violation: 0.0011389415923630478
violation: 0.0011199124929362962
violation: 0.0011006754884540068
violation: 0.0010832777040281072
violation: 0.001066136369230535
violation: 0.0010491933694700677
violation: 0.0010318244102608658
violation: 0.0010150792321235052
violation: 0.000998820180929845
violation: 0.000984131852881717
violation: 0.0009699922960875859
violation: 0.0009545966012008891
violation: 0.0009396363331388714
violation: 0.0009266599168146827
violation: 0.0009140262172600486
violation: 0.0009015875006377615
violation: 0.0008902182357105328
violation: 0.0008780499311871196
violation: 0.0008660457470922869
violation: 0.0008543517499937021
violation: 0.0008428706003290123
violation: 0.000831553680436921
violation: 0.0008208847158803512
violation: 0.0008104269807768269
violation: 0.0007997522484736556
violation: 0.0007893350738954561
violation: 0.0007791326607911452
violation: 0.00076914143900165
violation: 0.0007597179067852647
violation: 0.0007504652538895232
violation: 0.0007412456856970741
violation: 0.0007322966170541477
violation: 0.0007235915691685616
violation: 0.0007151920055394696
violation: 0.0007069372346703951
violation: 0.0006987637535247756
violation: 0.0006907733550824061
violation: 0.000683029877980194
violation: 0.000675418124392638
violation: 0.0006679795936493303
violation: 0.0006606893398229317
violation: 0.0006536091296355815
violation: 0.0006466641120995775
violation: 0.0006399762615475868
violation: 0.0006335488650770152
violation: 0.000627395742069037
violation: 0.0006215236000712942
violation: 0.0006161518203757593
violation: 0.0006113918151772839
violation: 0.0006071251736133629
violation: 0.0006030938520872541
violation: 0.0005992255771888337
violation: 0.0005955122189368705
violation: 0.0005919356405959394
violation: 0.0005884735105283679
violation: 0.000585162619789239
violation: 0.0005819472966804377
violation: 0.000578862424248177
violation: 0.0005759087479598
violation: 0.0005730546137307827
violation: 0.000570296860098627
violation: 0.0005676053787181607
violation: 0.0005650176785170245
violation: 0.0005624480584370827
violation: 0.000559928147104168
violation: 0.0005574208102719446
violation: 0.0005549930907511931
violation: 0.0005526263090687954
violation: 0.0005503237863511461
violation: 0.000548087574800821
violation: 0.000545897608289487
violation: 0.0005437570853968221
violation: 0.0005416726314726881
violation: 0.0005396329582220174
violation: 0.0005376381718607075
violation: 0.0005358628850809453
violation: 0.0005342566446343146
violation: 0.0005327134944357624
violation: 0.0005311700256180427
violation: 0.0005296374901748573
violation: 0.0005281469649349234
violation: 0.0005266549474162787
violation: 0.0005251860718897478
violation: 0.000523731810759383
violation: 0.0005222955570665629
violation: 0.0005208942964239061
violation: 0.0005195265168844445
violation: 0.0005181813428112399
violation: 0.0005168846752737548
violation: 0.0005156608680268424
violation: 0.0005144616554309471
violation: 0.0005132891688186702
violation: 0.00051215152664013
violation: 0.0005110364330892119
violation: 0.0005099447315063835
violation: 0.0005088753613794681
violation: 0.0005078236610584141
violation: 0.0005067909112022987
violation: 0.0005057740763560081
violation: 0.0005047767175614722
violation: 0.0005037958933650328
violation: 0.0005028222129278085
violation: 0.000501865042848173
violation: 0.0005009224423797774
violation: 0.0004999974962487999
violation: 0.000499087239519788
violation: 0.0004981962000748598
violation: 0.0004973147318189361
violation: 0.0004964417296740857
violation: 0.0004955753197880767
violation: 0.0004946901218456781
violation: 0.0004938210437309522
violation: 0.0004929673596846909
violation: 0.0004921226355845998
violation: 0.0004912871202796096
violation: 0.0004904596528542562
violation: 0.0004896376456532611
/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.2781188101128608
violation: 0.21103839273442596
violation: 0.16365897573755278
violation: 0.12638124502857406
violation: 0.09689398092857983
violation: 0.07386553913526385
violation: 0.057263048836391
violation: 0.04639710696895073
violation: 0.037762701010723966
violation: 0.030324671559647957
violation: 0.02400007799856926
violation: 0.018705054318854997
violation: 0.01428242709162752
violation: 0.010676123451468353
violation: 0.008016534827385683
violation: 0.0062386161148282205
violation: 0.005124394633030262
violation: 0.004490757479656728
violation: 0.00405311575112367
violation: 0.003744302603669114
violation: 0.0034289628116611227
violation: 0.003032319034756136
violation: 0.0027272537391468702
violation: 0.0023865056940471072
violation: 0.0020851628627841525
violation: 0.0017697484695162935
violation: 0.0014925716272857752
violation: 0.0012488601974044993
violation: 0.0010438675111377677
violation: 0.0008573236692762191
violation: 0.0006991377766200786
violation: 0.0005706218431926959
violation: 0.00046362862409556207
violation: 0.00037487235479899807
violation: 0.0003032579084427208
violation: 0.0002463663859384125
violation: 0.00019825804790406183
violation: 0.00015827733519294235
violation: 0.000124390757928158
violation: 9.611089606615812e-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.092 seconds)