Warning

You are reading the documentation related to the development version. Go here if you are looking for the documentation of the stable release.

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.14017421024502125
violation: 0.06158195065493312
violation: 0.03477774452872544
violation: 0.023155912689777264
violation: 0.016289564836607665
violation: 0.011732197722809886
violation: 0.00926117915319027
violation: 0.007770502529914582
violation: 0.006957471610159074
violation: 0.006457414370355163
violation: 0.006191115125282191
violation: 0.006057238974457794
violation: 0.006000777806339665
violation: 0.005868357891308805
violation: 0.0058029180285341245
violation: 0.00577236765883005
violation: 0.005756947971777908
violation: 0.005733332889919072
violation: 0.0057006066246449855
violation: 0.005667827078790972
violation: 0.005587736630048401
violation: 0.00552913518316728
violation: 0.005460760674076034
violation: 0.005375194673451774
violation: 0.0052880544420751095
violation: 0.0052032849396116835
violation: 0.005110269931845496
violation: 0.00500496961331748
violation: 0.004889401944567351
violation: 0.004778610916794917
violation: 0.004657040705272669
violation: 0.004527642308383071
violation: 0.004393717477175077
violation: 0.0042671241389258055
violation: 0.004133928133016246
violation: 0.004012755928138986
violation: 0.003891465351926862
violation: 0.0037652602700429896
violation: 0.0036375148218631163
violation: 0.003514710166154361
violation: 0.0033965138303584043
violation: 0.0032925205579807967
violation: 0.003194164813272252
violation: 0.0031049470293335203
violation: 0.0030221674035499726
violation: 0.00293896463903387
violation: 0.002856115850045472
violation: 0.002773891218680172
violation: 0.0026927116687369963
violation: 0.0026129548289077096
violation: 0.0025351644702119036
violation: 0.0024587403634380206
violation: 0.0023842026907913904
violation: 0.0023133039094782727
violation: 0.0022437367434808165
violation: 0.0021751169925787223
violation: 0.002108409449092396
violation: 0.0020436678052478097
violation: 0.0019806643593504496
violation: 0.0019243270194360847
violation: 0.0018713261632057878
violation: 0.0018195678200699326
violation: 0.001769274901286621
violation: 0.0017204657491195344
violation: 0.0016731692686997263
violation: 0.001627495035146988
violation: 0.0015839173329699058
violation: 0.0015418960309269462
violation: 0.0015014385431314202
violation: 0.0014629272012161019
violation: 0.0014262081321621018
violation: 0.001390759765808907
violation: 0.0013601582805157688
violation: 0.0013328464824004388
violation: 0.0013065923988230617
violation: 0.0012813357494810146
violation: 0.0012569657401119154
violation: 0.0012363658727398805
violation: 0.001219011469954997
violation: 0.0011992116544497845
violation: 0.0011775622624511733
violation: 0.0011582609085417652
violation: 0.0011389415923630643
violation: 0.0011199124929361787
violation: 0.0011006754884539684
violation: 0.0010832777040276744
violation: 0.0010661363692307504
violation: 0.001049193369470455
violation: 0.0010318244102607164
violation: 0.0010150792321237847
violation: 0.0009988201809300059
violation: 0.0009841318528815456
violation: 0.0009699922960877215
violation: 0.0009545966012007809
violation: 0.0009396363331389327
violation: 0.0009266599168144825
violation: 0.0009140262172603133
violation: 0.0009015875006378186
violation: 0.0008902182357104323
violation: 0.0008780499311870749
violation: 0.0008660457470918984
violation: 0.0008543517499939137
violation: 0.0008428706003286736
violation: 0.0008315536804371585
violation: 0.0008208847158800796
violation: 0.0008104269807765768
violation: 0.0007997522484735909
violation: 0.0007893350738953156
violation: 0.0007791326607913672
violation: 0.0007691414390015367
violation: 0.000759717906785432
violation: 0.0007504652538894002
violation: 0.0007412456856973482
violation: 0.0007322966170542157
violation: 0.0007235915691681103
violation: 0.0007151920055397968
violation: 0.0007069372346705553
violation: 0.00069876375352487
violation: 0.0006907733550827291
violation: 0.0006830298779796145
violation: 0.0006754181243924642
violation: 0.0006679795936493271
violation: 0.0006606893398231502
violation: 0.0006536091296352726
violation: 0.0006466641120994061
violation: 0.0006399762615476593
violation: 0.0006335488650769353
violation: 0.0006273957420690215
violation: 0.0006215236000710991
violation: 0.0006161518203752888
violation: 0.0006113918151773643
violation: 0.0006071251736132639
violation: 0.0006030938520872966
violation: 0.0005992255771887783
violation: 0.0005955122189366086
violation: 0.0005919356405958675
violation: 0.0005884735105286834
violation: 0.0005851626197891722
violation: 0.0005819472966804984
violation: 0.0005788624242479048
violation: 0.0005759087479600037
violation: 0.0005730546137310143
violation: 0.0005702968600984356
violation: 0.0005676053787180614
violation: 0.0005650176785171702
violation: 0.0005624480584367872
violation: 0.0005599281471046074
violation: 0.0005574208102719237
violation: 0.0005549930907510602
violation: 0.0005526263090687813
violation: 0.0005503237863511096
violation: 0.0005480875748009534
violation: 0.0005458976082893698
violation: 0.000543757085397233
violation: 0.0005416726314727078
violation: 0.0005396329582218358
violation: 0.0005376381718607023
violation: 0.0005358628850813099
violation: 0.0005342566446343248
violation: 0.000532713494435824
violation: 0.0005311700256176258
violation: 0.0005296374901748259
violation: 0.0005281469649346233
violation: 0.0005266549474163797
violation: 0.0005251860718895148
violation: 0.0005237318107592073
violation: 0.000522295557066576
violation: 0.0005208942964239631
violation: 0.0005195265168841663
violation: 0.000518181342811386
violation: 0.000516884675273678
violation: 0.0005156608680269221
violation: 0.0005144616554310391
violation: 0.0005132891688188142
violation: 0.0005121515266400655
violation: 0.0005110364330892545
violation: 0.0005099447315066629
violation: 0.0005088753613791753
violation: 0.0005078236610581994
violation: 0.000506790911202419
violation: 0.0005057740763561124
violation: 0.0005047767175613845
violation: 0.0005037958933649345
violation: 0.0005028222129278582
violation: 0.0005018650428480515
violation: 0.000500922442379887
violation: 0.0004999974962487263
violation: 0.0004990872395197898
violation: 0.0004981962000752068
violation: 0.0004973147318189884
violation: 0.0004964417296742918
violation: 0.0004955753197882699
violation: 0.0004946901218458738
violation: 0.000493821043730432
violation: 0.0004929673596844998
violation: 0.0004921226355846433
violation: 0.0004912871202792571
violation: 0.0004904596528543391
violation: 0.0004896376456530375
/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.27811881011286
violation: 0.21103839273442485
violation: 0.16365897573755225
violation: 0.12638124502857367
violation: 0.09689398092857968
violation: 0.07386553913526368
violation: 0.05726304883639048
violation: 0.046397106968950025
violation: 0.037762701010723154
violation: 0.030324671559647142
violation: 0.024000077998568483
violation: 0.018705054318854244
violation: 0.014282427091626847
violation: 0.010676123451467625
violation: 0.008016534827385138
violation: 0.006238616114827798
violation: 0.005124394633029949
violation: 0.004490757479656498
violation: 0.004053115751123486
violation: 0.0037443026036689917
violation: 0.003428962811660985
violation: 0.003032319034755954
violation: 0.0027272537391468277
violation: 0.0023865056940470123
violation: 0.0020851628627840293
violation: 0.0017697484695161426
violation: 0.001492571627285636
violation: 0.0012488601974043841
violation: 0.0010438675111376708
violation: 0.0008573236692761044
violation: 0.0006991377766199905
violation: 0.0005706218431926472
violation: 0.00046362862409547853
violation: 0.0003748723547989076
violation: 0.00030325790844268693
violation: 0.0002463663859383898
violation: 0.0001982580479040317
violation: 0.00015827733519293552
violation: 0.00012439075792815415
violation: 9.611089606615713e-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.935 seconds)

Gallery generated by Sphinx-Gallery