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.14017421024501978
violation: 0.06158195065493222
violation: 0.034777744528725056
violation: 0.02315591268977671
violation: 0.016289564836607193
violation: 0.011732197722809794
violation: 0.009261179153190259
violation: 0.007770502529914444
violation: 0.006957471610159146
violation: 0.006457414370354858
violation: 0.006191115125282161
violation: 0.006057238974457577
violation: 0.0060007778063392485
violation: 0.005868357891308799
violation: 0.005802918028534075
violation: 0.005772367658829975
violation: 0.005756947971777767
violation: 0.005733332889918899
violation: 0.005700606624644873
violation: 0.0056678270787908006
violation: 0.005587736630048222
violation: 0.00552913518316706
violation: 0.005460760674075982
violation: 0.0053751946734517915
violation: 0.005288054442075098
violation: 0.005203284939611734
violation: 0.005110269931845217
violation: 0.005004969613317615
violation: 0.0048894019445673165
violation: 0.004778610916794667
violation: 0.004657040705272636
violation: 0.004527642308383092
violation: 0.004393717477174949
violation: 0.004267124138926155
violation: 0.004133928133016043
violation: 0.00401275592813884
violation: 0.003891465351926587
violation: 0.003765260270042722
violation: 0.0036375148218628153
violation: 0.00351471016615444
violation: 0.003396513830358345
violation: 0.0032925205579804402
violation: 0.003194164813272334
violation: 0.003104947029333402
violation: 0.0030221674035502016
violation: 0.0029389646390339543
violation: 0.002856115850045787
violation: 0.002773891218680396
violation: 0.002692711668737014
violation: 0.002612954828907752
violation: 0.002535164470212134
violation: 0.0024587403634382748
violation: 0.0023842026907911922
violation: 0.0023133039094785225
violation: 0.0022437367434809193
violation: 0.0021751169925784586
violation: 0.002108409449091948
violation: 0.0020436678052481094
violation: 0.001980664359350912
violation: 0.0019243270194360849
violation: 0.0018713261632056148
violation: 0.0018195678200700531
violation: 0.0017692749012871022
violation: 0.001720465749119531
violation: 0.001673169268699946
violation: 0.0016274950351468477
violation: 0.0015839173329700545
violation: 0.001541896030927257
violation: 0.001501438543131318
violation: 0.0014629272012158083
violation: 0.0014262081321621438
violation: 0.0013907597658086239
violation: 0.0013601582805153967
violation: 0.0013328464824005075
violation: 0.0013065923988235344
violation: 0.0012813357494810174
violation: 0.0012569657401119902
violation: 0.0012363658727401383
violation: 0.0012190114699548622
violation: 0.0011992116544504755
violation: 0.0011775622624514122
violation: 0.0011582609085415408
violation: 0.0011389415923630341
violation: 0.0011199124929360468
violation: 0.0011006754884537251
violation: 0.0010832777040273565
violation: 0.0010661363692305817
violation: 0.0010491933694702766
violation: 0.0010318244102610616
violation: 0.0010150792321235989
violation: 0.0009988201809300794
violation: 0.0009841318528820036
violation: 0.0009699922960876129
violation: 0.0009545966012007396
violation: 0.0009396363331385499
violation: 0.0009266599168140926
violation: 0.0009140262172601975
violation: 0.0009015875006375961
violation: 0.0008902182357105162
violation: 0.0008780499311872083
violation: 0.0008660457470919667
violation: 0.0008543517499937502
violation: 0.0008428706003289571
violation: 0.000831553680436859
violation: 0.0008208847158802625
violation: 0.000810426980776264
violation: 0.0007997522484738804
violation: 0.0007893350738953251
violation: 0.00077913266079155
violation: 0.0007691414390018009
violation: 0.000759717906785078
violation: 0.0007504652538894007
violation: 0.0007412456856970026
violation: 0.0007322966170538996
violation: 0.0007235915691683754
violation: 0.0007151920055395913
violation: 0.0007069372346703425
violation: 0.000698763753524937
violation: 0.0006907733550824476
violation: 0.000683029877979732
violation: 0.0006754181243925116
violation: 0.000667979593649025
violation: 0.000660689339823036
violation: 0.0006536091296354892
violation: 0.000646664112099597
violation: 0.0006399762615478286
violation: 0.0006335488650770798
violation: 0.0006273957420687389
violation: 0.000621523600071264
violation: 0.0006161518203755858
violation: 0.0006113918151776484
violation: 0.0006071251736134771
violation: 0.0006030938520872069
violation: 0.0005992255771890234
violation: 0.000595512218936766
violation: 0.0005919356405958437
violation: 0.0005884735105282747
violation: 0.0005851626197890578
violation: 0.0005819472966806018
violation: 0.0005788624242478402
violation: 0.0005759087479598163
violation: 0.000573054613730957
violation: 0.0005702968600984652
violation: 0.0005676053787181737
violation: 0.0005650176785172173
violation: 0.0005624480584370982
violation: 0.0005599281471045313
violation: 0.0005574208102717534
violation: 0.000554993090751296
violation: 0.0005526263090687078
violation: 0.0005503237863509692
violation: 0.0005480875748007194
violation: 0.0005458976082892436
violation: 0.0005437570853969782
violation: 0.0005416726314727685
violation: 0.000539632958221955
violation: 0.0005376381718607358
violation: 0.0005358628850808577
violation: 0.0005342566446344732
violation: 0.0005327134944360042
violation: 0.000531170025617743
violation: 0.0005296374901746254
violation: 0.0005281469649347356
violation: 0.0005266549474163861
violation: 0.0005251860718894233
violation: 0.0005237318107592301
violation: 0.0005222955570666544
violation: 0.0005208942964240307
violation: 0.0005195265168839342
violation: 0.0005181813428112602
violation: 0.000516884675273851
violation: 0.0005156608680271823
violation: 0.0005144616554311468
violation: 0.0005132891688189613
violation: 0.0005121515266405198
violation: 0.0005110364330890312
violation: 0.0005099447315062098
violation: 0.0005088753613790879
violation: 0.0005078236610582137
violation: 0.0005067909112021103
violation: 0.0005057740763561012
violation: 0.0005047767175617083
violation: 0.0005037958933648426
violation: 0.0005028222129275005
violation: 0.0005018650428480177
violation: 0.0005009224423798401
violation: 0.0004999974962490173
violation: 0.0004990872395198312
violation: 0.0004981962000749781
violation: 0.0004973147318192424
violation: 0.0004964417296736697
violation: 0.0004955753197878327
violation: 0.00049469012184582
violation: 0.0004938210437305191
violation: 0.0004929673596844361
violation: 0.0004921226355845143
violation: 0.0004912871202793565
violation: 0.0004904596528536595
violation: 0.0004896376456529614
/home/runner/micromamba-root/envs/scpy/lib/python3.9/site-packages/sklearn/decomposition/_nmf.py:1665: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
  warnings.warn(
violation: 1.0
violation: 0.2781188101128533
violation: 0.21103839273442093
violation: 0.16365897573755023
violation: 0.1263812450285733
violation: 0.09689398092858025
violation: 0.07386553913526471
violation: 0.05726304883639175
violation: 0.04639710696895148
violation: 0.03776270101072482
violation: 0.030324671559648964
violation: 0.02400007799857021
violation: 0.018705054318855933
violation: 0.014282427091628495
violation: 0.010676123451469026
violation: 0.008016534827386068
violation: 0.0062386161148285
violation: 0.005124394633030314
violation: 0.004490757479656675
violation: 0.00405311575112351
violation: 0.003744302603668947
violation: 0.0034289628116609848
violation: 0.0030323190347559823
violation: 0.002727253739146857
violation: 0.0023865056940471138
violation: 0.0020851628627840966
violation: 0.0017697484695162612
violation: 0.0014925716272857822
violation: 0.0012488601974045396
violation: 0.0010438675111377866
violation: 0.0008573236692762381
violation: 0.0006991377766201049
violation: 0.0005706218431927243
violation: 0.0004636286240955704
violation: 0.00037487235479899227
violation: 0.0003032579084427419
violation: 0.0002463663859384692
violation: 0.00019825804790409214
violation: 0.00015827733519296804
violation: 0.00012439075792817624
violation: 9.611089606617276e-05
Converged at iteration 42

Plot results

_ = C.T.plot(title="Concentration", colormap=None, legend=C.x.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.y.labels)
ax.set_yticks([])
Components
[]

This ends the example ! The following line can be uncommented if no plot shows when running the .py script

# scp.show()

Total running time of the script: ( 0 minutes 1.254 seconds)

Gallery generated by Sphinx-Gallery