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.14017421024502014
violation: 0.06158195065493249
violation: 0.03477774452872515
violation: 0.023155912689776872
violation: 0.016289564836607293
violation: 0.011732197722809758
violation: 0.009261179153190122
violation: 0.007770502529914627
violation: 0.006957471610159089
violation: 0.0064574143703552645
violation: 0.0061911151252820535
violation: 0.006057238974457592
violation: 0.006000777806339455
violation: 0.0058683578913088594
violation: 0.005802918028533959
violation: 0.005772367658830075
violation: 0.005756947971778068
violation: 0.005733332889918805
violation: 0.005700606624644865
violation: 0.005667827078790984
violation: 0.0055877366300484494
violation: 0.005529135183167083
violation: 0.005460760674075957
violation: 0.005375194673451759
violation: 0.005288054442075059
violation: 0.005203284939611698
violation: 0.005110269931845401
violation: 0.005004969613317556
violation: 0.004889401944567395
violation: 0.004778610916794548
violation: 0.004657040705272572
violation: 0.004527642308383116
violation: 0.004393717477174862
violation: 0.004267124138925702
violation: 0.004133928133016348
violation: 0.004012755928138771
violation: 0.003891465351926787
violation: 0.0037652602700427042
violation: 0.003637514821862894
violation: 0.003514710166154446
violation: 0.0033965138303581263
violation: 0.00329252055798068
violation: 0.0031941648132722206
violation: 0.0031049470293336282
violation: 0.0030221674035500246
violation: 0.0029389646390339226
violation: 0.0028561158500456938
violation: 0.0027738912186803643
violation: 0.0026927116687368376
violation: 0.002612954828907802
violation: 0.002535164470211983
violation: 0.0024587403634382383
violation: 0.0023842026907909706
violation: 0.0023133039094788807
violation: 0.002243736743481225
violation: 0.0021751169925787487
violation: 0.002108409449092549
violation: 0.0020436678052481103
violation: 0.0019806643593508087
violation: 0.0019243270194360192
violation: 0.0018713261632058162
violation: 0.0018195678200695175
violation: 0.001769274901286509
violation: 0.0017204657491189743
violation: 0.0016731692686995506
violation: 0.001627495035146835
violation: 0.0015839173329699743
violation: 0.0015418960309271955
violation: 0.001501438543131316
violation: 0.001462927201216079
violation: 0.0014262081321620103
violation: 0.0013907597658087089
violation: 0.0013601582805156526
violation: 0.00133284648240033
violation: 0.0013065923988233306
violation: 0.0012813357494810852
violation: 0.0012569657401121748
violation: 0.0012363658727399572
violation: 0.0012190114699549698
violation: 0.0011992116544500284
violation: 0.0011775622624512867
violation: 0.0011582609085415184
violation: 0.001138941592363041
violation: 0.0011199124929361984
violation: 0.0011006754884537097
violation: 0.001083277704027545
violation: 0.001066136369230252
violation: 0.0010491933694699838
violation: 0.0010318244102606963
violation: 0.0010150792321231051
violation: 0.0009988201809299616
violation: 0.0009841318528819594
violation: 0.0009699922960876742
violation: 0.0009545966012009507
violation: 0.0009396363331384531
violation: 0.00092665991681462
violation: 0.000914026217259882
violation: 0.0009015875006377341
violation: 0.0008902182357107867
violation: 0.0008780499311869565
violation: 0.0008660457470920491
violation: 0.0008543517499939793
violation: 0.0008428706003286477
violation: 0.0008315536804371222
violation: 0.0008208847158799816
violation: 0.0008104269807762843
violation: 0.0007997522484734985
violation: 0.0007893350738953455
violation: 0.0007791326607912125
violation: 0.0007691414390015888
violation: 0.0007597179067854802
violation: 0.0007504652538893678
violation: 0.0007412456856970828
violation: 0.0007322966170538466
violation: 0.0007235915691683487
violation: 0.0007151920055398561
violation: 0.000706937234670494
violation: 0.0006987637535248863
violation: 0.000690773355082485
violation: 0.0006830298779799374
violation: 0.0006754181243927066
violation: 0.0006679795936491594
violation: 0.0006606893398229962
violation: 0.0006536091296352177
violation: 0.0006466641120997198
violation: 0.00063997626154747
violation: 0.0006335488650770439
violation: 0.000627395742069023
violation: 0.0006215236000710833
violation: 0.0006161518203756283
violation: 0.0006113918151771796
violation: 0.000607125173613408
violation: 0.0006030938520875035
violation: 0.0005992255771886657
violation: 0.0005955122189366325
violation: 0.0005919356405963285
violation: 0.0005884735105283992
violation: 0.0005851626197892928
violation: 0.0005819472966805581
violation: 0.0005788624242480211
violation: 0.0005759087479597221
violation: 0.0005730546137309185
violation: 0.0005702968600985343
violation: 0.0005676053787179388
violation: 0.0005650176785167832
violation: 0.00056244805843684
violation: 0.0005599281471046915
violation: 0.000557420810271828
violation: 0.0005549930907513535
violation: 0.0005526263090688865
violation: 0.0005503237863511132
violation: 0.0005480875748009801
violation: 0.0005458976082894234
violation: 0.000543757085396793
violation: 0.0005416726314726879
violation: 0.000539632958222082
violation: 0.0005376381718606247
violation: 0.0005358628850811231
violation: 0.0005342566446345362
violation: 0.0005327134944358865
violation: 0.0005311700256182077
violation: 0.0005296374901746844
violation: 0.0005281469649349842
violation: 0.0005266549474162002
violation: 0.000525186071889416
violation: 0.000523731810759214
violation: 0.0005222955570668208
violation: 0.0005208942964238287
violation: 0.0005195265168844873
violation: 0.0005181813428110996
violation: 0.000516884675273485
violation: 0.0005156608680273234
violation: 0.0005144616554310531
violation: 0.0005132891688187567
violation: 0.0005121515266405646
violation: 0.0005110364330891371
violation: 0.0005099447315067428
violation: 0.0005088753613789447
violation: 0.0005078236610580253
violation: 0.0005067909112021299
violation: 0.0005057740763558537
violation: 0.0005047767175616306
violation: 0.0005037958933649873
violation: 0.0005028222129277887
violation: 0.0005018650428479306
violation: 0.0005009224423800709
violation: 0.000499997496249006
violation: 0.0004990872395197527
violation: 0.000498196200074918
violation: 0.0004973147318187785
violation: 0.0004964417296739696
violation: 0.0004955753197881855
violation: 0.000494690121845788
violation: 0.0004938210437305147
violation: 0.0004929673596847029
violation: 0.0004921226355843399
violation: 0.0004912871202792274
violation: 0.0004904596528540437
violation: 0.000489637645652821
/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.2781188101128527
violation: 0.21103839273442063
violation: 0.16365897573754962
violation: 0.12638124502857226
violation: 0.09689398092857912
violation: 0.07386553913526352
violation: 0.057263048836390586
violation: 0.04639710696895023
violation: 0.03776270101072369
violation: 0.030324671559647905
violation: 0.024000077998569312
violation: 0.018705054318855174
violation: 0.014282427091627888
violation: 0.010676123451468475
violation: 0.008016534827385784
violation: 0.006238616114828434
violation: 0.005124394633030237
violation: 0.0044907574796566405
violation: 0.004053115751123465
violation: 0.0037443026036689505
violation: 0.003428962811660933
violation: 0.0030323190347560235
violation: 0.0027272537391468342
violation: 0.002386505694047089
violation: 0.0020851628627841057
violation: 0.0017697484695162462
violation: 0.001492571627285738
violation: 0.0012488601974044826
violation: 0.0010438675111377777
violation: 0.0008573236692762356
violation: 0.0006991377766201039
violation: 0.0005706218431926852
violation: 0.00046362862409554987
violation: 0.0003748723547989991
violation: 0.00030325790844274825
violation: 0.0002463663859384165
violation: 0.00019825804790408563
violation: 0.00015827733519298292
violation: 0.00012439075792819763
violation: 9.611089606617643e-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.143 seconds)