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.06158195065493252
violation: 0.03477774452872507
violation: 0.023155912689776854
violation: 0.016289564836607328
violation: 0.011732197722809675
violation: 0.009261179153190123
violation: 0.00777050252991445
violation: 0.006957471610159007
violation: 0.006457414370355097
violation: 0.006191115125282044
violation: 0.006057238974457798
violation: 0.006000777806339469
violation: 0.005868357891308944
violation: 0.005802918028533913
violation: 0.005772367658830051
violation: 0.005756947971777933
violation: 0.005733332889919144
violation: 0.005700606624644881
violation: 0.005667827078790767
violation: 0.005587736630048325
violation: 0.005529135183167028
violation: 0.005460760674075956
violation: 0.005375194673451637
violation: 0.005288054442074889
violation: 0.0052032849396116835
violation: 0.005110269931845409
violation: 0.005004969613317528
violation: 0.004889401944567222
violation: 0.004778610916794522
violation: 0.004657040705272576
violation: 0.004527642308383084
violation: 0.0043937174771749125
violation: 0.004267124138925775
violation: 0.0041339281330162216
violation: 0.004012755928138836
violation: 0.0038914653519267943
violation: 0.0037652602700427454
violation: 0.003637514821863087
violation: 0.003514710166154562
violation: 0.003396513830358363
violation: 0.0032925205579804064
violation: 0.0031941648132723256
violation: 0.003104947029333483
violation: 0.0030221674035497146
violation: 0.0029389646390338563
violation: 0.0028561158500454626
violation: 0.00277389121868032
violation: 0.0026927116687367474
violation: 0.0026129548289080405
violation: 0.0025351644702120845
violation: 0.0024587403634379864
violation: 0.0023842026907912347
violation: 0.0023133039094786513
violation: 0.002243736743481272
violation: 0.0021751169925787865
violation: 0.0021084094490923036
violation: 0.0020436678052478574
violation: 0.001980664359350304
violation: 0.0019243270194359758
violation: 0.001871326163205918
violation: 0.0018195678200694939
violation: 0.0017692749012867635
violation: 0.0017204657491192627
violation: 0.0016731692686997798
violation: 0.0016274950351470303
violation: 0.0015839173329697765
violation: 0.0015418960309271253
violation: 0.0015014385431313202
violation: 0.0014629272012160112
violation: 0.0014262081321620278
violation: 0.0013907597658088745
violation: 0.0013601582805157204
violation: 0.0013328464824004177
violation: 0.00130659239882366
violation: 0.0012813357494813546
violation: 0.0012569657401122374
violation: 0.0012363658727396858
violation: 0.0012190114699547508
violation: 0.001199211654450121
violation: 0.0011775622624512383
violation: 0.001158260908541502
violation: 0.0011389415923629593
violation: 0.001119912492936029
violation: 0.0011006754884539183
violation: 0.0010832777040277854
violation: 0.001066136369230517
violation: 0.0010491933694699942
violation: 0.0010318244102608851
violation: 0.0010150792321237218
violation: 0.0009988201809299326
violation: 0.0009841318528815664
violation: 0.0009699922960875635
violation: 0.0009545966012010165
violation: 0.0009396363331386478
violation: 0.0009266599168144229
violation: 0.0009140262172600757
violation: 0.0009015875006378058
violation: 0.0008902182357106461
violation: 0.000878049931187082
violation: 0.0008660457470920988
violation: 0.0008543517499941034
violation: 0.000842870600328714
violation: 0.0008315536804369846
violation: 0.0008208847158801585
violation: 0.000810426980776625
violation: 0.000799752248473584
violation: 0.0007893350738952204
violation: 0.000779132660791482
violation: 0.0007691414390019422
violation: 0.0007597179067852495
violation: 0.0007504652538892696
violation: 0.0007412456856970205
violation: 0.0007322966170537951
violation: 0.0007235915691681523
violation: 0.0007151920055396905
violation: 0.0007069372346704506
violation: 0.0006987637535248359
violation: 0.0006907733550828325
violation: 0.0006830298779797977
violation: 0.0006754181243926379
violation: 0.0006679795936492159
violation: 0.0006606893398229801
violation: 0.0006536091296353119
violation: 0.0006466641120995846
violation: 0.0006399762615475295
violation: 0.0006335488650773613
violation: 0.0006273957420689707
violation: 0.0006215236000711962
violation: 0.0006161518203755415
violation: 0.0006113918151772281
violation: 0.0006071251736136113
violation: 0.0006030938520873912
violation: 0.00059922557718893
violation: 0.0005955122189368078
violation: 0.0005919356405961429
violation: 0.0005884735105285741
violation: 0.0005851626197889759
violation: 0.0005819472966803228
violation: 0.0005788624242481524
violation: 0.0005759087479597714
violation: 0.0005730546137310377
violation: 0.0005702968600986503
violation: 0.0005676053787180077
violation: 0.0005650176785170851
violation: 0.0005624480584368181
violation: 0.0005599281471045432
violation: 0.000557420810271973
violation: 0.0005549930907510392
violation: 0.0005526263090687516
violation: 0.0005503237863511767
violation: 0.000548087574800857
violation: 0.0005458976082893088
violation: 0.0005437570853968507
violation: 0.0005416726314725654
violation: 0.0005396329582223123
violation: 0.0005376381718609104
violation: 0.000535862885080929
violation: 0.0005342566446343637
violation: 0.0005327134944357819
violation: 0.0005311700256182531
violation: 0.0005296374901747631
violation: 0.0005281469649347928
violation: 0.000526654947416142
violation: 0.0005251860718894653
violation: 0.0005237318107593109
violation: 0.0005222955570665601
violation: 0.0005208942964237921
violation: 0.0005195265168842024
violation: 0.0005181813428113747
violation: 0.0005168846752736832
violation: 0.0005156608680273337
violation: 0.0005144616554312981
violation: 0.0005132891688190325
violation: 0.0005121515266404378
violation: 0.0005110364330892185
violation: 0.0005099447315063313
violation: 0.0005088753613792333
violation: 0.0005078236610579803
violation: 0.0005067909112023973
violation: 0.0005057740763561627
violation: 0.0005047767175618313
violation: 0.0005037958933651188
violation: 0.0005028222129276679
violation: 0.0005018650428478361
violation: 0.0005009224423796203
violation: 0.0004999974962487709
violation: 0.0004990872395199634
violation: 0.0004981962000748846
violation: 0.0004973147318190719
violation: 0.0004964417296741251
violation: 0.0004955753197881232
violation: 0.0004946901218459982
violation: 0.0004938210437308978
violation: 0.0004929673596845045
violation: 0.0004921226355844778
violation: 0.0004912871202791049
violation: 0.0004904596528540225
violation: 0.0004896376456531956
/home/runner/micromamba/envs/scpy_docs/lib/python3.10/site-packages/sklearn/decomposition/_nmf.py:1770: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
  warnings.warn(
violation: 1.0
violation: 0.27811881011285017
violation: 0.21103839273441907
violation: 0.163658975737549
violation: 0.12638124502857256
violation: 0.09689398092857988
violation: 0.07386553913526457
violation: 0.057263048836391314
violation: 0.046397106968951024
violation: 0.03776270101072447
violation: 0.030324671559648714
violation: 0.024000077998570134
violation: 0.018705054318855895
violation: 0.014282427091628531
violation: 0.010676123451469035
violation: 0.008016534827386103
violation: 0.006238616114828499
violation: 0.005124394633030272
violation: 0.004490757479656629
violation: 0.00405311575112349
violation: 0.0037443026036689045
violation: 0.003428962811660986
violation: 0.0030323190347560105
violation: 0.002727253739146849
violation: 0.0023865056940471263
violation: 0.0020851628627841443
violation: 0.0017697484695163256
violation: 0.0014925716272858596
violation: 0.0012488601974045652
violation: 0.001043867511137814
violation: 0.0008573236692762575
violation: 0.0006991377766201241
violation: 0.000570621843192755
violation: 0.00046362862409558836
violation: 0.0003748723547990385
violation: 0.0003032579084427604
violation: 0.0002463663859384391
violation: 0.00019825804790408173
violation: 0.00015827733519298853
violation: 0.00012439075792819684
violation: 9.611089606619749e-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 0.922 seconds)

Gallery generated by Sphinx-Gallery