{"id":3213,"date":"2026-08-28T15:16:09","date_gmt":"2026-08-28T13:16:09","guid":{"rendered":"https:\/\/gekkophotonics.com\/cnn-pls-test\/"},"modified":"2026-08-28T15:16:09","modified_gmt":"2026-08-28T13:16:09","slug":"cnn-pls-test","status":"publish","type":"page","link":"https:\/\/gekkophotonics.com\/de\/cnn-i-pls-auf-einem-viskositaetslauf\/","title":{"rendered":"CNN i PLS na jednym runie lepko\u015bci"},"content":{"rendered":"<style>:root{--page-title-display:none;}<\/style>\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3213\" class=\"elementor elementor-3213 elementor-bc-flex-widget\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f92580cb elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f92580cb\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8244cde4\" data-id=\"8244cde4\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ae219158 elementor-widget elementor-widget-html\" data-id=\"ae219158\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Exo+2:wght@500;600;700;800&family=Manrope:wght@400;500;600;700;800&display=swap\" rel=\"stylesheet\">\n<style>\n:root{\n  --indigo-900:#12143f;\n  --indigo-600:#2b2c82;\n  --indigo-500:#3a3ca8;\n  --indigo-100:#e4e5f7;\n  --azure-500:#009fe3;\n  --azure-100:#dcf1fc;\n  --gold-700:#a9761c;\n  --gold-500:#d9a441;\n  --gold-100:#faf1d9;\n  --navy-900:#0b0f24;\n  --navy-800:#111634;\n  --navy-700:#1a2047;\n  --paper:#f6f8fb;\n  --white:#ffffff;\n  --mist:#eef1f6;\n  --steel-200:#cdd5e0;\n  --steel-300:#aab4c4;\n  --steel-400:#7e8aa0;\n  --steel-500:#576078;\n  --steel-700:#252b3b;\n  --ink:#0e1324;\n  --ok-500:#3f9d54;\n  --ok-100:#e2f2e6;\n\n  --text-strong:var(--ink);\n  --text-body:var(--steel-700);\n  --text-muted:var(--steel-500);\n  --text-faint:var(--steel-400);\n  --text-on-dark:#eef2fb;\n  --text-on-dark-muted:#a7b0cc;\n\n  --surface-page:var(--paper);\n  --surface-card:var(--white);\n  --surface-sunken:var(--mist);\n  --border-hairline:var(--steel-200);\n\n  --font-display:\"Exo 2\",\"Manrope\",system-ui,sans-serif;\n  --font-body:\"Manrope\",system-ui,-apple-system,\"Segoe UI\",sans-serif;\n\n  --r-xs:3px;--r-sm:6px;--r-md:10px;--r-lg:16px;\n  --shadow-sm:0 1px 3px rgba(14,19,36,.08),0 1px 2px rgba(14,19,36,.04);\n  --shadow-md:0 4px 12px rgba(14,19,36,.08),0 2px 4px rgba(14,19,36,.05);\n  --sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:20px;--sp-6:24px;--sp-8:32px;--sp-10:40px;--sp-12:48px;--sp-16:64px;\n}\n\n*{box-sizing:border-box}\nhtml,body{margin:0;padding:0}\nbody{\n  background:var(--surface-page);\n  color:var(--text-body);\n  font-family:var(--font-body);\n  font-size:16px;\n  line-height:1.6;\n  -webkit-font-smoothing:antialiased;\n}\nimg,svg{max-width:100%}\n.wrap{max-width:1100px;margin:0 auto;padding:0 var(--sp-6)}\n.font-tabular{font-variant-numeric:tabular-nums}\n\n\/* ---------- header ---------- *\/\n.report-header{padding:var(--sp-16) 0 var(--sp-10)}\n.eyebrow{\n  font-family:var(--font-display);\n  font-weight:700;\n  font-size:.78rem;\n  letter-spacing:.14em;\n  text-transform:uppercase;\n  color:var(--indigo-600);\n  margin:0 0 var(--sp-4);\n}\n.eyebrow .dot{color:var(--steel-400);margin:0 .5em}\nh1{\n  font-family:var(--font-display);\n  font-weight:700;\n  font-size:clamp(1.9rem,4vw,2.75rem);\n  line-height:1.12;\n  letter-spacing:-0.01em;\n  color:var(--text-strong);\n  margin:0 0 var(--sp-5);\n  max-width:20ch;\n  text-wrap:balance;\n}\n.lead{\n  font-size:1.1rem;\n  line-height:1.65;\n  color:var(--text-body);\n  max-width:62ch;\n  margin:0 0 var(--sp-6);\n}\n.lead strong{color:var(--text-strong);font-weight:700}\n\n.meta-strip{\n  display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-8);\n  padding-top:var(--sp-6);\n  border-top:1px solid var(--border-hairline);\n}\n.meta-item{display:flex;flex-direction:column;gap:2px}\n.meta-item .k{font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;color:var(--text-faint)}\n.meta-item .v{font-size:.92rem;color:var(--text-strong);font-weight:600}\n\n\/* ---------- sections ---------- *\/\nsection{padding:var(--sp-12) 0}\nsection + section{border-top:1px solid var(--border-hairline)}\nh2{\n  font-family:var(--font-display);\n  font-weight:700;\n  font-size:clamp(1.4rem,2.6vw,1.8rem);\n  color:var(--text-strong);\n  margin:0 0 var(--sp-3);\n  letter-spacing:-0.005em;\n}\n.section-note{color:var(--text-muted);font-size:.98rem;max-width:64ch;margin:0 0 var(--sp-8)}\n\n.context-card{\n  background:var(--indigo-100);\n  border-radius:var(--r-md);\n  padding:var(--sp-6) var(--sp-8);\n  display:grid;\n  grid-template-columns:auto 1fr;\n  gap:var(--sp-5);\n  align-items:start;\n}\n.context-card .tag{\n  font-family:var(--font-display);font-weight:700;font-size:.7rem;\n  letter-spacing:.1em;text-transform:uppercase;color:var(--indigo-600);\n  background:var(--white);border-radius:var(--r-sm);padding:6px 10px;white-space:nowrap;\n}\n.context-card p{margin:0;color:var(--steel-700);font-size:.98rem;line-height:1.6}\n.context-card p + p{margin-top:var(--sp-3)}\n\n\/* ---------- legend ---------- *\/\n.legend{display:flex;flex-wrap:wrap;gap:var(--sp-6);margin-bottom:var(--sp-6)}\n.legend-item{display:flex;align-items:center;gap:8px;font-size:.88rem;color:var(--text-body);font-weight:600}\n.swatch{width:22px;height:3px;border-radius:2px;display:inline-block}\n.swatch.line-cnn{background:var(--indigo-600);height:4px}\n.swatch.line-pls{background:repeating-linear-gradient(90deg,var(--steel-400) 0 6px,transparent 6px 10px);height:3px}\n.swatch.dot-ref{width:11px;height:11px;border-radius:50%;background:var(--gold-500);border:2px solid var(--gold-700)}\n\n\/* ---------- metric bars ---------- *\/\n.metric-grid{display:flex;flex-direction:column;gap:var(--sp-6)}\n.metric-row{\n  display:grid;\n  grid-template-columns:220px 1fr 130px;\n  gap:var(--sp-5);\n  align-items:center;\n}\n.metric-name{font-weight:700;color:var(--text-strong);font-size:.96rem}\n.metric-caption{display:block;font-weight:400;color:var(--text-muted);font-size:.8rem;margin-top:2px}\n.bars{display:flex;flex-direction:column;gap:8px}\n.bar-track{position:relative;flex:1 1 auto;min-width:0;height:22px;background:var(--surface-sunken);border-radius:var(--r-xs);overflow:hidden}\n.bar-fill{height:100%;border-radius:var(--r-xs);display:flex;align-items:center;padding-left:10px;white-space:nowrap;box-sizing:border-box}\n.bar-fill.cnn{background:var(--indigo-600)}\n.bar-fill.pls{background:var(--steel-300)}\n.bar-fill-label{font-size:.78rem;font-weight:700;white-space:nowrap}\n.bar-fill.cnn .bar-fill-label{color:var(--white)}\n.bar-fill.pls .bar-fill-label{color:var(--steel-700)}\n.bar-outside-label{\n  position:absolute;top:0;height:100%;display:flex;align-items:center;\n  font-size:.78rem;font-weight:700;color:var(--text-strong);white-space:nowrap;padding-left:10px;\n}\n.bar-row-label{font-size:.72rem;font-weight:700;letter-spacing:.04em;color:var(--text-faint);width:34px;flex:0 0 auto}\n.bar-line{display:flex;align-items:center;gap:8px}\n.metric-delta{text-align:right}\n.delta-badge{\n  display:inline-block;font-family:var(--font-display);font-weight:700;\n  font-size:1.05rem;color:var(--ok-500);\n}\n.delta-caption{display:block;font-size:.72rem;color:var(--text-faint);margin-top:2px}\n\n\/* ---------- chart ---------- *\/\n.chart-card{\n  background:var(--surface-card);\n  border:1px solid var(--border-hairline);\n  border-radius:var(--r-lg);\n  padding:var(--sp-6) var(--sp-6) var(--sp-4);\n  box-shadow:var(--shadow-sm);\n}\n.chart-title-row{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:var(--sp-3);margin-bottom:var(--sp-2)}\n.chart-title-row h3{font-family:var(--font-display);font-size:1.05rem;font-weight:700;color:var(--text-strong);margin:0}\n.chart-title-row .chart-sub{font-size:.82rem;color:var(--text-faint)}\n#chart-svg{width:100%;height:auto;display:block}\n.axis-label{font-size:11px;fill:var(--steel-500);font-family:var(--font-body)}\n.grid-line{stroke:var(--steel-200);stroke-width:1}\n.zone-fill{fill:var(--gold-100);opacity:.55}\n.callout-box{fill:var(--white);stroke:var(--steel-200);stroke-width:1}\n.callout-text{font-size:11.5px;fill:var(--steel-700);font-family:var(--font-body);font-weight:600}\n.callout-text.muted{fill:var(--steel-500);font-weight:400}\n\n\/* ---------- table ---------- *\/\n.table-scroll{overflow-x:auto;border:1px solid var(--border-hairline);border-radius:var(--r-md)}\ntable{width:100%;border-collapse:collapse;min-width:760px;font-size:.92rem}\nthead th{\n  text-align:left;font-family:var(--font-body);font-weight:700;font-size:.74rem;\n  text-transform:uppercase;letter-spacing:.06em;color:var(--text-faint);\n  background:var(--surface-sunken);padding:12px 14px;border-bottom:1px solid var(--border-hairline);\n  white-space:nowrap;\n}\ntbody td{padding:12px 14px;border-bottom:1px solid var(--border-hairline);color:var(--text-body);white-space:nowrap}\ntbody tr:last-child td{border-bottom:none}\ntd.num,th.num{text-align:right;font-variant-numeric:tabular-nums}\n.closer-cnn{color:var(--indigo-600);font-weight:700}\n.closer-pls{color:var(--steel-600);font-weight:700}\n.table-foot{padding:var(--sp-3) var(--sp-1) 0;font-size:.82rem;color:var(--text-faint)}\n\n\/* ---------- verdict panel ---------- *\/\n.verdict{\n  background:var(--navy-900);\n  border-radius:var(--r-lg);\n  padding:var(--sp-10) var(--sp-8);\n  color:var(--text-on-dark);\n}\n.verdict h2{color:var(--white)}\n.verdict .lead{color:var(--text-on-dark-muted);max-width:70ch}\n.verdict-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:var(--sp-6);margin-top:var(--sp-8)}\n.verdict-card{background:var(--navy-800);border:1px solid var(--border-on-dark,rgba(255,255,255,.12));border-radius:var(--r-md);padding:var(--sp-5)}\n.verdict-card .k{font-family:var(--font-display);font-weight:600;font-size:.82rem;color:var(--azure-500);margin:0 0 8px;text-transform:uppercase;letter-spacing:.05em}\n.verdict-card p{margin:0;color:var(--text-on-dark-muted);font-size:.9rem;line-height:1.55}\n\n\/* ---------- footer ---------- *\/\nfooter{padding:var(--sp-10) 0 var(--sp-16);color:var(--text-faint);font-size:.82rem}\nfooter .sources{margin-top:var(--sp-2)}\n.beta-tag{\n  display:inline-flex;align-items:center;gap:6px;\n  background:var(--gold-100);color:var(--gold-700);\n  font-family:var(--font-display);font-weight:700;font-size:.7rem;\n  letter-spacing:.08em;text-transform:uppercase;\n  border-radius:var(--r-sm);padding:5px 10px;margin-bottom:var(--sp-5);\n}\n\n@media (max-width:720px){\n  .metric-row{grid-template-columns:1fr;gap:var(--sp-2)}\n  .metric-delta{text-align:left}\n  .context-card{grid-template-columns:1fr}\n}\n<\/style>\n<div class=\"wrap\">\n\n  <header class=\"report-header\">\n    <p class=\"eyebrow\">Spectrally OS <span class=\"dot\">\u00b7<\/span> modele predykcyjne <span class=\"dot\">\u00b7<\/span> beta v1<\/p>\n    <h1>Gdzie hybrydowy dob\u00f3r modelu robi r\u00f3\u017cnic\u0119<\/h1>\n    <p class=\"lead\">\n      Nasz stos \u0142\u0105czy \u015bwiadomie <strong>CNN<\/strong> (konwolucyjne sieci neuronowe) i klasyczn\u0105 chemometri\u0119\n      (<strong>PLS<\/strong>, PCA) \u2014 dobieran\u0105 pod konkretny przypadek pomiarowy. Ten materia\u0142 pokazuje mechanik\u0119\n      tego wyboru na jednym runie: gdy lepko\u015b\u0107 ro\u015bnie nieliniowo o dwa rz\u0119dy wielko\u015bci w nieca\u0142\u0105 godzin\u0119,\n      komponent CNN naszego stosu odwzorowuje j\u0105 dok\u0142adniej ni\u017c model PLS liczony r\u00f3wnolegle na tych samych danych.\n    <\/p>\n    <div class=\"meta-strip\">\n      <div class=\"meta-item\"><span class=\"k\">Run testowy<\/span><span class=\"v font-tabular\">2026-07-17, 01:00\u201302:10<\/span><\/div>\n      <div class=\"meta-item\"><span class=\"k\">Czas trwania<\/span><span class=\"v font-tabular\">69 min<\/span><\/div>\n      <div class=\"meta-item\"><span class=\"k\">Odczyty CNN \/ PLS<\/span><span class=\"v font-tabular\">119 + 119, co ~35 s<\/span><\/div>\n      <div class=\"meta-item\"><span class=\"k\">Pomiary referencyjne klienta<\/span><span class=\"v font-tabular\">7<\/span><\/div>\n      <div class=\"meta-item\"><span class=\"k\">Status<\/span><span class=\"v\">Beta v1<\/span><\/div>\n    <\/div>\n  <\/header>\n\n  <section id=\"context\">\n    <div class=\"context-card\">\n      <span class=\"tag\">Dlaczego to sprawdzamy<\/span>\n      <div>\n        <p>\n          PLS i PCA zak\u0142adaj\u0105 w przybli\u017ceniu liniow\u0105 zale\u017cno\u015b\u0107 mi\u0119dzy widmem a mierzon\u0105 wielko\u015bci\u0105 procesow\u0105.\n          Dzia\u0142a to dobrze w w\u0105skim zakresie. K\u0142opot zaczyna si\u0119, gdy proces przyspiesza nieliniowo \u2014 a dok\u0142adnie\n          tak zachowuje si\u0119 lepko\u015b\u0107 w tym runie: od ok. 54 do ponad 3200 jednostek w 69 minut.\n        <\/p>\n        <p>\n          Poni\u017cej dwa niezale\u017cne \u017ar\u00f3d\u0142a dowod\u00f3w: (A) zagregowane metryki z szerszego zbioru testowego\n          (<code>pls_vs_cnn_metrics.csv<\/code>) i (B) jeden konkretny run produkcyjny z 7 pomiarami referencyjnymi\n          klienta (<code>lepkosc_2026-06-01.csv<\/code>), kt\u00f3ry pokazuje, gdzie dok\u0142adnie zaczyna si\u0119 rozjazd.\n        <\/p>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section id=\"aggregate\">\n    <h2>A. Wyniki na szerszym zbiorze testowym<\/h2>\n    <p class=\"section-note\">\n      Metryki liczone na pe\u0142nym zbiorze testowym, niezale\u017cnym od runu z sekcji B. Ka\u017cdy wiersz pokazuje ten sam\n      kierunek: mniej wyja\u015bnionej wariancji do wyja\u015bnienia, mniejszy typowy b\u0142\u0105d, mniejszy b\u0142\u0105d w ogonie rozk\u0142adu.\n    <\/p>\n\n    <div class=\"metric-grid\" id=\"metric-grid\"><\/div>\n  <\/section>\n\n  <section id=\"run-chart\">\n    <h2>B. Jeden run, w czasie rzeczywistym<\/h2>\n    <p class=\"section-note\">\n      Ta sama lepko\u015b\u0107, ten sam moment procesu, trzy niezale\u017cne \u017ar\u00f3d\u0142a: dwa modele liczone r\u00f3wnolegle z tych\n      samych widm i pomiary referencyjne klienta. Skala pionowa jest logarytmiczna \u2014 inaczej rozjazd w g\u00f3rnym\n      zakresie zas\u0142oni\u0142by to, co dzieje si\u0119 na starcie procesu.\n    <\/p>\n\n    <div class=\"chart-card\">\n      <div class=\"chart-title-row\">\n        <h3>Lepko\u015b\u0107 w czasie \u2014 CNN, PLS, pomiar referencyjny<\/h3>\n        <span class=\"chart-sub\">warto\u015bci surowe z pliku \u017ar\u00f3d\u0142owego, skala log<\/span>\n      <\/div>\n      <div class=\"legend\">\n        <span class=\"legend-item\"><span class=\"swatch line-cnn\"><\/span>CNN (nasz stos)<\/span>\n        <span class=\"legend-item\"><span class=\"swatch line-pls\"><\/span>PLS (klasyczna chemometria)<\/span>\n        <span class=\"legend-item\"><span class=\"swatch dot-ref\"><\/span>Referencja klienta<\/span>\n      <\/div>\n      <svg id=\"chart-svg\" viewBox=\"0 0 1040 520\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><\/svg>\n    <\/div>\n  <\/section>\n\n  <section id=\"table\">\n    <h2>B\u0142\u0105d wzgl\u0119dem pomiar\u00f3w referencyjnych klienta<\/h2>\n    <p class=\"section-note\">\n      Dla ka\u017cdego z 7 moment\u00f3w, w kt\u00f3rych klient wykona\u0142 niezale\u017cny pomiar referencyjny, por\u00f3wnujemy najbli\u017cszy\n      w czasie odczyt CNN i PLS. Kolumna po prawej pokazuje, kt\u00f3ry odczyt by\u0142 liczbowo bli\u017cej referencji.\n    <\/p>\n    <div class=\"table-scroll\">\n      <table>\n        <thead>\n          <tr>\n            <th>Czas<\/th>\n            <th class=\"num\">Referencja<\/th>\n            <th class=\"num\">CNN<\/th>\n            <th class=\"num\">B\u0142\u0105d CNN<\/th>\n            <th class=\"num\">PLS<\/th>\n            <th class=\"num\">B\u0142\u0105d PLS<\/th>\n            <th>Bli\u017cej referencji<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody id=\"table-body\"><\/tbody>\n      <\/table>\n    <\/div>\n    <p class=\"table-foot\">\n      Na 7 sprawdzonych punkt\u00f3w PLS jest bli\u017cej referencji raz \u2014 przy najni\u017cszej lepko\u015bci (ok. 90 j., start procesu,\n      zakres bliski liniowemu). Od ok. 350 j. w g\u00f3r\u0119, gdy proces wchodzi w re\u017cim nieliniowy, CNN jest bli\u017cej\n      referencji za ka\u017cdym razem, z rosn\u0105c\u0105 przewag\u0105.\n    <\/p>\n  <\/section>\n\n  <section id=\"verdict\">\n    <div class=\"verdict\">\n      <h2>Co to znaczy dla doboru modelu<\/h2>\n      <p class=\"lead\">\n        R\u00f3\u017cnica nie jest sta\u0142a \u2014 ro\u015bnie razem z nieliniowo\u015bci\u0105 procesu. To argument za stosem hybrydowym, nie za\n        jednym wygranym algorytmem.\n      <\/p>\n      <div class=\"verdict-grid\">\n        <div class=\"verdict-card\">\n          <p class=\"k\">Zakres liniowy (start procesu)<\/p>\n          <p>Przy niskiej lepko\u015bci (ok. 90 j.) PLS i CNN daj\u0105 por\u00f3wnywalny, ma\u0142y b\u0142\u0105d \u2014 PLS by\u0142 tu nawet nieznacznie\n          bli\u017cej referencji. W tym re\u017cimie klasyczna chemometria wystarcza.<\/p>\n        <\/div>\n        <div class=\"verdict-card\">\n          <p class=\"k\">Zakres nieliniowy (\u015brodek i koniec runu)<\/p>\n          <p>Powy\u017cej ok. 350 j. b\u0142\u0105d PLS ro\u015bnie szybciej ni\u017c b\u0142\u0105d CNN \u2014 na pe\u0142nym zbiorze testowym r\u00f3\u017cnica si\u0119ga\n          67% ni\u017cszego RMSE i 55% ni\u017cszego MAE po stronie CNN.<\/p>\n        <\/div>\n        <div class=\"verdict-card\">\n          <p class=\"k\">Wniosek dla stosu<\/p>\n          <p>Dobieramy komponent modelu do charakteru procesu, nie odwrotnie. Ten run jest dowodem na mechanik\u0119\n          wyboru, nie na to, \u017ce jeden algorytm zast\u0119puje drugi we wszystkich przypadkach.<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <footer>\n    <span class=\"beta-tag\">Beta v1 \u2014 pierwsza wersja tego zestawienia<\/span>\n    <p>\n      Ten materia\u0142 to pierwsza iteracja. Kolejne wersje rozszerz\u0105 zbi\u00f3r o wi\u0119cej run\u00f3w i wi\u0119cej proces\u00f3w,\n      zamiast opiera\u0107 wniosek na jednym pomiarze.\n    <\/p>\n    <p class=\"sources\">\n      \u0179r\u00f3d\u0142a danych: <code>pls_vs_cnn_metrics.csv<\/code> (metryki zagregowane), <code>lepkosc_2026-06-01.csv<\/code>\n      (run z 2026-07-17, warto\u015bci bez jednostki w pliku \u017ar\u00f3d\u0142owym \u2014 traktuj jako demonstracj\u0119 skali b\u0142\u0119du).\n      Gekko Photonics, Spectrally OS.\n    <\/p>\n  <\/footer>\n\n<\/div>\n\n<script>\n(function(){\n  var CNN = [[0.0,53.62],[0.588,73.13],[1.176,62.48],[1.762,62.21],[2.35,53.26],[2.937,67.51],[3.526,71.38],[4.111,71.32],[4.699,63.02],[5.285,69.14],[5.873,79.45],[6.459,76.19],[7.047,77.85],[7.633,86.49],[8.221,73.92],[8.808,84.2],[9.396,88.01],[9.983,90.06],[10.571,94.88],[11.157,99.76],[11.744,100.86],[12.333,99.08],[12.918,110.28],[13.505,107.87],[14.093,108.29],[14.68,111.8],[15.268,118.83],[15.856,124.61],[16.443,120.77],[17.034,134.4],[17.617,136.53],[18.204,137.01],[18.793,136.19],[19.38,147.88],[19.968,152.84],[20.556,157.17],[21.143,159.26],[21.729,154.28],[22.317,172.04],[22.905,171.07],[23.493,177.85],[24.081,185.04],[24.669,181.21],[25.256,176.46],[25.844,194.13],[26.431,188.05],[27.019,198.87],[27.605,206.25],[28.193,222.83],[28.781,223.04],[29.366,229.37],[29.958,225.68],[30.541,234.73],[31.129,248.24],[31.717,263.08],[32.303,280.65],[32.889,267.85],[33.478,278.66],[34.066,302.71],[34.653,309.27],[35.242,323.1],[35.827,341.37],[36.416,330.51],[37.005,359.55],[37.591,373.72],[38.18,368.36],[38.768,399.16],[39.356,391.54],[39.942,421.77],[40.529,422.6],[41.117,462.34],[41.704,492.2],[42.292,510.4],[42.88,536.78],[43.467,577.0],[44.056,577.1],[44.641,633.76],[45.229,695.33],[45.815,680.37],[46.404,678.9],[46.992,719.52],[47.581,777.19],[48.168,765.93],[48.756,876.84],[49.344,981.05],[49.931,949.29],[50.518,1048.7],[51.105,1016.11],[51.692,1198.86],[52.28,1195.06],[52.869,1288.15],[53.454,1469.91],[54.041,1524.21],[54.63,1758.96],[55.217,1806.45],[55.805,1768.91],[56.391,1944.61],[56.976,2058.6],[57.565,2127.89],[58.15,2382.12],[58.737,2360.07],[59.324,2530.57],[59.911,2631.25],[60.499,2652.15],[61.086,2724.16],[61.673,2979.25],[62.26,2985.78],[62.849,2910.37],[63.436,3051.37],[64.023,2870.51],[64.611,3052.45],[65.197,3016.22],[65.784,2989.83],[66.372,3031.1],[66.956,2965.92],[67.544,3013.12],[68.134,3069.67],[68.72,3137.19],[69.308,3224.44]];\n  var PLS = [[0.0,60.35],[0.588,62.91],[1.176,64.62],[1.762,67.06],[2.35,68.03],[2.937,69.0],[3.526,70.25],[4.111,73.99],[4.699,74.96],[5.285,78.81],[5.873,78.68],[6.459,82.1],[7.047,84.85],[7.633,85.16],[8.221,87.15],[8.808,87.87],[9.396,91.93],[9.983,94.61],[10.571,95.66],[11.157,101.1],[11.744,100.35],[12.333,105.97],[12.918,107.88],[13.505,106.77],[14.093,114.06],[14.68,117.98],[15.268,119.85],[15.856,123.41],[16.443,125.93],[17.034,127.48],[17.617,131.46],[18.204,136.79],[18.793,140.44],[19.38,143.95],[19.968,146.46],[20.556,153.79],[21.143,156.42],[21.729,158.37],[22.317,160.59],[22.905,169.09],[23.493,176.29],[24.081,175.93],[24.669,187.87],[25.256,189.75],[25.844,197.69],[26.431,203.77],[27.019,212.73],[27.605,224.26],[28.193,228.37],[28.781,237.04],[29.366,238.92],[29.958,247.13],[30.541,266.32],[31.129,269.44],[31.717,291.33],[32.303,282.42],[32.889,300.43],[33.478,312.3],[34.066,324.41],[34.653,343.79],[35.242,362.27],[35.827,374.57],[36.416,369.81],[37.005,425.23],[37.591,440.36],[38.18,452.66],[38.768,489.62],[39.356,489.86],[39.942,518.55],[40.529,546.29],[41.117,567.98],[41.704,592.64],[42.292,630.79],[42.88,677.04],[43.467,730.15],[44.056,724.05],[44.641,792.93],[45.229,819.25],[45.815,861.92],[46.404,867.08],[46.992,947.62],[47.581,1021.69],[48.168,991.75],[48.756,1149.23],[49.344,1196.82],[49.931,1234.62],[50.518,1307.8],[51.105,1339.42],[51.692,1478.48],[52.28,1504.47],[52.869,1557.78],[53.454,1664.16],[54.041,1736.94],[54.63,1806.62],[55.217,1962.53],[55.805,1983.92],[56.391,2101.55],[56.976,2193.69],[57.565,2192.34],[58.15,2464.31],[58.737,2488.59],[59.324,2681.21],[59.911,2707.65],[60.499,2734.77],[61.086,2775.78],[61.673,3096.35],[62.26,2984.28],[62.849,2791.87],[63.436,2645.09],[64.023,2561.53],[64.611,2444.97],[65.197,2496.69],[65.784,2527.11],[66.372,2542.11],[66.956,2484.79],[67.544,2405.84],[68.134,2534.34],[68.72,2560.0],[69.308,2596.75]];\n  var REF = [[7.11,90.0],[20.11,150.0],[38.11,350.0],[51.11,1100.0],[55.11,1600.0],[58.11,2300.0],[66.11,3000.0]];\n\n  \/\/ ---- metric bars (A) ----\n  var metrics = [\n    {name:\"Niewyja\u015bniona wariancja\", caption:\"1 \u2212 R\u00b2 \u2014 ile zmienno\u015bci procesu model NIE t\u0142umaczy\", cnn:0.4, pls:4.0, unit:\"%\", cnnRaw:\"R\u00b2 0.996\", plsRaw:\"R\u00b2 0.960\", delta:\"10\u00d7\", deltaCap:\"mniej niewyja\u015bnionej wariancji\"},\n    {name:\"RMSE\", caption:\"pierwiastek b\u0142\u0119du \u015bredniokwadratowego \u2014 du\u017ce pojedyncze odchylenia karane mocniej\", cnn:55.66, pls:169.06, unit:\"\", delta:\"\u221267%\", deltaCap:\"ni\u017cszy RMSE\"},\n    {name:\"MAE\", caption:\"\u015bredni b\u0142\u0105d bezwzgl\u0119dny \u2014 typowa skala pomy\u0142ki\", cnn:32.28, pls:71.64, unit:\"\", delta:\"\u221255%\", deltaCap:\"ni\u017cszy MAE\"},\n    {name:\"MAPE\", caption:\"\u015bredni b\u0142\u0105d procentowy \u2014 por\u00f3wnywalny mi\u0119dzy poziomami lepko\u015bci\", cnn:6.57, pls:8.90, unit:\"%\", delta:\"\u221226%\", deltaCap:\"ni\u017cszy MAPE\"},\n    {name:\"P95 APE\", caption:\"95. percentyl b\u0142\u0119du procentowego \u2014 ogon rozk\u0142adu, najgorsze ~5% odczyt\u00f3w\", cnn:17.95, pls:23.60, unit:\"%\", delta:\"\u221224%\", deltaCap:\"ni\u017cszy P95 APE\"}\n  ];\n  var grid = document.getElementById(\"metric-grid\");\n\n  function buildBarLine(rowLabel, variant, pct, displayLabel){\n    var line = document.createElement(\"div\");\n    line.className = \"bar-line\";\n    var rl = document.createElement(\"span\");\n    rl.className = \"bar-row-label\";\n    rl.textContent = rowLabel;\n    var track = document.createElement(\"div\");\n    track.className = \"bar-track\";\n    var fill = document.createElement(\"div\");\n    fill.className = \"bar-fill \" + variant;\n    fill.style.width = pct + \"%\";\n    var lbl = document.createElement(\"span\");\n    lbl.className = \"bar-fill-label\";\n    lbl.textContent = displayLabel;\n    fill.appendChild(lbl);\n    track.appendChild(fill);\n    line.appendChild(rl);\n    line.appendChild(track);\n    return {line:line, track:track, fill:fill, lbl:lbl};\n  }\n\n  var pendingBars = [];\n  metrics.forEach(function(m){\n    var max = Math.max(m.cnn, m.pls);\n    var cnnPct = (m.cnn\/max*100).toFixed(1);\n    var plsPct = (m.pls\/max*100).toFixed(1);\n    var cnnLabel = m.cnnRaw ? m.cnnRaw : (m.cnn.toFixed(2) + (m.unit||\"\"));\n    var plsLabel = m.plsRaw ? m.plsRaw : (m.pls.toFixed(2) + (m.unit||\"\"));\n\n    var row = document.createElement(\"div\");\n    row.className = \"metric-row\";\n    var name = document.createElement(\"div\");\n    name.className = \"metric-name\";\n    name.innerHTML = m.name + '<span class=\"metric-caption\">'+m.caption+'<\/span>';\n    var bars = document.createElement(\"div\");\n    bars.className = \"bars\";\n    var cnnBar = buildBarLine(\"CNN\", \"cnn\", cnnPct, cnnLabel);\n    var plsBar = buildBarLine(\"PLS\", \"pls\", plsPct, plsLabel);\n    bars.appendChild(cnnBar.line);\n    bars.appendChild(plsBar.line);\n    var delta = document.createElement(\"div\");\n    delta.className = \"metric-delta\";\n    delta.innerHTML = '<span class=\"delta-badge\">'+m.delta+'<\/span><span class=\"delta-caption\">'+m.deltaCap+'<\/span>';\n\n    row.appendChild(name);\n    row.appendChild(bars);\n    row.appendChild(delta);\n    grid.appendChild(row);\n    pendingBars.push(cnnBar, plsBar);\n  });\n\n  \/\/ second pass: measured after layout \u2014 move label outside the fill if it doesn't fit\n  pendingBars.forEach(function(b){\n    var fillWidth = b.fill.getBoundingClientRect().width;\n    var labelWidth = b.lbl.getBoundingClientRect().width;\n    if (labelWidth + 16 > fillWidth){\n      var text = b.lbl.textContent;\n      b.fill.removeChild(b.lbl);\n      var outside = document.createElement(\"span\");\n      outside.className = \"bar-outside-label\";\n      outside.style.left = b.fill.style.width;\n      outside.textContent = text;\n      b.track.appendChild(outside);\n    }\n  });\n\n  \/\/ ---- reference error table ----\n  function nearest(series, t){\n    var best = series[0], bd = Math.abs(series[0][0]-t);\n    for (var i=1;i<series.length;i++){\n      var d = Math.abs(series[i][0]-t);\n      if (d<bd){bd=d;best=series[i];}\n    }\n    return best;\n  }\n  var tbody = document.getElementById(\"table-body\");\n  REF.forEach(function(r){\n    var t=r[0], ref=r[1];\n    var c = nearest(CNN, t), p = nearest(PLS, t);\n    var errC = c[1]-ref, errP = p[1]-ref;\n    var peC = 100*errC\/ref, peP = 100*errP\/ref;\n    var closerCnn = Math.abs(errC) <= Math.abs(errP);\n    var tr = document.createElement(\"tr\");\n    tr.innerHTML =\n      '<td>'+t.toFixed(0)+' min<\/td>'+\n      '<td class=\"num\">'+ref.toFixed(0)+'<\/td>'+\n      '<td class=\"num\">'+c[1].toFixed(1)+'<\/td>'+\n      '<td class=\"num\">'+(errC>=0?'+':'')+errC.toFixed(1)+' ('+(peC>=0?'+':'')+peC.toFixed(1)+'%)<\/td>'+\n      '<td class=\"num\">'+p[1].toFixed(1)+'<\/td>'+\n      '<td class=\"num\">'+(errP>=0?'+':'')+errP.toFixed(1)+' ('+(peP>=0?'+':'')+peP.toFixed(1)+'%)<\/td>'+\n      '<td class=\"'+(closerCnn?'closer-cnn':'closer-pls')+'\">'+(closerCnn?'CNN':'PLS')+'<\/td>';\n    tbody.appendChild(tr);\n  });\n\n  \/\/ ---- chart ----\n  var svg = document.getElementById(\"chart-svg\");\n  var W=1040, H=520;\n  var padL=64, padR=28, padT=24, padB=48;\n  var plotW = W-padL-padR, plotH = H-padT-padB;\n  var xMin=0, xMax=70;\n  var yMin=40, yMax=3400;\n  var lyMin=Math.log10(yMin), lyMax=Math.log10(yMax);\n\n  function X(t){ return padL + (t-xMin)\/(xMax-xMin)*plotW; }\n  function Y(v){ return padT + (1-(Math.log10(v)-lyMin)\/(lyMax-lyMin))*plotH; }\n\n  function path(series){\n    return series.map(function(p,i){ return (i===0?\"M\":\"L\")+X(p[0]).toFixed(1)+\",\"+Y(p[1]).toFixed(1); }).join(\" \");\n  }\n\n  var ns = \"http:\/\/www.w3.org\/2000\/svg\";\n  function el(tag, attrs){\n    var e = document.createElementNS(ns, tag);\n    for (var k in attrs) e.setAttribute(k, attrs[k]);\n    return e;\n  }\n\n  \/\/ nonlinear zone shading (from ~350 onward)\n  var zoneX0 = X( (function(){\n    \/\/ find t where CNN crosses 350\n    for (var i=0;i<CNN.length;i++){ if (CNN[i][1]>=350) return CNN[i][0]; }\n    return 32;\n  })() );\n  svg.appendChild(el(\"rect\", {class:\"zone-fill\", x:zoneX0, y:padT, width:(padL+plotW-zoneX0), height:plotH}));\n\n  \/\/ grid lines + y labels\n  [50,100,200,500,1000,2000,3000].forEach(function(v){\n    var y = Y(v);\n    svg.appendChild(el(\"line\", {class:\"grid-line\", x1:padL, x2:padL+plotW, y1:y, y2:y}));\n    var t = el(\"text\", {class:\"axis-label\", x:padL-10, y:y+4, \"text-anchor\":\"end\"});\n    t.textContent = v;\n    svg.appendChild(t);\n  });\n  \/\/ x ticks every 10 min\n  for (var xt=0; xt<=70; xt+=10){\n    var xx = X(xt);\n    svg.appendChild(el(\"line\", {class:\"grid-line\", x1:xx, x2:xx, y1:padT, y2:padT+plotH}));\n    var tx = el(\"text\", {class:\"axis-label\", x:xx, y:padT+plotH+22, \"text-anchor\":\"middle\"});\n    tx.textContent = xt+\" min\";\n    svg.appendChild(tx);\n  }\n\n  var zoneLabel = el(\"text\", {class:\"axis-label\", x:zoneX0+8, y:padT+16});\n  zoneLabel.setAttribute(\"fill\", \"#a9761c\");\n  zoneLabel.style.fontWeight = \"700\";\n  zoneLabel.textContent = \"re\u017cim nieliniowy (\u2265 ok. 350 j.)\";\n  svg.appendChild(zoneLabel);\n\n  \/\/ PLS line (behind CNN)\n  svg.appendChild(el(\"path\", {d:path(PLS), fill:\"none\", stroke:\"#aab4c4\", \"stroke-width\":2.5, \"stroke-dasharray\":\"6 5\"}));\n  \/\/ CNN line\n  svg.appendChild(el(\"path\", {d:path(CNN), fill:\"none\", stroke:\"#2b2c82\", \"stroke-width\":3}));\n\n  \/\/ reference dots + value labels\n  REF.forEach(function(r){\n    var cx=X(r[0]), cy=Y(r[1]);\n    svg.appendChild(el(\"circle\", {cx:cx, cy:cy, r:6, fill:\"#d9a441\", stroke:\"#a9761c\", \"stroke-width\":2}));\n    var lbl = el(\"text\", {class:\"axis-label\", x:cx, y:cy-12, \"text-anchor\":\"middle\"});\n    lbl.style.fontWeight=\"700\";\n    lbl.setAttribute(\"fill\", \"#a9761c\");\n    lbl.textContent = r[1].toFixed(0);\n    svg.appendChild(lbl);\n  });\n\n  \/\/ callouts\n  function callout(x, y, w, h, lines){\n    var g = el(\"g\", {});\n    g.appendChild(el(\"rect\", {class:\"callout-box\", x:x, y:y, width:w, height:h, rx:8}));\n    lines.forEach(function(line, i){\n      var t = el(\"text\", {class:\"callout-text\"+(line.muted?\" muted\":\"\"), x:x+12, y:y+22+i*17});\n      t.textContent = line.text;\n      g.appendChild(t);\n    });\n    svg.appendChild(g);\n  }\n  callout(padL+6, padT+8, 198, 56, [\n    {text:\"Start procesu (~7 min)\"},\n    {text:\"PLS nieznacznie bli\u017cej\", muted:true},\n    {text:\"referencji przy niskiej lepko\u015bci\", muted:true}\n  ]);\n  callout(padL+plotW-236, padT+plotH-118, 230, 92, [\n    {text:\"Powy\u017cej ~350 j.\"},\n    {text:\"CNN bli\u017cej referencji\", muted:true},\n    {text:\"za ka\u017cdym razem \u2014 rozjazd PLS\", muted:true},\n    {text:\"ro\u015bnie wraz z nieliniowo\u015bci\u0105\", muted:true}\n  ]);\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-3213","page","type-page","status-publish","hentry"],"blocksy_meta":[],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/gekkophotonics.com\/de\/wp-json\/wp\/v2\/pages\/3213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gekkophotonics.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gekkophotonics.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gekkophotonics.com\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gekkophotonics.com\/de\/wp-json\/wp\/v2\/comments?post=3213"}],"version-history":[{"count":0,"href":"https:\/\/gekkophotonics.com\/de\/wp-json\/wp\/v2\/pages\/3213\/revisions"}],"wp:attachment":[{"href":"https:\/\/gekkophotonics.com\/de\/wp-json\/wp\/v2\/media?parent=3213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}