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.1401742102450201
violation: 0.061581950654932466
violation: 0.03477774452872515
violation: 0.023155912689776757
violation: 0.016289564836607585
violation: 0.011732197722809807
violation: 0.009261179153190191
violation: 0.007770502529914334
violation: 0.006957471610159231
violation: 0.006457414370355009
violation: 0.006191115125282043
violation: 0.006057238974457892
violation: 0.006000777806339409
violation: 0.005868357891308691
violation: 0.005802918028533902
violation: 0.00577236765882996
violation: 0.005756947971777949
violation: 0.005733332889918884
violation: 0.005700606624644876
violation: 0.005667827078790887
violation: 0.005587736630048331
violation: 0.005529135183167238
violation: 0.00546076067407596
violation: 0.00537519467345172
violation: 0.005288054442075174
violation: 0.005203284939611578
violation: 0.00511026993184529
violation: 0.005004969613317506
violation: 0.004889401944567271
violation: 0.004778610916794768
violation: 0.004657040705272616
violation: 0.004527642308383084
violation: 0.004393717477174862
violation: 0.004267124138925853
violation: 0.004133928133016049
violation: 0.004012755928138828
violation: 0.0038914653519266673
violation: 0.0037652602700426825
violation: 0.003637514821862781
violation: 0.0035147101661544555
violation: 0.0033965138303584095
violation: 0.003292520557980581
violation: 0.003194164813272277
violation: 0.0031049470293334452
violation: 0.0030221674035501122
violation: 0.0029389646390338238
violation: 0.002856115850045658
violation: 0.0027738912186803114
violation: 0.0026927116687366966
violation: 0.00261295482890771
violation: 0.002535164470212039
violation: 0.0024587403634382344
violation: 0.0023842026907912204
violation: 0.0023133039094785607
violation: 0.0022437367434811157
violation: 0.0021751169925786898
violation: 0.0021084094490923643
violation: 0.002043667805247888
violation: 0.00198066435935078
violation: 0.001924327019435711
violation: 0.001871326163205702
violation: 0.0018195678200697918
violation: 0.0017692749012861906
violation: 0.001720465749119124
violation: 0.00167316926869977
violation: 0.0016274950351468863
violation: 0.001583917332969805
violation: 0.0015418960309271639
violation: 0.0015014385431316526
violation: 0.0014629272012160706
violation: 0.0014262081321620545
violation: 0.0013907597658088667
violation: 0.0013601582805157842
violation: 0.0013328464824004494
violation: 0.0013065923988234453
violation: 0.0012813357494810323
violation: 0.0012569657401120113
violation: 0.0012363658727400438
violation: 0.0012190114699552387
violation: 0.0011992116544499302
violation: 0.001177562262451217
violation: 0.0011582609085416876
violation: 0.0011389415923634433
violation: 0.0011199124929360928
violation: 0.0011006754884540025
violation: 0.0010832777040277574
violation: 0.0010661363692304072
violation: 0.001049193369470144
violation: 0.0010318244102608856
violation: 0.0010150792321236086
violation: 0.000998820180929725
violation: 0.000984131852881795
violation: 0.0009699922960875171
violation: 0.0009545966012010774
violation: 0.0009396363331388116
violation: 0.0009266599168145526
violation: 0.0009140262172604201
violation: 0.0009015875006377411
violation: 0.0008902182357105853
violation: 0.000878049931187086
violation: 0.0008660457470914955
violation: 0.0008543517499940249
violation: 0.00084287060032879
violation: 0.0008315536804373142
violation: 0.00082088471588003
violation: 0.0008104269807763174
violation: 0.0007997522484737923
violation: 0.0007893350738952414
violation: 0.000779132660791386
violation: 0.0007691414390017081
violation: 0.000759717906784973
violation: 0.0007504652538888829
violation: 0.0007412456856969369
violation: 0.0007322966170537355
violation: 0.0007235915691683577
violation: 0.0007151920055396678
violation: 0.000706937234670731
violation: 0.0006987637535248706
violation: 0.0006907733550823135
violation: 0.0006830298779801414
violation: 0.0006754181243922712
violation: 0.0006679795936491802
violation: 0.0006606893398231391
violation: 0.000653609129635397
violation: 0.0006466641120994914
violation: 0.0006399762615475121
violation: 0.0006335488650772722
violation: 0.0006273957420689552
violation: 0.0006215236000712263
violation: 0.0006161518203755498
violation: 0.000611391815177281
violation: 0.0006071251736135801
violation: 0.0006030938520874517
violation: 0.0005992255771888669
violation: 0.000595512218936639
violation: 0.0005919356405961765
violation: 0.0005884735105283555
violation: 0.0005851626197890536
violation: 0.0005819472966804315
violation: 0.0005788624242481659
violation: 0.000575908747959864
violation: 0.000573054613730788
violation: 0.0005702968600985153
violation: 0.0005676053787180727
violation: 0.0005650176785171647
violation: 0.000562448058436961
violation: 0.0005599281471046095
violation: 0.00055742081027209
violation: 0.0005549930907514477
violation: 0.0005526263090686113
violation: 0.0005503237863510516
violation: 0.0005480875748007882
violation: 0.0005458976082894279
violation: 0.0005437570853969483
violation: 0.0005416726314725309
violation: 0.0005396329582220897
violation: 0.0005376381718607586
violation: 0.0005358628850808413
violation: 0.0005342566446344409
violation: 0.0005327134944356978
violation: 0.0005311700256180893
violation: 0.0005296374901747798
violation: 0.0005281469649348159
violation: 0.0005266549474162088
violation: 0.0005251860718895901
violation: 0.0005237318107590701
violation: 0.000522295557066807
violation: 0.0005208942964237476
violation: 0.0005195265168843467
violation: 0.00051818134281132
violation: 0.0005168846752735159
violation: 0.0005156608680273247
violation: 0.000514461655431378
violation: 0.000513289168818803
violation: 0.0005121515266404544
violation: 0.0005110364330893296
violation: 0.0005099447315066997
violation: 0.0005088753613792473
violation: 0.0005078236610581321
violation: 0.0005067909112025915
violation: 0.0005057740763562746
violation: 0.0005047767175615117
violation: 0.0005037958933647767
violation: 0.0005028222129278628
violation: 0.000501865042848087
violation: 0.0005009224423797917
violation: 0.0004999974962486886
violation: 0.0004990872395197072
violation: 0.000498196200074831
violation: 0.0004973147318192308
violation: 0.0004964417296739609
violation: 0.0004955753197880084
violation: 0.0004946901218459152
violation: 0.0004938210437302964
violation: 0.0004929673596845362
violation: 0.0004921226355848339
violation: 0.0004912871202792399
violation: 0.000490459652853881
violation: 0.0004896376456532419
/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.27811881011285566
violation: 0.21103839273442218
violation: 0.16365897573755078
violation: 0.12638124502857306
violation: 0.09689398092857955
violation: 0.0738655391352639
violation: 0.05726304883639075
violation: 0.04639710696895043
violation: 0.03776270101072371
violation: 0.03032467155964785
violation: 0.02400007799856916
violation: 0.018705054318854927
violation: 0.014282427091627525
violation: 0.010676123451468237
violation: 0.00801653482738551
violation: 0.00623861611482811
violation: 0.005124394633030097
violation: 0.004490757479656591
violation: 0.004053115751123517
violation: 0.0037443026036690173
violation: 0.003428962811661008
violation: 0.003032319034756011
violation: 0.0027272537391468377
violation: 0.002386505694047069
violation: 0.0020851628627840775
violation: 0.0017697484695162345
violation: 0.0014925716272857353
violation: 0.0012488601974044893
violation: 0.0010438675111377608
violation: 0.0008573236692761946
violation: 0.0006991377766200252
violation: 0.0005706218431926639
violation: 0.0004636286240955302
violation: 0.00037487235479896977
violation: 0.00030325790844272423
violation: 0.00024636638593842074
violation: 0.00019825804790406037
violation: 0.00015827733519294736
violation: 0.00012439075792815713
violation: 9.611089606615877e-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.075 seconds)