UNPKG

@mhg/blog

Version:
29 lines 286 kB
<!DOCTYPE html><html lang="zh-Hans"><head hexo-theme="https://github.com/volantis-x/hexo-theme-volantis/#6.0.3"><meta name="generator" content="Hexo 8.1.2"><meta name="Volantis" content="6.0.3"><meta charset="utf-8"><meta name="robots" content="index,follow,max-image-preview:large"><link rel="canonical" href="https://blog.mhuig.top/notes/Spark/k-means"><meta http-equiv="x-dns-prefetch-control" content="on"><link rel="dns-prefetch" href="https://static.mhuig.top"><link rel="preconnect" href="https://static.mhuig.top" crossorigin=""><meta name="renderer" content="webkit"><meta name="force-rendering" content="webkit"><meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"><meta name="HandheldFriendly" content="True"><meta name="mobile-web-app-capable" content="yes"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=5"><meta content="black-translucent" name="apple-mobile-web-app-status-bar-style"><meta content="telephone=no" name="format-detection"><script>function registerServiceWorker(e){"localhost"!=window.location.hostname&&"serviceWorker"in navigator&&navigator.serviceWorker.register(`${e}`).then((function(e){"localhost"==window.location.hostname&&(e.onupdatefound=function(){var r=e.installing;r.onstatechange=function(){switch(r.state){case"installed":navigator.serviceWorker.controller?console.log("Updated Service Worker."):console.log("Service Worker Sucess!");break;case"redundant":console.log("The installing service worker became redundant.")}}})})).catch((function(e){console.error("Error during service worker registration:",e),"undefined"==typeof swinstallretry&&(swinstallretry=1,registerServiceWorker("/jquery.js"))}))}registerServiceWorker("/jquery.js")</script><link rel="apple-touch-icon" sizes="180x180" href="/lib/favicon/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/lib/favicon/favicon-32x32.png"><link rel="icon" type="image/png" sizes="192x192" href="/lib/favicon/android-chrome-192x192.png"><link rel="icon" type="image/png" sizes="144x144" href="/lib/favicon/android-chrome-144x144.png"><link rel="icon" type="image/png" sizes="16x16" href="/lib/favicon/favicon-16x16.png"><link rel="manifest" href="/lib/favicon/site.webmanifest"><link rel="mask-icon" href="/lib/favicon/safari-pinned-tab.svg" color="#5bbad5"><meta name="apple-mobile-web-app-title" content="MHuiG Magicland"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="application-name" content="MHuiG Magicland"><meta name="msapplication-TileColor" content="#87ceeb"><meta name="msapplication-TileImage" content="/lib/favicon/mstile-144x144.png"><meta name="theme-color" content="#87ceeb" media="(prefers-color-scheme: light)"><meta name="theme-color" content="#21232f" media="(prefers-color-scheme: dark)"><link href="/opensearch.xml" rel="search" title="MHuiG Magicland" type="application/opensearchdescription+xml"><link rel="sitemap" type="application/xml" title="MHuiG Blog Site Map" href="https://blog.mhuig.top/sitemap.xml"><link rel="author" href="https://mhuig.top"><meta name="author" content="MHuiG"><meta name="creator" content="MHuiG"><link rel="archives" href="https://blog.mhuig.top/archives/"><link rel="preload" href="/css/style.css" as="style"><link rel="preload" href="https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/fonts/VarelaRound/VarelaRound-Regular.ttf" as="font" type="font/ttf" crossorigin="anonymous"><link rel="preload" href="https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/fonts/VarelaRound/VarelaRound-Regular.ttf" as="font" type="font/ttf" crossorigin="anonymous"><link rel="alternate" href="/atom.xml" title="Magicland" type="application/atom+xml"><link rel="alternate" href="/rss2.xml" title="Magicland" type="application/rss+xml"><title>Spark-快速大数据分析技术: 基于K均值聚类的网络流量异常检测(pyspark) - Magicland</title><meta name="keywords" content="大数据,Spark, BigData,K均值聚类,网络流量异常检测,PySpark,MHuiG, @MHuiG, Blog, 博客, Magicland, 魔法世界"><meta desc="" name="description" content="基于K均值聚类的网络流量异常检测方法通过PySpark实现,用于识别欺诈、网络攻击及设备故障等新型异常。使用KDD Cup 1999数据集(38个特征),通过迭代计算样本点到中心距离划分聚类,更新中心点至收敛。实验步骤含数据准备、HDFS上传、DataFrame构建及k值选择,评价指标为熵和准确率。 - MHuiG - Magicland"><meta property="og:type" content="website"><meta property="og:title" content="Magicland"><meta property="og:url" content="https://blog.mhuig.top/notes/Spark/k-means"><meta property="og:site_name" content="Magicland"><meta property="og:description" content="基于K均值聚类的网络流量异常检测方法通过PySpark实现,用于识别欺诈、网络攻击及设备故障等新型异常。使用KDD Cup 1999数据集(38个特征),通过迭代计算样本点到中心距离划分聚类,更新中心点至收敛。实验步骤含数据准备、HDFS上传、DataFrame构建及k值选择,评价指标为熵和准确率。"><meta property="og:locale"><meta property="og:image" content="https://blog.mhuig.top/lib/favicon/android-chrome-192x192.png"><meta property="article:published_time" content="2020-08-02T10:23:00.000Z"><meta property="article:modified_time" content="2025-11-20T10:18:00.000Z"><meta property="article:author" content="MHuiG"><meta property="article:tag" content="BigData"><meta property="article:tag" content="K均值聚类"><meta property="article:tag" content="PySpark"><meta property="article:tag" content="网络流量异常检测"><meta name="twitter:card" content="summary"><meta name="twitter:image" content="https://blog.mhuig.top/lib/favicon/android-chrome-192x192.png"><meta name="twitter:creator" content="@iMHuiG"><meta name="twitter:site" content="@iMHuiG"><style>#safearea{display:none}.post-story+.post-story{content-visibility:auto;contain-intrinsic-size:10px 500px}:root{--color-site-body:#87ceeb;--color-site-bg:#87ceeb;--color-site-inner:#555;--color-site-footer:#666;--color-card:#fff;--color-text:#444;--color-block:#f6f6f6;--color-inlinecode:#d56d28;--color-codeblock:#fff7ea;--color-h1:#3a3a3a;--color-h2:#3a3a3a;--color-h3:#333;--color-h4:#444;--color-h5:#555;--color-h6:#666;--color-p:#444;--color-list:#666;--color-list-hl:#1a78c2;--color-meta:#888;--color-read-bkg:#e0d8c8;--color-read-post:#f8f1e2;--color-copyright-bkg:#f5f5f5}*{box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;outline:0;margin:0;padding:0}::-webkit-scrollbar{height:4px;width:4px}::-webkit-scrollbar-track-piece{background:0 0}::-webkit-scrollbar-thumb{background:#2196f3;cursor:pointer;border-radius:2px;-webkit-border-radius:2px}::-webkit-scrollbar-thumb:hover{background:#ff5722}html{color:var(--color-text);width:100%;height:100%;font-family:"Varela Round","PingFang SC","Microsoft YaHei",Helvetica,Arial,Menlo,Monaco,monospace,sans-serif;font-size:16px}html>::-webkit-scrollbar{height:4px;width:4px}html>::-webkit-scrollbar-track-piece{background:0 0}html>::-webkit-scrollbar-thumb{background:#2196f3;cursor:pointer;border-radius:2px;-webkit-border-radius:2px}html>::-webkit-scrollbar-thumb:hover{background:#ff5722}body{background-color:var(--color-site-body);text-rendering:optimizelegibility;-webkit-tap-highlight-color:transparent;line-height:1.6;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body.modal-active{overflow:hidden}@media screen and (max-width:680px){body.modal-active{position:fixed;top:0;right:0;bottom:0;left:0}}a{color:#2196f3;cursor:pointer;text-decoration:none;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}a:hover{color:#ff5722}a:active,a:hover{outline:0}ol,ul{padding-left:0}ol li,ul li{list-style:none}header{display:-webkit-box;display:-moz-box;display:block}img{border:0;background:0 0;max-width:100%}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;height:0;border:0;border-radius:1px;-webkit-border-radius:1px;border-bottom:1px solid rgba(68,68,68,.1)}button,input{color:inherit;font:inherit;margin:0}button{overflow:visible;text-transform:none;-webkit-appearance:button;cursor:pointer}@supports (backdrop-filter:blur(20px)){.blur{background:rgba(255,255,255,.9)!important;backdrop-filter:saturate(200%) blur(20px)}}.shadow{box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}.shadow.floatable{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.shadow.floatable:hover{box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1)}#l_cover{min-height:64px}.cover-wrapper{top:0;left:0;max-width:100%;height:100vh;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-khtml-flex-wrap:nowrap;-moz-flex-wrap:nowrap;-o-flex-wrap:nowrap;-ms-flex-wrap:nowrap;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:center;align-self:center;align-content:center;color:var(--color-site-inner);padding:0 16px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;position:relative;overflow:hidden;margin-bottom:-100px}.cover-wrapper .cover-bg{position:absolute;width:100%;height:100%;background-position:center;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover}.cover-wrapper .cover-bg.lazyload:not(.loaded){opacity:0;-webkit-opacity:0;-moz-opacity:0}.cover-wrapper .cover-bg.lazyload.loaded{animation-delay:0s;animation-duration:.5s;animation-fill-mode:forwards;animation-timing-function:ease-out;animation-name:fadeIn}@-moz-keyframes fadeIn{0%{opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(12px);transform:scale(1.02);-webkit-transform:scale(1.02);-khtml-transform:scale(1.02);-moz-transform:scale(1.02);-o-transform:scale(1.02);-ms-transform:scale(1.02)}100%{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@-webkit-keyframes fadeIn{0%{opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(12px);transform:scale(1.02);-webkit-transform:scale(1.02);-khtml-transform:scale(1.02);-moz-transform:scale(1.02);-o-transform:scale(1.02);-ms-transform:scale(1.02)}100%{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@-o-keyframes fadeIn{0%{opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(12px);transform:scale(1.02);-webkit-transform:scale(1.02);-khtml-transform:scale(1.02);-moz-transform:scale(1.02);-o-transform:scale(1.02);-ms-transform:scale(1.02)}100%{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@keyframes fadeIn{0%{opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(12px);transform:scale(1.02);-webkit-transform:scale(1.02);-khtml-transform:scale(1.02);-moz-transform:scale(1.02);-o-transform:scale(1.02);-ms-transform:scale(1.02)}100%{opacity:1;-webkit-opacity:1;-moz-opacity:1}}.cover-wrapper .cover-body{z-index:1;position:relative;width:100%;height:100%}.cover-wrapper#full{height:calc(100vh + 100px);padding-bottom:100px}.cover-wrapper#half{max-height:640px;min-height:400px;height:calc(36vh - 64px + 200px)}.cover-wrapper #scroll-down{width:100%;height:64px;position:absolute;bottom:100px;text-align:center;cursor:pointer}.cover-wrapper #scroll-down .scroll-down-effects{color:#fff;font-size:24px;line-height:64px;position:absolute;width:24px;left:calc(50% - 12px);text-shadow:0 1px 2px rgba(0,0,0,.1);animation:scroll-down-effect 1.5s infinite;-webkit-animation:scroll-down-effect 1.5s infinite;-khtml-animation:scroll-down-effect 1.5s infinite;-moz-animation:scroll-down-effect 1.5s infinite;-o-animation:scroll-down-effect 1.5s infinite;-ms-animation:scroll-down-effect 1.5s infinite}@-moz-keyframes scroll-down-effect{0%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}50%{top:-16px;opacity:.4;-webkit-opacity:0.4;-moz-opacity:0.4}100%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}}@-webkit-keyframes scroll-down-effect{0%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}50%{top:-16px;opacity:.4;-webkit-opacity:0.4;-moz-opacity:0.4}100%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}}@-o-keyframes scroll-down-effect{0%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}50%{top:-16px;opacity:.4;-webkit-opacity:0.4;-moz-opacity:0.4}100%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}}@keyframes scroll-down-effect{0%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}50%{top:-16px;opacity:.4;-webkit-opacity:0.4;-moz-opacity:0.4}100%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}}.cover-wrapper .cover-body{margin-top:64px;margin-bottom:100px}.cover-wrapper .cover-body,.cover-wrapper .cover-body .bottom,.cover-wrapper .cover-body .top{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:center;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;max-width:100%}.cover-wrapper .cover-body .bottom{margin-top:32px}.cover-wrapper .cover-body .title{font-family:"Varela Round","PingFang SC","Microsoft YaHei",Helvetica,Arial,Helvetica,monospace;font-size:3.125rem;line-height:1.2;text-shadow:0 1px 2px rgba(0,0,0,.1)}.cover-wrapper .cover-body .subtitle{font-size:20px}.cover-wrapper .cover-body .logo{max-height:120px;max-width:calc(100% - 4 * 16px)}@media screen and (min-height:1024px){.cover-wrapper .cover-body .title{font-size:3rem}.cover-wrapper .cover-body .subtitle{font-size:1.05rem}.cover-wrapper .cover-body .logo{max-height:150px}}.cover-wrapper .cover-body .m_search{position:relative;max-width:calc(100% - 16px);width:320px;vertical-align:middle}.cover-wrapper .cover-body .m_search .form{position:relative;display:-webkit-box;display:-moz-box;display:block;width:100%}.cover-wrapper .cover-body .m_search .icon,.cover-wrapper .cover-body .m_search .input{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.cover-wrapper .cover-body .m_search .icon{position:absolute;display:-webkit-box;display:-moz-box;display:block;line-height:2.5rem;width:32px;top:0;left:5px;color:rgba(68,68,68,.75)}.cover-wrapper .cover-body .m_search .input{display:-webkit-box;display:-moz-box;display:block;height:2.5rem;width:100%;box-shadow:none;-webkit-box-shadow:none;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;font-size:.875rem;-webkit-appearance:none;padding-left:36px;border-radius:1.4rem;-webkit-border-radius:1.4rem;background:rgba(255,255,255,.6);backdrop-filter:blur(10px);border:none;color:var(--color-text)}@media screen and (max-width:500px){.cover-wrapper .cover-body .m_search .input{padding-left:36px}}.cover-wrapper .cover-body .m_search .input:hover{background:rgba(255,255,255,.8)}.cover-wrapper .cover-body .m_search .input:focus{background:#fff}.cover-wrapper .list-h{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;align-items:stretch;border-radius:4px;-webkit-border-radius:4px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.cover-wrapper .list-h a{-webkit-box-flex:1;-moz-box-flex:1;-webkit-flex:1 0;-ms-flex:1 0;flex:1 0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;font-weight:600}.cover-wrapper .list-h a img{display:-webkit-box;display:-moz-box;display:block;border-radius:2px;-webkit-border-radius:2px;margin:4px;min-width:40px;max-width:44px}@media screen and (max-width:768px){.cover-wrapper .list-h a img{min-width:36px;max-width:40px}}@media screen and (max-width:500px){.cover-wrapper .list-h a img{margin:2px 4px;min-width:32px;max-width:36px}}@media screen and (max-width:375px){.cover-wrapper .list-h a img{min-width:28px;max-width:32px}}.cover-wrapper{max-width:100%}.cover-wrapper.search .bottom .menu{margin-top:16px}.cover-wrapper.search .bottom .menu .list-h a{white-space:nowrap;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;align-items:baseline;padding:2px;margin:4px;color:var(--color-site-inner);opacity:.75;-webkit-opacity:0.75;-moz-opacity:0.75;text-shadow:0 1px 2px rgba(0,0,0,.05);border-bottom:2px solid transparent}.cover-wrapper.search .bottom .menu .list-h a i{margin-right:4px}.cover-wrapper.search .bottom .menu .list-h a p{font-size:.9375rem}.cover-wrapper.search .bottom .menu .list-h a.active,.cover-wrapper.search .bottom .menu .list-h a:active,.cover-wrapper.search .bottom .menu .list-h a:hover{opacity:1;-webkit-opacity:1;-moz-opacity:1;border-bottom:2px solid var(--color-site-inner)}.cover-wrapper.dock .menu,.cover-wrapper.featured .menu,.cover-wrapper.focus .menu{border-radius:6px;-webkit-border-radius:6px}.cover-wrapper.dock .menu .list-h a,.cover-wrapper.featured .menu .list-h a,.cover-wrapper.focus .menu .list-h a{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:center;padding:12px;line-height:24px;border-radius:4px;-webkit-border-radius:4px;border-bottom:none;text-align:center;align-content:flex-end;color:rgba(68,68,68,.7);font-size:1.5rem}@media screen and (max-width:500px){.cover-wrapper.dock .menu .list-h a,.cover-wrapper.featured .menu .list-h a,.cover-wrapper.focus .menu .list-h a{padding:12px 8px}}.cover-wrapper.dock .menu .list-h a i,.cover-wrapper.featured .menu .list-h a i,.cover-wrapper.focus .menu .list-h a i{margin:8px}.cover-wrapper.dock .menu .list-h a p,.cover-wrapper.featured .menu .list-h a p,.cover-wrapper.focus .menu .list-h a p{font-size:.875rem}.cover-wrapper.dock .menu .list-h a.active,.cover-wrapper.featured .menu .list-h a.active,.cover-wrapper.focus .menu .list-h a.active{background:var(--color-card);backdrop-filter:none}.cover-wrapper.dock .menu .list-h a.active i,.cover-wrapper.dock .menu .list-h a.active i+p,.cover-wrapper.featured .menu .list-h a.active i,.cover-wrapper.featured .menu .list-h a.active i+p,.cover-wrapper.focus .menu .list-h a.active i,.cover-wrapper.focus .menu .list-h a.active i+p{color:#2196f3}.cover-wrapper.dock .menu .list-h a.active img+p,.cover-wrapper.featured .menu .list-h a.active img+p,.cover-wrapper.focus .menu .list-h a.active img+p{color:var(--color-text)}.cover-wrapper.dock .menu .list-h a:hover,.cover-wrapper.featured .menu .list-h a:hover,.cover-wrapper.focus .menu .list-h a:hover{background:var(--color-card)}.cover-wrapper.featured .menu .list-h{margin:-2px}.cover-wrapper.featured .menu .list-h a{margin:2px;background:rgba(255,255,255,.5)}@supports (backdrop-filter:blur(20px)){.cover-wrapper.featured .menu .list-h a{background:rgba(255,255,255,.5);backdrop-filter:saturate(200%) blur(20px)}}@media (prefers-color-scheme:dark){:root{--color-mode:'dark'}:root:not([color-scheme]){--color-site-body:#121212;--color-read-bkg:#21232f;--color-read-post:#252d38;--color-site-bg:#21232f;--color-site-inner:#efefef;--color-site-footer:#666;--color-card:#252d38;--color-text:rgba(238,238,238,0.871);--color-block:rgba(68,68,68,0.65);--color-codeblock:#444;--color-inlinecode:#d56d28;--color-h1:rgba(255,255,255,0.871);--color-h2:rgba(255,255,255,0.871);--color-h3:rgba(255,255,255,0.6);--color-h4:rgba(255,255,255,0.6);--color-h5:rgba(255,255,255,0.6);--color-h6:rgba(255,255,255,0.6);--color-p:rgba(217,217,217,0.871);--color-list:rgba(217,217,217,0.871);--color-list-hl:#4dabf5;--color-meta:rgba(191,191,191,0.871);--color-link:rgba(191,191,191,0.871);--color-copyright-bkg:#21252b}:root:not([color-scheme]) img{filter:brightness(70%)!important}:root:not([color-scheme]) .blur{background:rgba(33,35,47,.9)!important}:root:not([color-scheme]) .white-box.blur{background:rgba(37,45,56,.9)!important}:root:not([color-scheme]) .nav-main .u-search-input{background:var(--color-card)!important}:root:not([color-scheme]) #l_main .article .prev-next>a{background:var(--color-block)!important}:root:not([color-scheme]) #l_main .article .prev-next>a:hover{background:var(--color-site-bg)!important}:root:not([color-scheme]) .article blockquote{background:var(--color-block)!important}:root:not([color-scheme]) .article-title a{color:var(--color-h1)!important}:root:not([color-scheme]) details>summary{color:var(--color-p)!important;background:var(--color-site-bg)!important}:root:not([color-scheme]) details{border:1px solid var(--color-site-bg)!important;background:var(--color-site-bg)!important}:root:not([color-scheme]) #u-search .modal,:root:not([color-scheme]) #u-search .modal-body,:root:not([color-scheme]) #u-search .modal-header{background:var(--color-card)!important}:root:not([color-scheme]) #u-search .modal-body .modal-results .result:hover{background:var(--color-block)!important}:root:not([color-scheme]) .u-search-input:hover{background:var(--color-block)!important}:root:not([color-scheme]) .u-search-input:focus{background:var(--color-site-body)!important}}[color-scheme=dark]{--color-site-body:#121212;--color-read-bkg:#21232f;--color-read-post:#252d38;--color-site-bg:#21232f;--color-site-inner:#efefef;--color-site-footer:#666;--color-card:#252d38;--color-text:rgba(238,238,238,0.871);--color-block:rgba(68,68,68,0.65);--color-codeblock:#444;--color-inlinecode:#d56d28;--color-h1:rgba(255,255,255,0.871);--color-h2:rgba(255,255,255,0.871);--color-h3:rgba(255,255,255,0.6);--color-h4:rgba(255,255,255,0.6);--color-h5:rgba(255,255,255,0.6);--color-h6:rgba(255,255,255,0.6);--color-p:rgba(217,217,217,0.871);--color-list:rgba(217,217,217,0.871);--color-list-hl:#4dabf5;--color-meta:rgba(191,191,191,0.871);--color-link:rgba(191,191,191,0.871);--color-copyright-bkg:#21252b}[color-scheme=dark] img{filter:brightness(70%)!important}[color-scheme=dark] .blur{background:rgba(33,35,47,.9)!important}[color-scheme=dark] .white-box.blur{background:rgba(37,45,56,.9)!important}[color-scheme=dark] .nav-main .u-search-input{background:var(--color-card)!important}[color-scheme=dark] #l_main .article .prev-next>a{background:var(--color-block)!important}[color-scheme=dark] #l_main .article .prev-next>a:hover{background:var(--color-site-bg)!important}[color-scheme=dark] .article blockquote{background:var(--color-block)!important}[color-scheme=dark] .article-title a{color:var(--color-h1)!important}[color-scheme=dark] details>summary{color:var(--color-p)!important;background:var(--color-site-bg)!important}[color-scheme=dark] details{border:1px solid var(--color-site-bg)!important;background:var(--color-site-bg)!important}[color-scheme=dark] #u-search .modal,[color-scheme=dark] #u-search .modal-body,[color-scheme=dark] #u-search .modal-header{background:var(--color-card)!important}[color-scheme=dark] #u-search .modal-body .modal-results .result:hover{background:var(--color-block)!important}[color-scheme=dark] .u-search-input:hover{background:var(--color-block)!important}[color-scheme=dark] .u-search-input:focus{background:var(--color-site-body)!important}@media screen and (max-width:500px){[color-scheme=dark] .l_header .m_search{background:var(--color-site-bg)!important}}@font-face{font-family:'Varela Round';src:url("https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/fonts/VarelaRound/VarelaRound-Regular.ttf");font-weight:'normal';font-style:'normal';font-display:swap}@font-face{font-family:'Varela Round';src:url("https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/fonts/VarelaRound/VarelaRound-Regular.ttf");font-weight:'normal';font-style:'normal';font-display:swap}.l_header{position:fixed;z-index:1000;top:0;width:100%;height:64px;background:var(--color-card);box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}.l_header.auto{transition:opacity .4s ease;-webkit-transition:opacity .4s ease;-khtml-transition:opacity 0.4s ease;-moz-transition:opacity .4s ease;-o-transition:opacity .4s ease;-ms-transition:opacity .4s ease;visibility:hidden}.l_header.auto.show{opacity:1!important;-webkit-opacity:1!important;-moz-opacity:1!important;visibility:visible}.l_header .container{margin-left:16px;margin-right:16px}.l_header #wrapper{height:100%;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.l_header #wrapper .nav-main,.l_header #wrapper .nav-sub{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-khtml-flex-wrap:nowrap;-moz-flex-wrap:nowrap;-o-flex-wrap:nowrap;-ms-flex-wrap:nowrap;justify-content:space-between;-webkit-justify-content:space-between;-khtml-justify-content:space-between;-moz-justify-content:space-between;-o-justify-content:space-between;-ms-justify-content:space-between;align-items:center}.l_header #wrapper .nav-main{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.l_header #wrapper.sub .nav-main{transform:translateY(-64px);-webkit-transform:translateY(-64px);-khtml-transform:translateY(-64px);-moz-transform:translateY(-64px);-o-transform:translateY(-64px);-ms-transform:translateY(-64px)}.l_header #wrapper .nav-sub{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;opacity:0;-webkit-opacity:0;-moz-opacity:0;height:64px;width:calc(100% - 2 * 16px);position:absolute}.l_header #wrapper .nav-sub ::-webkit-scrollbar{display:-webkit-box;display:-moz-box;display:none}@media screen and (min-width:2048px){.l_header #wrapper .nav-sub{max-width:55vw;margin:auto}}.l_header #wrapper.sub .nav-sub{opacity:1;-webkit-opacity:1;-moz-opacity:1}.l_header #wrapper .title{position:relative;color:var(--color-text);padding-left:24px;max-height:64px}.l_header #wrapper .nav-main .title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0;line-height:64px;padding:0 24px;font-size:1.25rem;font-family:"Varela Round","PingFang SC","Microsoft YaHei",Helvetica,Arial,Helvetica,monospace}.l_header #wrapper .nav-main .title img{height:64px}.l_header .nav-sub{max-width:1080px;margin:auto}.l_header .nav-sub .title{font-weight:700;font-family:"Varela Round","PingFang SC","Microsoft YaHei",Helvetica,Arial,Menlo,Monaco,monospace,sans-serif;line-height:1.2;max-height:64px;white-space:normal;flex-shrink:1}.l_header .switcher{display:-webkit-box;display:-moz-box;display:none;line-height:64px;align-items:center}.l_header .switcher .s-toc{display:-webkit-box;display:-moz-box;display:none}@media screen and (max-width:768px){.l_header .switcher .s-toc{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex}}.l_header .switcher>li{height:48px;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;margin:2px}@media screen and (max-width:500px){.l_header .switcher>li{margin:0 1px;height:48px}}.l_header .switcher>li>a{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;align-items:center;width:48px;height:48px;padding:.85em 1.1em;border-radius:100px;-webkit-border-radius:100px;border:none;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;color:#2196f3}.l_header .switcher>li>a:hover{border:none}.l_header .switcher>li>a.active,.l_header .switcher>li>a:active{border:none;background:var(--color-site-bg)}@media screen and (max-width:500px){.l_header .switcher>li>a{width:36px;height:48px}}.l_header .nav-sub .switcher{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex}.l_header .m_search{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;height:64px;width:240px;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}@media screen and (max-width:1024px){.l_header .m_search{width:44px;min-width:44px}.l_header .m_search input::placeholder{opacity:0;-webkit-opacity:0;-moz-opacity:0}.l_header .m_search:hover{width:240px}.l_header .m_search:hover input::placeholder{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@media screen and (min-width:500px){.l_header .m_search:hover .input{width:100%}.l_header .m_search:hover .input::placeholder{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@media screen and (max-width:500px){.l_header .m_search{min-width:0}.l_header .m_search input::placeholder{opacity:1;-webkit-opacity:1;-moz-opacity:1}}.l_header .m_search .form{position:relative;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;width:100%;align-items:center}.l_header .m_search .icon{position:absolute;width:36px;left:5px;color:var(--color-meta)}@media screen and (max-width:500px){.l_header .m_search .icon{display:-webkit-box;display:-moz-box;display:none}}.l_header .m_search .input{display:-webkit-box;display:-moz-box;display:block;padding-top:8px;padding-bottom:8px;line-height:1.3;width:100%;color:var(--color-text);background:#fafafa;box-shadow:none;-webkit-box-shadow:none;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;padding-left:40px;font-size:.875rem;border-radius:8px;-webkit-border-radius:8px;border:none;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}@media screen and (min-width:500px){.l_header .m_search .input:focus{box-shadow:0 4px 8px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.1)}}@media screen and (max-width:500px){.l_header .m_search .input{background:var(--color-block);padding-left:8px;border:none}.l_header .m_search .input:focus,.l_header .m_search .input:hover{border:none}}@media (max-width:500px){.l_header .m_search{left:0;width:0;overflow:hidden;position:absolute;background:#fff;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.l_header .m_search .input{border-radius:32px;-webkit-border-radius:32px;margin-left:16px;padding-left:16px}.l_header.z_search-open .m_search{width:100%}.l_header.z_search-open .m_search .input{width:calc(100% - 120px)}}ul.m-pc>li>a{color:inherit;border-bottom:2px solid transparent}ul.m-pc>li>a.active,ul.m-pc>li>a:active{border-bottom:2px solid #2196f3}ul.list-v li:hover>ul.list-v,ul.m-pc li:hover>ul.list-v{display:-webkit-box;display:-moz-box;display:block}ul.nav-list-h{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;align-items:stretch}ul.nav-list-h>li{position:relative;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;height:100%;line-height:2.4;border-radius:4px;-webkit-border-radius:4px}ul.nav-list-h>li>a{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-weight:600}ul.list-v{z-index:1;display:-webkit-box;display:-moz-box;display:none;position:absolute;background:var(--color-card);box-shadow:0 2px 4px 0 rgba(0,0,0,.08),0 4px 8px 0 rgba(0,0,0,.08),0 8px 16px 0 rgba(0,0,0,.08);-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.08),0 4px 8px 0 rgba(0,0,0,.08),0 8px 16px 0 rgba(0,0,0,.08);margin-top:-6px;border-radius:4px;-webkit-border-radius:4px;padding:8px 0}ul.list-v.show{display:-webkit-box;display:-moz-box;display:block}ul.list-v hr{margin-top:8px;margin-bottom:8px}ul.list-v>li{white-space:nowrap;word-break:keep-all}ul.list-v>li.header{font-size:.78125rem;font-weight:700;line-height:2em;color:var(--color-meta);margin:8px 16px 4px}ul.list-v>li.header i{margin-right:8px}ul.list-v>li ul{margin-left:0;display:-webkit-box;display:-moz-box;display:none;margin-top:-40px}ul.list-v .aplayer-container{min-height:64px;padding:6px 16px}ul.list-v>li>a{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;display:-webkit-box;display:-moz-box;display:block;color:var(--color-list);font-size:.875rem;font-weight:700;line-height:36px;padding:0 20px 0 16px;text-overflow:ellipsis;margin:0 4px;border-radius:4px;-webkit-border-radius:4px}@media screen and (max-width:1024px){ul.list-v>li>a{line-height:40px}}ul.list-v>li>a>i{margin-right:8px}ul.list-v>li>a.active,ul.list-v>li>a:active{color:var(--color-list-hl)}ul.list-v>li>a:hover{color:var(--color-list-hl);background:var(--color-site-bg)}.l_header .menu>ul>li>a{display:-webkit-box;display:-moz-box;display:block;padding:0 8px}.l_header .menu>ul>li>a>i{margin-right:4px}.l_header ul.nav-list-h>li{color:var(--color-list);line-height:64px}.l_header ul.nav-list-h>li>a{max-height:64px;overflow:hidden;color:inherit}.l_header ul.nav-list-h>li>a.active,.l_header ul.nav-list-h>li>a:active{color:#2196f3}.l_header ul.nav-list-h>li:hover>a{color:var(--color-list-hl)}.l_header ul.nav-list-h>li i.music{animation:rotate-effect 1.5s linear infinite;-webkit-animation:rotate-effect 1.5s linear infinite;-khtml-animation:rotate-effect 1.5s linear infinite;-moz-animation:rotate-effect 1.5s linear infinite;-o-animation:rotate-effect 1.5s linear infinite;-ms-animation:rotate-effect 1.5s linear infinite}@-moz-keyframes rotate-effect{0%{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}25%{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}50%{transform:rotate(180deg);-webkit-transform:rotate(180deg);-khtml-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg)}75%{transform:rotate(270deg);-webkit-transform:rotate(270deg);-khtml-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}@-webkit-keyframes rotate-effect{0%{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}25%{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}50%{transform:rotate(180deg);-webkit-transform:rotate(180deg);-khtml-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg)}75%{transform:rotate(270deg);-webkit-transform:rotate(270deg);-khtml-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}@-o-keyframes rotate-effect{0%{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}25%{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}50%{transform:rotate(180deg);-webkit-transform:rotate(180deg);-khtml-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg)}75%{transform:rotate(270deg);-webkit-transform:rotate(270deg);-khtml-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}@keyframes rotate-effect{0%{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}25%{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}50%{transform:rotate(180deg);-webkit-transform:rotate(180deg);-khtml-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg)}75%{transform:rotate(270deg);-webkit-transform:rotate(270deg);-khtml-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}.menu-phone li ul.list-v{right:calc(100% - .5 * 16px)}.menu-phone li ul.list-v ul{right:calc(100% - .5 * 16px)}#wrapper{max-width:1080px;margin:auto}@media screen and (min-width:2048px){#wrapper{max-width:55vw}}#wrapper .menu{-webkit-box-flex:1;-moz-box-flex:1;-webkit-flex:1 1;-ms-flex:1 1;flex:1 1;margin:0 16px 0 0}#wrapper .menu .list-v ul{left:calc(100% - .5 * 16px)}.menu-phone{display:-webkit-box;display:-moz-box;display:none;margin-top:16px;right:8px;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.menu-phone ul{right:calc(100% - .5 * 16px)}@media screen and (max-width:500px){.menu-phone{display:-webkit-box;display:-moz-box;display:block}}.l_header{max-width:65vw;left:calc((100% - 65vw) * .5);border-bottom-left-radius:8px;border-bottom-right-radius:8px}@media screen and (max-width:2048px){.l_header{max-width:1112px;left:calc((100% - 1112px) * .5)}}@media screen and (max-width:1112px){.l_header{left:0;border-radius:0;-webkit-border-radius:0;max-width:100%}}@media screen and (max-width:500px){.l_header .container{margin-left:0;margin-right:0}.l_header #wrapper .nav-main .title{padding-left:16px;padding-right:16px}.l_header #wrapper .nav-sub{width:100%}.l_header #wrapper .nav-sub .title{overflow-y:scroll;margin-top:2px;padding:8px 16px}.l_header #wrapper .switcher{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;margin-right:8px}.l_header .menu{display:-webkit-box;display:-moz-box;display:none}}@media screen and (max-width:500px){.list-v li{max-width:270px}}#u-search{display:-webkit-box;display:-moz-box;display:none;position:fixed;top:0;left:0;width:100%;height:100%;padding:60px 20px;z-index:1001}@media screen and (max-width:680px){#u-search{padding:0}}@media screen and (prefers-color-scheme:dark) and (max-width:500px){.l_header .m_search{background:var(--color-site-bg)!important}}.cover-wrapper .cover-body .subtitle{font-size:.875rem}.fa-brands.color-github,.fa-duotone.color-github,.fa-light.color-github,.fa-regular.color-github,.fa-solid.color-github,.fa-thin.color-github,.fa.color-github,.fad.color-github,.fal.color-github,.far.color-github,.fas.color-github,.iziToast>.iziToast-body .iziToast-icon.color-github{color:#000}.fa-brands.color-friends,.fa-duotone.color-friends,.fa-light.color-friends,.fa-regular.color-friends,.fa-solid.color-friends,.fa-thin.color-friends,.fa.color-friends,.fad.color-friends,.fal.color-friends,.far.color-friends,.fas.color-friends,.iziToast>.iziToast-body .iziToast-icon.color-friends{color:#d31ee9}.fa-brands.color-about,.fa-duotone.color-about,.fa-light.color-about,.fa-regular.color-about,.fa-solid.color-about,.fa-thin.color-about,.fa.color-about,.fad.color-about,.fal.color-about,.far.color-about,.fas.color-about,.iziToast>.iziToast-body .iziToast-icon.color-about{color:#0095ff}.fa-brands.color-travellings,.fa-duotone.color-travellings,.fa-light.color-travellings,.fa-regular.color-travellings,.fa-solid.color-travellings,.fa-thin.color-travellings,.fa.color-travellings,.fad.color-travellings,.fal.color-travellings,.far.color-travellings,.fas.color-travellings,.iziToast>.iziToast-body .iziToast-icon.color-travellings{color:#734ae6}mjx-container{padding:0 0!important}mjx-container:not([display=true]){padding:4px 2px 4px 6px!important}mjx-container[jax=SVG]{direction:ltr}mjx-container[jax=SVG]>svg{overflow:visible}mjx-container[jax=SVG][display=true]{display:-webkit-box;display:-moz-box;display:block;text-align:center;margin:1em 0}mjx-container[jax=SVG][justify=left]{text-align:left}mjx-container[jax=SVG][justify=right]{text-align:right}g[data-mml-node=merror]>g{fill:#f00;stroke:#f00}g[data-mml-node=merror]>rect[data-background]{fill:#ff0;stroke:none}g[data-mml-node=mtable]>line[data-line]{stroke-width:70px;fill:none}g[data-mml-node=mtable]>rect[data-frame]{stroke-width:70px;fill:none}g[data-mml-node=mtable]>.mjx-dashed{stroke-dasharray:140}g[data-mml-node=mtable]>.mjx-dotted{stroke-linecap:round;stroke-dasharray:0,140}g[data-mml-node=mtable]>svg{overflow:visible}[jax=SVG] mjx-tool{display:-webkit-box;display:-moz-box;display:inline-block;position:relative;width:0;height:0}[jax=SVG] mjx-tool>mjx-tip{position:absolute;top:0;left:0}mjx-tool>mjx-tip{display:-webkit-box;display:-moz-box;display:inline-block;padding:.2em;border:1px solid #888;font-size:70%;background-color:#f8f8f8;color:#000;box-shadow:2px 2px 5px #aaa;-webkit-box-shadow:2px 2px 5px #aaa}g[data-mml-node=maction][data-toggle]{cursor:pointer}mjx-status{display:-webkit-box;display:-moz-box;display:block;position:fixed;left:1em;bottom:1em;min-width:25%;padding:.2em .4em;border:1px solid #888;font-size:90%;background-color:#f8f8f8;color:#000}foreignObject[data-mjx-xml]{font-family:initial;line-height:normal;overflow:visible}.MathJax path{stroke-width:3}mjx-container[display=true]{overflow:auto hidden}mjx-container[display=true]+br{display:-webkit-box;display:-moz-box;display:none}</style><link rel="stylesheet" href="/css/style.css" media="print" onload='this.media="all",this.onload=null'><noscript><link rel="stylesheet" href="/css/style.css"></noscript><script>let userColorScheme=localStorage.getItem("color-scheme");userColorScheme&&document.documentElement.setAttribute("color-scheme",userColorScheme)</script><script>window.MSInputMethodContext&&document.documentMode&&document.write('<style>html{overflow-x: hidden !important;overflow-y: hidden !important;}.kill-ie{text-align:center;height: 100%;margin-top: 15%;margin-bottom: 5500%;}.kill-t{font-size: 2rem;}.kill-c{font-size: 1.2rem;}#l_header,#l_body{display: none;}</style><div class="kill-ie"><span class="kill-t"><b>抱歉,您的浏览器无法访问本站</b></span><br/><span class="kill-c">微软已经于2016年终止了对 Internet Explorer (IE) 10 及更早版本的支持,<br/>继续使用存在极大的安全隐患,请使用当代主流的浏览器进行访问。</span><br/><a target="_blank" rel="noopener" href="https://blogs.windows.com/windowsexperience/2021/05/19/the-future-of-internet-explorer-on-windows-10-is-in-microsoft-edge/"><strong>了解详情 ></strong></a></div>')</script><noscript><style>html{overflow-x:hidden!important;overflow-y:hidden!important}.kill-noscript{text-align:center;height:100%;margin-top:15%;margin-bottom:5500%}.kill-t{font-size:2rem}.kill-c{font-size:1.2rem}#l_body,#l_header{display:none}</style><div class="kill-noscript"> <span class="kill-t"><b>抱歉,您的浏览器无法访问本站</b></span><br> <span class="kill-c">本页面需要浏览器支持(启用)JavaScript</span><br> <a target="_blank" rel="external nofollow noopener noreferrer" href="https://www.baidu.com/s?wd=启用JavaScript"><strong>了解详情 ></strong></a></div></noscript><script>function volantisEventListener(e,t,n){this.type=e,this.f=t,this.ele=n}function volantisDom(e){return e||(e=document.createElement("div")),this.ele=e,this.ele.find=e=>{let t=this.ele.querySelector(e);if(t)return new volantisDom(t)},this.ele.hasClass=e=>this.ele.className.match(new RegExp("(\\s|^)"+e+"(\\s|$)")),this.ele.addClass=e=>(this.ele.classList.add(e),this.ele),this.ele.removeClass=e=>(this.ele.classList.remove(e),this.ele),this.ele.toggleClass=e=>(this.ele.hasClass(e)?this.ele.removeClass(e):this.ele.addClass(e),this.ele),this.ele.on=(e,t,n=1)=>(this.ele.addEventListener(e,t,!1),n&&volantis.EventListener.list.push(new volantisEventListener(e,t,this.ele)),this.ele),this.ele.click=(e,t)=>(this.ele.on("click",e,t),this.ele),this.ele.scroll=(e,t)=>(this.ele.on("scroll",e,t),this.ele),this.ele.html=e=>(this.ele.innerHTML=e,this.ele),this.ele.hide=e=>(this.ele.style.display="none",this.ele),this.ele.show=e=>(this.ele.style.display="block",this.ele),this.ele}function RunItem(){function e(e,t){this.name=t||volantis.getFunctionHash(e),this.run=()=>{try{e()}catch(e){console.log(e)}}}this.list=[],this.start=()=>{for(var e=0;e<this.list.length;e++)this.list[e].run()},this.push=(t,n,o=!0)=>{if("function"!=typeof t)return;let l=t;o&&(l=()=>{volantis.requestAnimationFrame(t)}),n=n||volantis.getFunctionHash(t);const i=this.list.findIndex((e=>e.name===n));-1===i?this.list.push(new e(l,n)):this.list[i]=new e(l,n)},this.remove=e=>{for(let t=0;t<this.list.length;t++){this.list[t].name==e&&this.list.splice(t,1)}}}function errorImgAvatar(e){e.src="https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/placeholder/avatar/round/3442075.svg",e.onerror=null}function errorImgCover(e){e.src="https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/placeholder/cover/76b86c0226ffd.svg",e.onerror=null}!function(){const e=new WeakMap,t=new Proxy({},{get(n,o){const l=e.get(t);return l?.[o]},set(n,o,l){e.has(t)||e.set(t,Object.create(null));return e.get(t)[o]=l,!0},deleteProperty(n,o){const l=e.get(t);return!(!l||!Object.prototype.hasOwnProperty.call(l,o))&&(delete l[o],0===Object.keys(l).length&&e.delete(t),!0)},ownKeys(n){const o=e.get(t);return o?Object.keys(o):[]},getOwnPropertyDescriptor(n,o){const l=e.get(t);if(l&&Object.prototype.hasOwnProperty.call(l,o))return{value:l[o],writable:!0,enumerable:!0,configurable:!0}}});Object.defineProperty(window,"volantis",{value:t,writable:!0,configurable:!0,enumerable:!0})}(),volantis.debug="false",volantis.dom={},volantis.simpleTextHash=e=>{let t=5381;for(let n=0;n<e.length;n++)t=(t<<5)+t+e.charCodeAt(n),t&=t;return t.toString(16).padStart(8,"0")},volantis.getFunctionHash=e=>{const t=e.toString();return volantis.simpleTextHash(t)},volantis.EventListener={},volantis.EventListener.list=[],volantis.EventListener.remove=()=>{volantis.EventListener.list.forEach((function(e){e.ele.removeEventListener(e.type,e.f,!1)})),volantis.EventListener.list=[]},volantis.dom.$=e=>e?new volantisDom(e):null,volantis.pjax={},volantis.pjax.method={complete:new RunItem,error:new RunItem,send:new RunItem},volantis.pjax=Object.assign(volantis.pjax,{push:volantis.pjax.method.complete.push,error:volantis.pjax.method.error.push,send:volantis.pjax.method.send.push}),volantis.rightmenu={},volantis.rightmenu.method={handle:new RunItem},volantis.rightmenu=Object.assign(volantis.rightmenu,{handle:volantis.rightmenu.method.handle.push}),volantis.dark={},volantis.dark.method={toggle:new RunItem},volantis.dark=Object.assign(volantis.dark,{push:volantis.dark.method.toggle.push}),volantis.js=(e,t)=>new Promise((n=>{setTimeout((function(){var o=document.getElementsByTagName("head")[0]||document.documentElement,l=document.createElement("script");if(l.setAttribute("type","text/javascript"),t)if(JSON.stringify(t))for(let e in t)"onload"==e?l[e]=()=>{t[e](),n()}:(l[e]=t[e],l.onload=n);else l.onload=()=>{t(),n()};else l.onload=n;l.setAttribute("src",e),o.appendChild(l)}))})),volantis.css=e=>new Promise((t=>{setTimeout((function(){var n=document.createElement("link");n.rel="stylesheet",n.href=e,n.onload=t,document.getElementsByTagName("head")[0].appendChild(n)}))})),volantis.import={jQuery:()=>"undefined"==typeof jQuery?volantis.js("https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"):new Promise((e=>{e()}))},volantis.throttle=(e,t=200)=>{let n=0;return function(...o){const l=Date.now();l-n>=t&&(e.apply(this,o),n=l)}},volantis.debounce=(e,t=200)=>{let n=null;return function(){n&&clearTimeout(n),n=setTimeout((()=>{e.apply(this,arguments),n=null}),t)}},volantis.requestAnimationFrame=e=>(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||function(e){return window.setTimeout(e,1e3/60)}),window.requestAnimationFrame(e)),volantis.layoutHelper=(e,t,n)=>{function o(e,t,n){volantis.tempDiv=document.createElement("div"),volantis.tempDiv.innerHTML=t;let o=document.querySelector("#layoutHelper-"+e);o&&(n&&(o.innerHTML=""),o.append(volantis.tempDiv))}n=Object.assign({clean:!1,pjax:!0},n),o(e,t,n.clean),n.pjax&&volantis.pjax.push((()=>{o(e,t,n.clean)}),"layoutHelper-"+e)},volantis.scroll={engine:new RunItem,unengine:new RunItem},volantis.scroll=Object.assign(volantis.scroll,{push:volantis.scroll.engine.push}),volantis.scroll.getScrollTop=()=>{let e;return window.pageYOffset?e=window.pageYOffset:document.compatMode&&"BackCompat"!=document.compatMode?e=document.documentElement.scrollTop:document.body&&(e=document.body.scrollTop),e},volantis.scroll.scrollHeight=function(){return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},volantis.scroll.offsetHeight=function(){return Math.min(document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},volantis.scroll.progress=function(){return volantis.scroll.getScrollTop()/(volantis.scroll.scrollHeight()-volantis.scroll.offsetHeight())},volantis.scroll.handleScrollEvents=()=>{volantis.scroll.lastScrollTop=volantis.scroll.getScrollTop(),volantis.requestAnimationFrame((function e(){const t=volantis.scroll.getScrollTop();volantis.scroll.lastScrollTop!==t?(volantis.scroll.del=t-volantis.scroll.lastScrollTop,volantis.scroll.lastScrollTop=t,volantis.scroll.unengine.list=[],volantis.scroll.engine.start()):volantis.scroll.unengine.start(),volantis.requestAnimationFrame(e)}))},volantis.scroll.handleScrollEvents(),volantis.scroll.ele=null,volantis.scroll.to=(e,t={})=>{e&&(volantis.scroll.ele=e,opt={top:e.getBoundingClientRect().top+document.documentElement.scrollTop,behavior:"smooth"},"top"in t&&(opt.top=t.top),"behavior"in t&&(opt.behavior=t.behavior),"addTop"in t&&(opt.top+=t.addTop),"observerDic"in t||(t.observerDic=100),window.scrollTo(opt),t.observer&&setTimeout((()=>{volantis.scroll.ele==e&&volantis.scroll.unengine.push((()=>{let n=e.getBoundingClientRect().top;n>=-t.observerDic&&n<=t.observerDic||volantis.scroll.to(e,t),volantis.scroll.unengine.remove("unengineObserver")}),"unengineObserver")}),1e3))},volantis.cleanContentVisibility=()=>{document.querySelector(".post-story")&&(console.log("cleanContentVisibility"),document.querySelectorAll(".post-story").forEach((e=>{e.classList.remove("post-story")})))};const nativeSetTimeout=window.setTimeout,nativeSetInterval=window.setInterval,nativeClearTimeout=window.clearTimeout,nativeClearInterval=window.clearInterval;volantis.activeTimeout=[],volantis.activeInterval=[],window.setTimeout=function(e,t,...n){const o=nativeSetTimeout((function(...t){try{return e.apply(this,t)}finally{const e=volantis.activeTimeout.indexOf(o);-1!==e&&volantis.activeTimeout.splice(e,1)}}),t,...n);return volantis.activeTimeout.push(o),o},window.setInterval=function(e,t,...n){const o=nativeSetInterval(e,t,...n);return volantis.activeInterval.push(o),o},window.clearTimeout=function(e){nativeClearTimeout(e);const t=volantis.activeTimeout.indexOf(e);-1!==t&&volantis.activeTimeout.splice(t,1)},window.clearInterval=function(e){nativeClearInterval(e);const t=volantis.activeInterval.indexOf(e);-1!==t&&volantis.activeInterval.splice(t,1)},volantis.getActiveInterval=function(){return[...volantis.activeInterval]},volantis.getActiveTimeout=function(){return[...volantis.activeTimeout]},volantis.clearAllTimers=function(){volantis.getActiveInterval().forEach((function(e){clearInterval(e)})),volantis.getActiveTimeout().forEach((function(e){clearTimeout(e)}))},volantis.pjax.send(volantis.clearAllTimers,"clearAllTimers")</script><script>volantis.GLOBAL_CONFIG={root:"/",debug:!1,default:{avatar:"https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/placeholder/avatar/round/3442075.svg",link:"https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/placeholder/link/8f277b4ee0ecd.svg",cover:"https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/placeholder/cover/76b86c0226ffd.svg",image:"https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/placeholder/image/2659360.svg"},lastupdate:new Date(1779510804521),cdn:{izitoast_css:"https://cdn.bootcdn.net/ajax/libs/izitoast/1.4.0/css/iziToast.min.css",izitoast_js:"https://cdn.bootcdn.net/ajax/libs/izitoast/1.4.0/js/iziToast.min.js",fancybox_css:"https://cdn.bootcdn.net/ajax/libs/fancyapps-ui/4.0.31/fancybox.min.css",fancybox_js:"https://cdn.bootcdn.net/ajax/libs/fancyapps-ui/4.0.31/fancybox.umd.min.js"},sidebar:{for_page:["blogger","navigation","webinfo"],for_post:["toc"],webinfo:{lastupd:{enable:!1,friendlyShow:!0},runtime:{data:"2019/08/19",unit:"天"}}},plugins:{message:{enable:!1,icon:{default:"fa-solid fa-info-circle light-blue",quection:"fa-solid fa-question-circle light-blue"},time:{default:5e3,quection:2e4},position:"topRight",transitionIn:"bounceInLeft",transitionOut:"fadeOutRight",titleColor:"var(--color-text)",messageColor:"var(--color-text)",backgroundColor:"var(--color-card)",zindex:2147483647,copyright:{enable:!0,title:"知识共享许可协议",message:"请遵守 CC BY-NC-SA 4.0 协议。",icon:"far fa-copyright light-blue"},aplayer:{enable:!0,play:"fa-solid fa-play",pause:"fa-solid fa-pause"},rightmenu:{enable:!0,notice:!0}},aplayer:{id:1480000098,enable:!0}},search:{dataPath:("/".endsWith("/")?"/":"//")+"content.json"},languages:{search:{hits_empty:"找不到您查询的内容:${query}",hits_stats:"找到 ${hits} 条结果,用时 ${time} 毫秒"}}}</script><script type="application/ld+json">[{"@context":"http://schema.org","@type":"Organization","name":"MHuiG Magicland","url":"https://blog.mhuig.top/","logo":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png","width":192,"height":192}},{"@context":"http://schema.org","@type":"Person","name":"MHuiG","image":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png"},"url":"https://blog.mhuig.top/","sameAs":["https://github.com/MHuiG","https://twitter.com/iMHuiG","https://t.me/MHuiG","https://keybase.io/MHuiG"],"description":"「Be Yourself, Make a Difference.」"},{"@context":"http://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://blog.mhuig.top/","name":"Magicland"}},{"@type":"ListItem","position":2,"item":{"@id":"https://blog.mhuig.top/categories/大数据/","name":"大数据"}},{"@type":"ListItem","position":2,"item":{"@id":"https://blog.mhuig.top/categories/大数据/Spark/","name":"Spark"}},{"@type":"ListItem","position":3,"item":{"@id":"https://blog.mhuig.top/notes/Spark/k-means.html","name":"基于K均值聚类的网络流量异常检测(pyspark)"}}]},{"@context":"http://schema.org","@type":"WebSite","name":"MHuiG Magicland","url":"https://blog.mhuig.top/","keywords":"MHuiG, @MHuiG, Blog, 博客, Magicland, 魔法世界","description":"宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒。「Be Yourself, Make a Difference.」 - Magic Island","author":{"@type":"Person","name":"MHuiG","image":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png"},"url":"https://blog.mhuig.top/","description":"「Be Yourself, Make a Difference.」"},"publisher":{"@type":"Organization","name":"MHuiG Magicland","url":"https://blog.mhuig.top/","logo":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png","width":192,"height":192}},"potentialAction":{"@type":"SearchAction","name":"Coco | The Cat of MHuiG","target":{"@type":"EntryPoint","urlTemplate":"https://blog.mhuig.top/havefun/Coco/?s={search_term_string}"},"query-input":"required name=search_term_string"}},{"@context":"http://schema.org","@type":"BlogPosting","headline":"基于K均值聚类的网络流量异常检测(pyspark)","description":"基于K均值聚类的网络流量异常检测方法通过PySpark实现,用于识别欺诈、网络攻击及设备故障等新型异常。使用KDD Cup 1999数据集(38个特征),通过迭代计算样本点到中心距离划分聚类,更新中心点至收敛。实验步骤含数据准备、HDFS上传、DataFrame构建及k值选择,评价指标为熵和准确率。","inLanguage":"zh-Hans","mainEntityOfPage":{"@type":"WebPage","@id":"https://blog.mhuig.top/notes/Spark/k-means"},"author":{"@type":"Person","name":"MHuiG","image":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png"},"url":"https://blog.mhuig.top/"},"publisher":{"@type":"Organization","name":"MHuiG Magicland","logo":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png","width":192,"height":192}},"url":"https://blog.mhuig.top/notes/Spark/k-means","wordCount":0,"datePublished":"2020-08-02T10:23:00.000Z","dateModified":"2025-11-20T10:18:00.000Z","articleSection":"大数据","keywords":"BigData,K均值聚类,网络流量异常检测,PySpark","image":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png","width":192,"height":192}}]</script></head><body itemscope="" itemtype="http://schema.org/WebPage"><pjax></pjax><header itemscope="" itemtype="http://schema.org/WPHeader" id="l_header" class="l_header auto shadow floatable blur show" style="opacity:0"><div class="container"><div id="wrapper"><div class="nav-sub"><p class="title"></p><ul class="switcher nav-list-h m-phone" id="pjax-header-nav-list"><li><a id="s-comment" class="fa-solid fa-comments fa-fw" target="_self" title="comment"></a></li><li><a id="s-toc" class="s-toc fa-solid fa-list fa-fw" target="_self" title="toc"></a></li></ul></div><div class="nav-main"> <a class="title flat-box" target="_self" href="/">MHuiG</a><div class="menu navigation"><ul class="nav-list-h m-pc"><li><a class="menuitem flat-box faa-parent animated-hover" title="索引"><i class="fa-duotone fa-list-alt fa-fw"></i> 索引</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="/notes/" title="便签" active-action="action-notes"><i class="fa-duotone fa-books fa-fw"></i> 便签</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/categories/" title="分类" active-action="action-categories"><i class="fa-duotone fa-folder-open fa-fw"></i> 分类</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/tags/" title="标签" active-action="action-tags"><i class="fa-duotone fa-tags fa-fw"></i> 标签</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/archives/" title="归档" active-action="action-archives"><i class="fa-duotone fa-archive fa-fw"></i> 归档</a></li></ul></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/friends/" title="友链" active-action="action-pagesfriends"><i class="fa-duotone fa-link fa-fw"></i> 友链</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="https://www.travellings.cn/go-by-clouds.html" title="Travelling" target="_blank" active-action="action-https:wwwtravellingscngo-by-cloudshtml" rel="external nofollow noopener noreferrer"><i class="fa-duotone fa-subway fa-fw"></i> Travelling</a></li></ul></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/about/" title="关于" active-action="action-pagesabout"><i class="fa-duotone fa-user-tie fa-fw"></i> 关于</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/time-machine/" title="时光机" active-action="action-pagestime-machine"><i class="fa-duotone fa-clock fa-fw"></i> 时光机</a></li><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="noopener" href="https://mhuig.top/privacy-policy/" title="隐私政策" active-action="action-https:mhuigtopprivacy-policy"><i class="fa-duotone fa-user-secret fa-fw"></i> 隐私政策</a></li></ul></li><li><a class="menuitem flat-box faa-parent animated-hover" title="更多"><i class="fa-duotone fa-fan fa-spin fa-fw"></i> 更多</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/beer/" title="Sponsor" active-action="action-pagesbeer"><i class="fa-duotone fa-heart-square fa-fw"></i> Sponsor</a></li><hr><li><a class="menuitem flat-box faa-parent animated-hover" title="博客管理"><i class="fa-duotone fa-user-shield fa-fw"></i> 博客管理</a><ul class="list-v"><li><a class="menuitem flat-box header toggle-mode-btn"><i class="fa-duotone fa-bat fa-fw"></i> 暗黑模式</a></li><li></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/rss/" title="RSS订阅" active-action="action-pagesrss"><i class="fa-duotone fa-rss fa-fw"></i> RSS订阅</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/sitemap.xml" title="站点地图" active-action="action-sitemapxml"><i class="fa-duotone fa-sitemap fa-fw"></i> 站点地图</a></li><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://mhuig.instatus.com/" title="Monitors" active-action="action-https:mhuiginstatuscom"><i class="fa-duotone fa-telescope fa-fw"></i> Monitors</a></li><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://ssl.mhuig.top/" title="SSL Status" active-action="action-https:sslmhuigtop"><i class="fa-brands fa-expeditedssl fa-fw"></i> SSL Status</a></li></ul></li><hr><li><a class="menuitem flat-box faa-parent animated-hover" title="工具箱"><i class="fa-duotone fa-tools fa-fw"></i> 工具箱</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://rssbox.mhuig.top/" title="RSS Box" active-action="action-https:rssboxmhuigtop"><i class="fa-duotone fa-conveyor-belt-boxes fa-fw"></i> RSS Box</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/havefun/Coco/" title="My Cat" active-action="action-havefunCoco"><i class="fa-duotone fa-cat fa-fw"></i> My Cat</a></li><li><a class="menuitem flat-box"><i class="fa-duotone fa-compact-disc fa-spin fa-fw music"></i> Music</a><ul class="list-v"><li><div class="aplayer-container"><div class="aplayer-local"></div></div></li></ul></li><li></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/talk/" title="碎言碎语" active-action="action-pagestalk"><i class="fa-duotone fa-comments fa-fw"></i> 碎言碎语</a></li></ul></li><hr><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://github.com/MHuiG" title="GitHub" active-action="action-https:githubcomMHuiG"><i class="fa-brands fa-github fa-fw"></i> GitHub</a></li></ul></li></ul></div><div class="m_search"><form name="searchform" class="form u-search-form"><i class="icon fa-solid fa-search fa-fw"></i> <input type="text" class="input u-search-input" placeholder="Search..."></form></div><ul class="switcher nav-list-h m-phone"><li><a class="s-search fa-solid fa-search fa-fw" target="_self" title="search"></a></li><li><a class="s-menu fa-solid fa-bars fa-fw" target="_self" title="menu"></a><ul class="menu-phone list-v navigation white-box"><li><a class="menuitem flat-box faa-parent animated-hover" title="索引"><i class="fa-duotone fa-list-alt fa-fw"></i> 索引</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="/notes/" title="便签" active-action="action-notes"><i class="fa-duotone fa-books fa-fw"></i> 便签</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/categories/" title="分类" active-action="action-categories"><i class="fa-duotone fa-folder-open fa-fw"></i> 分类</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/tags/" title="标签" active-action="action-tags"><i class="fa-duotone fa-tags fa-fw"></i> 标签</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/archives/" title="归档" active-action="action-archives"><i class="fa-duotone fa-archive fa-fw"></i> 归档</a></li></ul></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/friends/" title="友链" active-action="action-pagesfriends"><i class="fa-duotone fa-link fa-fw"></i> 友链</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="https://www.travellings.cn/go-by-clouds.html" title="Travelling" target="_blank" active-action="action-https:wwwtravellingscngo-by-cloudshtml" rel="external nofollow noopener noreferrer"><i class="fa-duotone fa-subway fa-fw"></i> Travelling</a></li></ul></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/about/" title="关于" active-action="action-pagesabout"><i class="fa-duotone fa-user-tie fa-fw"></i> 关于</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/time-machine/" title="时光机" active-action="action-pagestime-machine"><i class="fa-duotone fa-clock fa-fw"></i> 时光机</a></li><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="noopener" href="https://mhuig.top/privacy-policy/" title="隐私政策" active-action="action-https:mhuigtopprivacy-policy"><i class="fa-duotone fa-user-secret fa-fw"></i> 隐私政策</a></li></ul></li><li><a class="menuitem flat-box faa-parent animated-hover" title="更多"><i class="fa-duotone fa-fan fa-spin fa-fw"></i> 更多</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/beer/" title="Sponsor" active-action="action-pagesbeer"><i class="fa-duotone fa-heart-square fa-fw"></i> Sponsor</a></li><hr><li><a class="menuitem flat-box faa-parent animated-hover" title="博客管理"><i class="fa-duotone fa-user-shield fa-fw"></i> 博客管理</a><ul class="list-v"><li><a class="menuitem flat-box header toggle-mode-btn"><i class="fa-duotone fa-bat fa-fw"></i> 暗黑模式</a></li><li></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/rss/" title="RSS订阅" active-action="action-pagesrss"><i class="fa-duotone fa-rss fa-fw"></i> RSS订阅</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/sitemap.xml" title="站点地图" active-action="action-sitemapxml"><i class="fa-duotone fa-sitemap fa-fw"></i> 站点地图</a></li><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://mhuig.instatus.com/" title="Monitors" active-action="action-https:mhuiginstatuscom"><i class="fa-duotone fa-telescope fa-fw"></i> Monitors</a></li><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://ssl.mhuig.top/" title="SSL Status" active-action="action-https:sslmhuigtop"><i class="fa-brands fa-expeditedssl fa-fw"></i> SSL Status</a></li></ul></li><hr><li><a class="menuitem flat-box faa-parent animated-hover" title="工具箱"><i class="fa-duotone fa-tools fa-fw"></i> 工具箱</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://rssbox.mhuig.top/" title="RSS Box" active-action="action-https:rssboxmhuigtop"><i class="fa-duotone fa-conveyor-belt-boxes fa-fw"></i> RSS Box</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/havefun/Coco/" title="My Cat" active-action="action-havefunCoco"><i class="fa-duotone fa-cat fa-fw"></i> My Cat</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/talk/" title="碎言碎语" active-action="action-pagestalk"><i class="fa-duotone fa-comments fa-fw"></i> 碎言碎语</a></li></ul></li><hr><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://github.com/MHuiG" title="GitHub" active-action="action-https:githubcomMHuiG"><i class="fa-brands fa-github fa-fw"></i> GitHub</a></li></ul></li></ul></li></ul></div></div></div></header><div id="l_body"><div id="l_cover"><div id="none" class="cover-wrapper docs featured" style="display:none"><div class="cover-bg lazyload placeholder" data-bg=""></div><div class="cover-body"><div class="top"><p class="title">Magicland</p><p class="subtitle">「看庭前花开花落,望天上云卷云舒」</p></div><div class="bottom"><div class="menu navigation"><div class="list-h"><a target="_blank" rel="external nofollow noopener noreferrer" href="https://github.com/MHuiG" active-action="action-https:githubcomMHuiG"><i class="fa-brands fa-github color-github fa-fw"></i><p>Github</p></a><a href="/pages/friends/" active-action="action-pagesfriends"><i class="fa-duotone fa-link color-friends fa-fw"></i><p>友链</p></a><a href="/pages/about/" active-action="action-pagesabout"><i class="fa-duotone fa-user-tie color-about fa-fw"></i><p>关于</p></a><a href="https://www.travellings.cn/go-by-clouds.html" target="_blank" active-action="action-https:wwwtravellingscngo-by-cloudshtml" rel="external nofollow noopener noreferrer"><i class="fa-duotone fa-subway color-travellings fa-fw"></i><p>Travelling</p></a></div></div></div></div><div id="scroll-down" style="display:none"><i class="fa fa-chevron-down scroll-down-effects"></i></div></div></div><div id="safearea"><div class="body-wrapper"><div id="l_main" class=""><article itemscope="" itemtype="http://schema.org/Article" class="article post white-box reveal md shadow floatable blur article-type-docs" id="docs" itemprop="blogPost"><link itemprop="mainEntityOfPage" href="https://blog.mhuig.top/notes/Spark/k-means"><span hidden="" itemprop="publisher" itemscope="" itemtype="http://schema.org/Organization"><meta itemprop="name" content="Magicland"></span><span hidden="" itemprop="post" itemscope="" itemtype="http://schema.org/CreativeWork"><meta itemprop="name" content="基于K均值聚类的网络流量异常检测(pyspark)"><meta itemprop="description" content="基于K均值聚类的网络流量异常检测方法通过PySpark实现,用于识别欺诈、网络攻击及设备故障等新型异常。使用KDD Cup 1999数据集(38个特征),通过迭代计算样本点到中心距离划分聚类,更新中心点至收敛。实验步骤含数据准备、HDFS上传、DataFrame构建及k值选择,评价指标为熵和准确率。"></span><span hidden=""><meta itemprop="image" content="/lib/favicon/android-chrome-192x192.png"></span><div class="article-meta" id="top"><span hidden="" itemprop="name headline"></span></div><div id="layoutHelper-page-plugins"></div><div id="post-body" itemprop="articleBody"><p> <span class="p logo center large">K-Means</span></p><br><h1 hidden="">基于 K 均值聚类的网络流量异常检测 (pyspark)</h1><p>异常检测常用于检测欺诈、网络攻击、服务器及传感设备故障。在这些应用中,我们要能够找出以前从未见过的新型异常,如新欺诈方式、新入侵方法或新服务器故障模式。</p><div class="story post-story"><h2 id="数据集"><a href="#数据集" class="headerlink" title="数据集"></a>数据集</h2><p>KDD Cup 1999 数据集</p><span class="btn center large"><a class="button" target="_blank" rel="external nofollow noopener noreferrer" href="/go.html?u=aHR0cDovL2tkZC5pY3MudWNpLmVkdS9kYXRhYmFzZXMva2RkY3VwOTkva2RkY3VwOTkuaHRtbA" title="下载 KDD Cup 1999 数据集"><i class="fas fa-download"></i> 下载 KDD Cup 1999 数据集</a></span><p>数据集为 CSV 格式,每个连接占一行,包含 38 个特征。</p><p>单行示例:</p><figure class="highlight properties"><table><tbody><tr><td class="code"><pre><span class="line"><span class="attr">0,tcp,http,SF,239,486,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,0.00,0.00,1.00,0.00,0.00,19,19,1.00,0.00,0.05,0.00,0.00,0.00,0.00,0.00,normal.</span></span><br></pre></td></tr></tbody></table></figure><p>最后的字段表示类别标号。大多数标号为 normal., 但也有一些样本代表各种网络攻击。</p></div><div class="story post-story"><h2 id="算法"><a href="#算法" class="headerlink" title="算法"></a>算法</h2><h3 id="K均值聚类算法"><a href="#K均值聚类算法" class="headerlink" title="K均值聚类算法"></a><strong>K 均值聚类算法</strong></h3><p>聚类算法是指将一堆没有标签的数据自动划分成几类的方法,这个方法要保证同一类的数据有相似的特征。</p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651998573990/20208216374.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651998573990/20208216374.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="K均值聚类算法"></p><h3 id="算法过程"><a href="#算法过程" class="headerlink" title="算法过程"></a><strong>算法过程</strong></h3><p>K-Means 算法的特点是类别的个数是人为给定的。是一个迭代求解的聚类算法,属于划分型的聚类方法,即首先创建 K 个划分,然后迭代地将样本从一个划分转移到另一个划分来改善最终聚类的效果。其过程大致如下。</p><p>(1)根据给定的 K 值选取 K 个样本点作为初始划分中心。</p><p>(2)计算所有样本点到每一个划分中心的距离,并将所有样本点划分到距离最近的划分中心。</p><p>(3)计算每个划分中样本点的平均值,并将其作为新的中心。</p><p>(4)循环进行步骤(2)和步骤(3)直至最大迭代次数,或划分中心的变化小于某一预定义阈值。</p><h3 id="伪代码"><a href="#伪代码" class="headerlink" title="伪代码"></a><strong>伪代码</strong></h3><figure class="highlight matlab"><table><tbody><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">K</span>-<span class="title">Means</span><span class="params">(输入数据,中心点个数K)</span> </span></span><br><span class="line">    获取输入数据的维度Dim和个数N </span><br><span class="line">    随机生成K个Dim维的点 </span><br><span class="line">    <span class="keyword">while</span>(算法未收敛) </span><br><span class="line">        对N个点:计算每个点属于哪一类。 </span><br><span class="line">        对于K个中心点: </span><br><span class="line">            <span class="number">1</span>,找出所有属于自己这一类的所有数据点 </span><br><span class="line">            <span class="number">2</span>,把自己的坐标修改为这些数据点的中心点坐标 </span><br><span class="line">    <span class="keyword">end</span></span><br><span class="line">    输出结果</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></tbody></table></figure><p>K-Means 的一个重要的假设是:数据之间的相似度可以使用欧氏距离度量,如果不能使用欧氏距离度量,要先把数据转换到能用欧氏距离度量,这一点很重要。可以使用欧氏距离度量的意思就是欧氏距离越小,两个数据相似度越高。</p><p>假设簇划分为(<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align:-.339ex" xmlns="http://www.w3.org/2000/svg" width="2.605ex" height="1.934ex" role="img" focusable="false" viewBox="0 -705 1151.6 855"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="C_1"><g data-mml-node="msub" data-latex="C_1 "><g data-mml-node="mi" data-latex="C"><path data-c="1D436" d="M148 218C148 346 204 476 267 548 318 607 406 666 505 666 609 666 660 587 660 479 660 470 657 438 657 429 657 420 663 415 676 415 681 415 685 416 688 417 693 424 696 431 698 438L760 691C760 700 755 705 745 705 741 705 735 701 727 692L662 619C623 676 568 705 497 705 442 705 388 692 333 667 222 615 141 533 89 421 63 366 50 310 50 253 50 173 75 108 126 56 177 4 242-22 322-22 401-22 473 7 538 64 565 87 588 115 607 146 634 191 648 222 648 241 648 250 643 255 632 255 623 255 618 251 616 242 595 177 562 125 517 88 460 41 400 17 338 17 218 17 148 98 148 218Z"></path></g><g data-mml-node="mn" transform="translate(748,-150) scale(0.707)" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47 195 42 170 39 130 39L95 39 95 0C120 2 174 3 257 3 340 3 394 2 419 0L419 39 384 39C343 39 318 42 310 47 302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g></svg></mjx-container>,<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align:-.339ex" xmlns="http://www.w3.org/2000/svg" width="2.605ex" height="1.934ex" role="img" focusable="false" viewBox="0 -705 1151.6 855"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="C_2"><g data-mml-node="msub" data-latex="C_2 "><g data-mml-node="mi" data-latex="C"><path data-c="1D436" d="M148 218C148 346 204 476 267 548 318 607 406 666 505 666 609 666 660 587 660 479 660 470 657 438 657 429 657 420 663 415 676 415 681 415 685 416 688 417 693 424 696 431 698 438L760 691C760 700 755 705 745 705 741 705 735 701 727 692L662 619C623 676 568 705 497 705 442 705 388 692 333 667 222 615 141 533 89 421 63 366 50 310 50 253 50 173 75 108 126 56 177 4 242-22 322-22 401-22 473 7 538 64 565 87 588 115 607 146 634 191 648 222 648 241 648 250 643 255 632 255 623 255 618 251 616 242 595 177 562 125 517 88 460 41 400 17 338 17 218 17 148 98 148 218Z"></path></g><g data-mml-node="mn" transform="translate(748,-150) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612 69 576 50 534 50 483 50 449 75 424 106 424 136 424 161 450 161 480 161 513 137 536 105 536 102 536 100 536 98 535 117 584 161 627 224 627 306 627 352 556 352 470 352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0 450 180 417 180C409 129 402 100 396 91 391 86 361 84 306 84L139 84 236 179C304 243 390 312 419 365 439 400 449 435 449 470 449 588 357 666 237 666Z"></path></g></g></g></g></svg></mjx-container>,…<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align:-.357ex" xmlns="http://www.w3.org/2000/svg" width="2.639ex" height="1.952ex" role="img" focusable="false" viewBox="0 -705 1166.4 862.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="C_k"><g data-mml-node="msub" data-latex="C_k"><g data-mml-node="mi" data-latex="C"><path data-c="1D436" d="M148 218C148 346 204 476 267 548 318 607 406 666 505 666 609 666 660 587 660 479 660 470 657 438 657 429 657 420 663 415 676 415 681 415 685 416 688 417 693 424 696 431 698 438L760 691C760 700 755 705 745 705 741 705 735 701 727 692L662 619C623 676 568 705 497 705 442 705 388 692 333 667 222 615 141 533 89 421 63 366 50 310 50 253 50 173 75 108 126 56 177 4 242-22 322-22 401-22 473 7 538 64 565 87 588 115 607 146 634 191 648 222 648 241 648 250 643 255 632 255 623 255 618 251 616 242 595 177 562 125 517 88 460 41 400 17 338 17 218 17 148 98 148 218Z"></path></g><g data-mml-node="mi" transform="translate(748,-150) scale(0.707)" data-latex="k"><path data-c="1D458" d="M409 353C409 327 423 314 450 314 485 314 508 345 508 379 508 418 476 445 437 445 392 445 344 415 291 356 250 311 217 282 190 269L291 679C289 688 287 694 274 694 242 694 166 685 154 684 139 682 132 675 132 660 132 650 141 645 159 645 178 645 204 646 204 632L59 43C56 32 55 25 55 21 55 0 66-11 87-11 104-11 117-3 124 12 129 21 147 92 179 226 231 221 286 196 286 146 286 131 279 101 279 91 279 34 316-11 373-11 431-11 470 41 490 145 490 154 485 159 475 159 466 159 460 152 457 138 435 59 408 19 375 19 357 19 348 33 348 61 348 77 360 131 360 147 360 204 314 239 221 253 244 269 270 292 298 322 326 352 346 371 359 382 386 404 412 415 435 415 445 415 453 413 459 409 432 404 409 379 409 353Z"></path></g></g></g></g></svg></mjx-container>),则优化目标是最小化平方误差 SSE:</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true" width="full" style="min-width:33.624ex"><svg style="vertical-align:-2.905ex;min-width:33.624ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="6.941ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -1783.9)"><g data-mml-node="math" data-latex="
SSE=\sum_{i=1}^k\sum_{x∈C_i}‖x-u_i‖_2^2
"><g data-mml-node="mtable" data-latex="
SSE=\sum_{i=1}^k\sum_{x∈C_i}‖x-u_i‖_2 ^2 
" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 1783.9) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="5352.9 -1783.9 1 3067.8"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,43.2)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="S"><path data-c="1D446" d="M133 157C133 181 136 201 141 217 141 227 136 232 125 232 120 232 116 230 114 228 109 223 52 8 52-8 52-17 57-22 67-22 72-22 79-17 88-6L133 47C168 1 224-22 300-22 366-22 424 5 476 58 528 111 554 170 554 236 554 283 538 323 505 355 490 368 470 379 445 388 422 393 400 399 378 405L312 423C279 432 254 469 254 509 254 552 271 589 306 621 341 653 380 669 423 669 515 669 561 619 561 520 561 502 557 482 557 465L557 462C560 455 565 451 573 451 582 451 588 459 592 474L645 691C645 700 640 705 630 705 625 705 618 700 609 689L566 637C538 682 491 705 424 705 361 705 304 681 254 634 202 586 176 531 176 468 176 396 223 339 282 323L387 296C441 281 475 262 475 195 475 149 457 108 422 72 387 36 347 17 302 17 204 17 133 60 133 157Z"></path></g><g data-mml-node="mi" data-latex="S" transform="translate(645,0)"><path data-c="1D446" d="M133 157C133 181 136 201 141 217 141 227 136 232 125 232 120 232 116 230 114 228 109 223 52 8 52-8 52-17 57-22 67-22 72-22 79-17 88-6L133 47C168 1 224-22 300-22 366-22 424 5 476 58 528 111 554 170 554 236 554 283 538 323 505 355 490 368 470 379 445 388 422 393 400 399 378 405L312 423C279 432 254 469 254 509 254 552 271 589 306 621 341 653 380 669 423 669 515 669 561 619 561 520 561 502 557 482 557 465L557 462C560 455 565 451 573 451 582 451 588 459 592 474L645 691C645 700 640 705 630 705 625 705 618 700 609 689L566 637C538 682 491 705 424 705 361 705 304 681 254 634 202 586 176 531 176 468 176 396 223 339 282 323L387 296C441 281 475 262 475 195 475 149 457 108 422 72 387 36 347 17 302 17 204 17 133 60 133 157Z"></path></g><g data-mml-node="mi" data-latex="E" transform="translate(1290,0)"><path data-c="1D438" d="M199 656C199 646 210 641 231 641 271 641 291 637 291 628 291 625 289 618 286 605L156 82C151 60 141 47 126 42 119 40 101 39 70 39 48 39 38 37 38 16 38 5 49 0 70 0L583 0C607 0 609 2 617 19L657 109C684 171 703 217 714 248 712 257 709 263 698 263 691 263 685 258 681 249 656 190 632 145 608 113 568 59 509 39 415 39L270 39C260 39 253 39 249 40 243 40 240 42 240 45 240 47 242 54 245 67L311 334 406 334C453 334 478 328 483 315 485 310 486 303 486 293 486 280 484 264 479 245 477 240 476 236 476 233 476 223 482 218 493 218 502 218 508 226 512 241L568 473C568 483 563 488 552 488 544 488 538 481 535 467 525 428 512 403 495 391 478 379 450 373 409 373L321 373 379 606C387 640 387 641 429 641L568 641C619 641 654 636 673 626 701 611 715 581 715 536 715 519 714 501 711 484 711 482 711 479 710 475L710 466C710 455 715 450 725 450 735 450 741 459 743 478L763 649C766 677 759 680 732 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mo" data-latex="=" transform="translate(2333.8,0)"><path data-c="3D" d="M698 367 80 367C64 367 56 359 56 344 56 329 64 321 80 321L698 321C714 321 722 329 722 344 722 356 711 367 698 367M698 179 80 179C64 179 56 171 56 156 56 141 64 133 80 133L698 133C714 133 722 141 722 156 722 169 711 179 698 179Z"></path></g><g data-mml-node="munderover" data-latex="\sum_{i=1}^k" transform="translate(3389.6,0)"><g data-mml-node="mo" data-latex="\sum"><path data-c="2211" d="M1265-450 1389-124 1355-124C1336-174 1304-216 1258-250 1145-334 1000-356 791-356L200-356 700 232C707 239 710 246 710 251L244 894 781 894C970 894 1127 870 1230 804 1290 766 1332 719 1356 663L1389 663 1265 950 88 950C70 950 60 947 57 941 56 938 56 926 56 905L581 187 68-415C61-423 57-430 57-435 57-445 67-450 88-450Z"></path></g><g data-mml-node="TeXAtom" transform="translate(148.2,-1087.9) scale(0.707)" data-latex="{i=1}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g><g data-mml-node="mo" data-latex="=" transform="translate(345,0)"><path data-c="3D" d="M698 367 80 367C64 367 56 359 56 344 56 329 64 321 80 321L698 321C714 321 722 329 722 344 722 356 711 367 698 367M698 179 80 179C64 179 56 171 56 156 56 141 64 133 80 133L698 133C714 133 722 141 722 156 722 169 711 179 698 179Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(1123,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47 195 42 170 39 130 39L95 39 95 0C120 2 174 3 257 3 340 3 394 2 419 0L419 39 384 39C343 39 318 42 310 47 302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mi" transform="translate(537.8,1150) scale(0.707)" data-latex="k"><path data-c="1D458" d="M409 353C409 327 423 314 450 314 485 314 508 345 508 379 508 418 476 445 437 445 392 445 344 415 291 356 250 311 217 282 190 269L291 679C289 688 287 694 274 694 242 694 166 685 154 684 139 682 132 675 132 660 132 650 141 645 159 645 178 645 204 646 204 632L59 43C56 32 55 25 55 21 55 0 66-11 87-11 104-11 117-3 124 12 129 21 147 92 179 226 231 221 286 196 286 146 286 131 279 101 279 91 279 34 316-11 373-11 431-11 470 41 490 145 490 154 485 159 475 159 466 159 460 152 457 138 435 59 408 19 375 19 357 19 348 33 348 61 348 77 360 131 360 147 360 204 314 239 221 253 244 269 270 292 298 322 326 352 346 371 359 382 386 404 412 415 435 415 445 415 453 413 459 409 432 404 409 379 409 353Z"></path></g></g><g data-mml-node="munder" data-latex="\sum_{x∈C_i}" transform="translate(5000.2,0)"><g data-mml-node="mo" data-latex="\sum" transform="translate(84.4,0)"><path data-c="2211" d="M1265-450 1389-124 1355-124C1336-174 1304-216 1258-250 1145-334 1000-356 791-356L200-356 700 232C707 239 710 246 710 251L244 894 781 894C970 894 1127 870 1230 804 1290 766 1332 719 1356 663L1389 663 1265 950 88 950C70 950 60 947 57 941 56 938 56 926 56 905L581 187 68-415C61-423 57-430 57-435 57-445 67-450 88-450Z"></path></g><g data-mml-node="TeXAtom" transform="translate(0,-1115.5) scale(0.707)" data-latex="{x∈C_i}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442 389 442 355 419 329 373 308 419 273 442 222 442 173 442 133 419 101 374 74 335 60 306 60 287 60 278 65 273 75 273 84 273 90 278 92 287 111 345 153 413 220 413 253 413 269 392 269 351 269 330 251 252 216 118 199 51 169 18 126 18 112 18 99 21 88 26 114 36 127 54 127 80 127 106 114 119 87 119 54 119 29 91 29 58 29 12 76-11 125-11 167-11 201 12 228 58 247 12 283-11 335-11 383-11 423 12 455 57 482 96 496 125 496 144 496 153 491 158 481 158 472 158 467 153 464 144 447 87 402 18 337 18 304 18 287 38 287 79 287 92 292 120 303 165L337 300C356 375 387 413 431 413 445 413 458 410 469 405 442 396 429 378 429 351 429 325 443 312 470 312 502 312 527 341 527 373Z"></path></g><g data-mml-node="mo" data-latex="∈" transform="translate(572,0)"><path data-c="2208" d="M563 4 373 4C310 4 254 25 208 68 162 111 136 163 130 226L563 226C579 226 587 234 587 250 587 266 579 274 563 274L130 274C136 337 162 389 208 432 254 475 310 496 373 496L563 496C579 496 587 504 587 519 587 535 579 543 563 543L373 543C292 543 223 515 166 458 109 401 81 332 81 250 81 168 109 99 166 42 223-15 292-43 373-43L563-43C579-43 587-35 587-19 587-7 576 4 563 4Z"></path></g><g data-mml-node="msub" data-latex="C_i" transform="translate(1239,0)"><g data-mml-node="mi" data-latex="C"><path data-c="1D436" d="M148 218C148 346 204 476 267 548 318 607 406 666 505 666 609 666 660 587 660 479 660 470 657 438 657 429 657 420 663 415 676 415 681 415 685 416 688 417 693 424 696 431 698 438L760 691C760 700 755 705 745 705 741 705 735 701 727 692L662 619C623 676 568 705 497 705 442 705 388 692 333 667 222 615 141 533 89 421 63 366 50 310 50 253 50 173 75 108 126 56 177 4 242-22 322-22 401-22 473 7 538 64 565 87 588 115 607 146 634 191 648 222 648 241 648 250 643 255 632 255 623 255 618 251 616 242 595 177 562 125 517 88 460 41 400 17 338 17 218 17 148 98 148 218Z"></path></g><g data-mml-node="mi" transform="translate(748,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g></g></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(6779.8,0)"><g data-mml-node="mo" data-latex="‖"><path data-c="2016" d="M264-250C279-250 287-242 287-226L287 726C287 742 279 750 264 750 249 750 241 742 241 726L241-226C241-242 249-250 264-250M134-250C149-250 157-242 157-226L157 726C157 742 149 750 134 750 119 750 111 742 111 726L111-226C111-242 119-250 134-250Z"></path></g></g><g data-mml-node="mi" data-latex="x" transform="translate(7177.8,0)"><path data-c="1D465" d="M527 373C527 419 482 442 432 442 389 442 355 419 329 373 308 419 273 442 222 442 173 442 133 419 101 374 74 335 60 306 60 287 60 278 65 273 75 273 84 273 90 278 92 287 111 345 153 413 220 413 253 413 269 392 269 351 269 330 251 252 216 118 199 51 169 18 126 18 112 18 99 21 88 26 114 36 127 54 127 80 127 106 114 119 87 119 54 119 29 91 29 58 29 12 76-11 125-11 167-11 201 12 228 58 247 12 283-11 335-11 383-11 423 12 455 57 482 96 496 125 496 144 496 153 491 158 481 158 472 158 467 153 464 144 447 87 402 18 337 18 304 18 287 38 287 79 287 92 292 120 303 165L337 300C356 375 387 413 431 413 445 413 458 410 469 405 442 396 429 378 429 351 429 325 443 312 470 312 502 312 527 341 527 373Z"></path></g><g data-mml-node="mo" data-latex="-" transform="translate(7972,0)"><path data-c="2212" d="M698 270 80 270C64 270 56 263 56 250 56 237 64 230 80 230L698 230C714 230 722 237 722 250 722 262 710 270 698 270Z"></path></g><g data-mml-node="msub" data-latex="u_i" transform="translate(8972.2,0)"><g data-mml-node="mi" data-latex="u"><path data-c="1D462" d="M543 144C543 153 538 158 527 158 518 158 513 151 510 137 505 118 500 99 493 80 480 39 462 18 440 18 422 18 413 32 413 60 413 77 420 111 433 161L460 267C469 303 477 328 483 359L489 386C491 393 492 398 492 401 492 421 481 431 459 431 437 431 423 419 417 394L343 98C342 95 338 88 330 76 314 50 275 18 235 18 197 18 178 44 178 95 178 136 196 202 231 294 242 324 248 345 248 357 248 407 213 442 163 442 118 442 83 417 58 367 39 328 29 301 29 287 29 278 34 273 45 273 58 273 60 279 64 293 87 373 119 413 160 413 174 413 181 403 181 384 181 369 175 348 164 319 126 218 107 148 107 111 107 34 155-11 232-11 275-11 314 9 347 50 361 9 391-11 437-11 506-11 527 70 543 144Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g><g data-mml-node="msubsup" data-latex="‖_2^2" transform="translate(9871.2,0)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mo" data-latex="‖"><path data-c="2016" d="M264-250C279-250 287-242 287-226L287 726C287 742 279 750 264 750 249 750 241 742 241 726L241-226C241-242 249-250 264-250M134-250C149-250 157-242 157-226L157 726C157 742 149 750 134 750 119 750 111 742 111 726L111-226C111-242 119-250 134-250Z"></path></g></g><g data-mml-node="mn" transform="translate(431,413) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612 69 576 50 534 50 483 50 449 75 424 106 424 136 424 161 450 161 480 161 513 137 536 105 536 102 536 100 536 98 535 117 584 161 627 224 627 306 627 352 556 352 470 352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0 450 180 417 180C409 129 402 100 396 91 391 86 361 84 306 84L139 84 236 179C304 243 390 312 419 365 439 400 449 435 449 470 449 588 357 666 237 666Z"></path></g><g data-mml-node="mn" transform="translate(431,-247) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612 69 576 50 534 50 483 50 449 75 424 106 424 136 424 161 450 161 480 161 513 137 536 105 536 102 536 100 536 98 535 117 584 161 627 224 627 306 627 352 556 352 470 352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0 450 180 417 180C409 129 402 100 396 91 391 86 361 84 306 84L139 84 236 179C304 243 390 312 419 365 439 400 449 435 449 470 449 588 357 666 237 666Z"></path></g></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -1783.9 1 3067.8"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:1" transform="translate(0,791.2)"><text data-id-align="true"></text><g data-idbox="true" transform="translate(0,-748)"><g data-mml-node="mtext" data-latex="\text{(1)}"><path data-c="28" d="M318-248C327-248 332-243 332-234 332-231 330-227 327-223 275-183 233-117 202-26 175 53 161 131 161 208L161 292C161 369 175 447 202 526 233 617 275 683 327 723 330 726 332 730 332 734 332 743 327 748 318 748 317 748 314 747 311 745 251 699 201 631 160 540 121 453 101 371 101 292L101 208C101 129 121 47 160-40 201-131 251-199 311-245 314-247 317-248 318-248Z"></path><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47 195 42 170 39 130 39L95 39 95 0C120 2 174 3 257 3 340 3 394 2 419 0L419 39 384 39C343 39 318 42 310 47 302 52 297 64 297 82L297 636C297 660 295 666 269 666Z" transform="translate(389,0)"></path><path data-c="29" d="M78-245C138-199 188-131 229-40 268 47 288 129 288 208L288 292C288 371 268 453 229 540 188 631 138 699 78 745 75 747 72 748 71 748 62 748 57 743 57 734 57 730 59 726 62 723 114 683 156 617 187 526 214 447 228 369 228 292L228 208C228 131 214 53 187-26 156-117 114-183 62-223 59-227 57-231 57-234 57-243 62-248 71-248 72-248 75-247 78-245Z" transform="translate(889,0)"></path></g></g></g></g></svg></g></g></g></g></svg></mjx-container></p><p>其中<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align:-.357ex" xmlns="http://www.w3.org/2000/svg" width="2.034ex" height="1.357ex" role="img" focusable="false" viewBox="0 -442 899 599.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="u_i"><g data-mml-node="msub" data-latex="u_i"><g data-mml-node="mi" data-latex="u"><path data-c="1D462" d="M543 144C543 153 538 158 527 158 518 158 513 151 510 137 505 118 500 99 493 80 480 39 462 18 440 18 422 18 413 32 413 60 413 77 420 111 433 161L460 267C469 303 477 328 483 359L489 386C491 393 492 398 492 401 492 421 481 431 459 431 437 431 423 419 417 394L343 98C342 95 338 88 330 76 314 50 275 18 235 18 197 18 178 44 178 95 178 136 196 202 231 294 242 324 248 345 248 357 248 407 213 442 163 442 118 442 83 417 58 367 39 328 29 301 29 287 29 278 34 273 45 273 58 273 60 279 64 293 87 373 119 413 160 413 174 413 181 403 181 384 181 369 175 348 164 319 126 218 107 148 107 111 107 34 155-11 232-11 275-11 314 9 347 50 361 9 391-11 437-11 506-11 527 70 543 144Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g></g></g></svg></mjx-container>是簇<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align:-.357ex" xmlns="http://www.w3.org/2000/svg" width="2.357ex" height="1.952ex" role="img" focusable="false" viewBox="0 -705 1042 862.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="C_i"><g data-mml-node="msub" data-latex="C_i"><g data-mml-node="mi" data-latex="C"><path data-c="1D436" d="M148 218C148 346 204 476 267 548 318 607 406 666 505 666 609 666 660 587 660 479 660 470 657 438 657 429 657 420 663 415 676 415 681 415 685 416 688 417 693 424 696 431 698 438L760 691C760 700 755 705 745 705 741 705 735 701 727 692L662 619C623 676 568 705 497 705 442 705 388 692 333 667 222 615 141 533 89 421 63 366 50 310 50 253 50 173 75 108 126 56 177 4 242-22 322-22 401-22 473 7 538 64 565 87 588 115 607 146 634 191 648 222 648 241 648 250 643 255 632 255 623 255 618 251 616 242 595 177 562 125 517 88 460 41 400 17 338 17 218 17 148 98 148 218Z"></path></g><g data-mml-node="mi" transform="translate(748,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g></g></g></svg></mjx-container>的均值向量,也称为质心,表达式为:</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true" width="full" style="min-width:24.762ex"><svg style="vertical-align:-2.454ex;min-width:24.762ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="6.039ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -1584.5)"><g data-mml-node="math" data-latex="
u_i=\frac{1}{|C_i|}\sum_{x∈C_i}x
"><g data-mml-node="mtable" data-latex="
u_i=\frac{1}{|C_i|}\sum_{x∈C_i}x
" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 1584.5) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="3394.3 -1584.5 1 2669.1"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,242.5)"><g data-mml-node="mtd"><g data-mml-node="msub" data-latex="u_i"><g data-mml-node="mi" data-latex="u"><path data-c="1D462" d="M543 144C543 153 538 158 527 158 518 158 513 151 510 137 505 118 500 99 493 80 480 39 462 18 440 18 422 18 413 32 413 60 413 77 420 111 433 161L460 267C469 303 477 328 483 359L489 386C491 393 492 398 492 401 492 421 481 431 459 431 437 431 423 419 417 394L343 98C342 95 338 88 330 76 314 50 275 18 235 18 197 18 178 44 178 95 178 136 196 202 231 294 242 324 248 345 248 357 248 407 213 442 163 442 118 442 83 417 58 367 39 328 29 301 29 287 29 278 34 273 45 273 58 273 60 279 64 293 87 373 119 413 160 413 174 413 181 403 181 384 181 369 175 348 164 319 126 218 107 148 107 111 107 34 155-11 232-11 275-11 314 9 347 50 361 9 391-11 437-11 506-11 527 70 543 144Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g><g data-mml-node="mo" data-latex="=" transform="translate(1176.7,0)"><path data-c="3D" d="M698 367 80 367C64 367 56 359 56 344 56 329 64 321 80 321L698 321C714 321 722 329 722 344 722 356 711 367 698 367M698 179 80 179C64 179 56 171 56 156 56 141 64 133 80 133L698 133C714 133 722 141 722 156 722 169 711 179 698 179Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{1}{|C_i|}" transform="translate(2232.5,0)"><g data-mml-node="mn" data-latex="1" transform="translate(769,676)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47 195 42 170 39 130 39L95 39 95 0C120 2 174 3 257 3 340 3 394 2 419 0L419 39 384 39C343 39 318 42 310 47 302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g><g data-mml-node="mrow" data-latex="|C_i|" transform="translate(220,-710)"><g data-mml-node="mo" data-latex="|"><path data-c="7C" d="M139-250C152-250 159-242 159-226L159 726C159 742 152 750 139 750 126 750 119 742 119 726L119-226C119-242 126-250 139-250Z"></path></g><g data-mml-node="msub" data-latex="C_i" transform="translate(278,0)"><g data-mml-node="mi" data-latex="C"><path data-c="1D436" d="M148 218C148 346 204 476 267 548 318 607 406 666 505 666 609 666 660 587 660 479 660 470 657 438 657 429 657 420 663 415 676 415 681 415 685 416 688 417 693 424 696 431 698 438L760 691C760 700 755 705 745 705 741 705 735 701 727 692L662 619C623 676 568 705 497 705 442 705 388 692 333 667 222 615 141 533 89 421 63 366 50 310 50 253 50 173 75 108 126 56 177 4 242-22 322-22 401-22 473 7 538 64 565 87 588 115 607 146 634 191 648 222 648 241 648 250 643 255 632 255 623 255 618 251 616 242 595 177 562 125 517 88 460 41 400 17 338 17 218 17 148 98 148 218Z"></path></g><g data-mml-node="mi" transform="translate(748,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g><g data-mml-node="mo" data-latex="|" transform="translate(1320,0)"><path data-c="7C" d="M139-250C152-250 159-242 159-226L159 726C159 742 152 750 139 750 126 750 119 742 119 726L119-226C119-242 126-250 139-250Z"></path></g></g><rect width="1798" height="60" x="120" y="220"></rect></g><g data-mml-node="munder" data-latex="\sum_{x∈C_i}" transform="translate(4437.1,0)"><g data-mml-node="mo" data-latex="\sum" transform="translate(84.4,0)"><path data-c="2211" d="M1265-450 1389-124 1355-124C1336-174 1304-216 1258-250 1145-334 1000-356 791-356L200-356 700 232C707 239 710 246 710 251L244 894 781 894C970 894 1127 870 1230 804 1290 766 1332 719 1356 663L1389 663 1265 950 88 950C70 950 60 947 57 941 56 938 56 926 56 905L581 187 68-415C61-423 57-430 57-435 57-445 67-450 88-450Z"></path></g><g data-mml-node="TeXAtom" transform="translate(0,-1115.5) scale(0.707)" data-latex="{x∈C_i}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442 389 442 355 419 329 373 308 419 273 442 222 442 173 442 133 419 101 374 74 335 60 306 60 287 60 278 65 273 75 273 84 273 90 278 92 287 111 345 153 413 220 413 253 413 269 392 269 351 269 330 251 252 216 118 199 51 169 18 126 18 112 18 99 21 88 26 114 36 127 54 127 80 127 106 114 119 87 119 54 119 29 91 29 58 29 12 76-11 125-11 167-11 201 12 228 58 247 12 283-11 335-11 383-11 423 12 455 57 482 96 496 125 496 144 496 153 491 158 481 158 472 158 467 153 464 144 447 87 402 18 337 18 304 18 287 38 287 79 287 92 292 120 303 165L337 300C356 375 387 413 431 413 445 413 458 410 469 405 442 396 429 378 429 351 429 325 443 312 470 312 502 312 527 341 527 373Z"></path></g><g data-mml-node="mo" data-latex="∈" transform="translate(572,0)"><path data-c="2208" d="M563 4 373 4C310 4 254 25 208 68 162 111 136 163 130 226L563 226C579 226 587 234 587 250 587 266 579 274 563 274L130 274C136 337 162 389 208 432 254 475 310 496 373 496L563 496C579 496 587 504 587 519 587 535 579 543 563 543L373 543C292 543 223 515 166 458 109 401 81 332 81 250 81 168 109 99 166 42 223-15 292-43 373-43L563-43C579-43 587-35 587-19 587-7 576 4 563 4Z"></path></g><g data-mml-node="msub" data-latex="C_i" transform="translate(1239,0)"><g data-mml-node="mi" data-latex="C"><path data-c="1D436" d="M148 218C148 346 204 476 267 548 318 607 406 666 505 666 609 666 660 587 660 479 660 470 657 438 657 429 657 420 663 415 676 415 681 415 685 416 688 417 693 424 696 431 698 438L760 691C760 700 755 705 745 705 741 705 735 701 727 692L662 619C623 676 568 705 497 705 442 705 388 692 333 667 222 615 141 533 89 421 63 366 50 310 50 253 50 173 75 108 126 56 177 4 242-22 322-22 401-22 473 7 538 64 565 87 588 115 607 146 634 191 648 222 648 241 648 250 643 255 632 255 623 255 618 251 616 242 595 177 562 125 517 88 460 41 400 17 338 17 218 17 148 98 148 218Z"></path></g><g data-mml-node="mi" transform="translate(748,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g></g></g><g data-mml-node="mi" data-latex="x" transform="translate(6216.7,0)"><path data-c="1D465" d="M527 373C527 419 482 442 432 442 389 442 355 419 329 373 308 419 273 442 222 442 173 442 133 419 101 374 74 335 60 306 60 287 60 278 65 273 75 273 84 273 90 278 92 287 111 345 153 413 220 413 253 413 269 392 269 351 269 330 251 252 216 118 199 51 169 18 126 18 112 18 99 21 88 26 114 36 127 54 127 80 127 106 114 119 87 119 54 119 29 91 29 58 29 12 76-11 125-11 167-11 201 12 228 58 247 12 283-11 335-11 383-11 423 12 455 57 482 96 496 125 496 144 496 153 491 158 481 158 472 158 467 153 464 144 447 87 402 18 337 18 304 18 287 38 287 79 287 92 292 120 303 165L337 300C356 375 387 413 431 413 445 413 458 410 469 405 442 396 429 378 429 351 429 325 443 312 470 312 502 312 527 341 527 373Z"></path></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -1584.5 1 2669.1"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:2" transform="translate(0,990.5)"><text data-id-align="true"></text><g data-idbox="true" transform="translate(0,-748)"><g data-mml-node="mtext" data-latex="\text{(2)}"><path data-c="28" d="M318-248C327-248 332-243 332-234 332-231 330-227 327-223 275-183 233-117 202-26 175 53 161 131 161 208L161 292C161 369 175 447 202 526 233 617 275 683 327 723 330 726 332 730 332 734 332 743 327 748 318 748 317 748 314 747 311 745 251 699 201 631 160 540 121 453 101 371 101 292L101 208C101 129 121 47 160-40 201-131 251-199 311-245 314-247 317-248 318-248Z"></path><path data-c="32" d="M237 666C186 666 143 648 106 612 69 576 50 534 50 483 50 449 75 424 106 424 136 424 161 450 161 480 161 513 137 536 105 536 102 536 100 536 98 535 117 584 161 627 224 627 306 627 352 556 352 470 352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0 450 180 417 180C409 129 402 100 396 91 391 86 361 84 306 84L139 84 236 179C304 243 390 312 419 365 439 400 449 435 449 470 449 588 357 666 237 666Z" transform="translate(389,0)"></path><path data-c="29" d="M78-245C138-199 188-131 229-40 268 47 288 129 288 208L288 292C288 371 268 453 229 540 188 631 138 699 78 745 75 747 72 748 71 748 62 748 57 743 57 734 57 730 59 726 62 723 114 683 156 617 187 526 214 447 228 369 228 292L228 208C228 131 214 53 187-26 156-117 114-183 62-223 59-227 57-231 57-234 57-243 62-248 71-248 72-248 75-247 78-245Z" transform="translate(889,0)"></path></g></g></g></g></svg></g></g></g></g></svg></mjx-container></p><p>这是一个 NP 难题,因此只能采用启发式迭代方法。</p><p>K-Means 采用的启发式方式很简单,用下面一组图就可以形象的描述:</p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651998626506/202082163228.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651998626506/202082163228.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="启发式迭代"></p><p>图 a 表达了初始的数据集,假设 k = 2。在图 b 中,随机选择了两个 k 类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图 c 所示,经过计算样本和红色质心和蓝色质心的距离,得到了所有样本点的第一轮迭代后的类别。此时对当前标记为红色和蓝色的点分别求其新的质心,如图 d 所示,新的红色质心和蓝色质心的位置已经发生了变动。图 e 和图 f 重复了在图 c 和图 d 的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终得到的两个类别如图 f。</p><h3 id="K-means聚类最优k值的选取(手肘法)"><a href="#K-means聚类最优k值的选取(手肘法)" class="headerlink" title="K-means聚类最优k值的选取(手肘法)"></a><strong>K-means 聚类最优 k 值的选取(手肘法)</strong></h3><p>手肘法的核心指标是 SSE (sum of the squared errors,误差平方和),公式见上文。</p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651998667001/20208216327.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651998667001/20208216327.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="K-means聚类最优k值的选取(手肘法)"></p><p>核心思想是:随着聚类数 k 的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和 SSE 自然会逐渐变小。并且,当 k 小于真实聚类数时,由于 k 的增大会大幅增加每个簇的聚合程度,故 SSE 的下降幅度会很大,而当 k 到达真实聚类数时,再增加 k 所得到的聚合程度回报会迅速变小,所以 SSE 的下降幅度会骤减,然后随着 k 值的继续增大而趋于平缓,也就是说 SSE 和 k 的关系图是一个手肘的形状,而这个肘部对应的 k 值就是数据的真实聚类数。</p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651998696086/202082163129.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651998696086/202082163129.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="K-means聚类最优k值的选取(手肘法)"></p><h3 id="特征的规范化"><a href="#特征的规范化" class="headerlink" title="特征的规范化"></a><strong>特征的规范化</strong></h3><p>去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行计算和比较。</p><p>1、数据的中心化</p><p>所谓数据的中心化是指数据集中的各项数据减去数据集的均值。</p><p>2、数据的标准化</p><p>所谓数据的标准化是指中心化之后的数据在除以数据集的标准差,即数据集中的各项数据减去数据集的均值再除以数据集的标准差。</p><p>特征的规范化可以通过将每个特征转换为标准得分来完成。这就是说用对每个特征值求平均,用每个特征值减去平均值,然后除以特征值的标准差,如下标准分计算公式所示:<br><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true" width="full" style="min-width:38.85ex"><svg style="vertical-align:-1.951ex;min-width:38.85ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="5.033ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -1362.4)"><g data-mml-node="math" data-latex="
normalized_i=\frac{feature_i-μ_i}{δ_i}
"><g data-mml-node="mtable" data-latex="
normalized_i=\frac{feature_i-μ_i}{δ_i}
" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 1362.4) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="6507.9 -1362.4 1 2224.8"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,-18.6)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="n"><path data-c="1D45B" d="M537 137C514 58 481 18 440 18 427 18 420 28 420 47 420 61 426 84 438 115 478 224 498 296 498 333 498 403 451 442 381 442 322 442 271 416 230 363 222 407 187 442 136 442 80 442 58 390 44 345 34 313 29 294 29 287 29 278 34 273 45 273 50 273 53 274 56 276 61 285 64 292 65 299 83 375 106 413 133 413 151 413 160 399 160 371 160 358 155 331 144 290L87 63C84 50 78 24 78 19 78-1 89-11 111-11 130-11 144-1 151 19 153 24 159 49 170 92L191 181 221 295C232 318 249 341 270 365 299 397 335 413 378 413 411 413 427 391 427 348 427 310 406 234 363 120 356 102 353 87 353 74 353 25 390-11 438-11 482-11 517 14 542 64 561 104 571 131 571 144 571 153 566 158 555 158 552 158 537 149 537 137Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(600,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353 68 294 41 229 41 159 41 63 106-11 202-11 272-11 334 19 388 78 442 137 469 201 469 272 469 369 405 442 308 442M389 310C389 287 384 255 374 213 353 130 319 73 272 42 248 26 225 18 203 18 149 18 121 65 121 122 121 180 155 288 178 324 216 383 259 413 307 413 361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(1085,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442 302 442 261 419 227 372 217 411 183 442 136 442 95 442 65 410 44 345 34 312 29 293 29 287 29 278 34 273 45 273 50 273 53 274 56 276 61 285 64 292 65 299 83 375 106 413 133 413 150 413 159 399 159 371 159 358 154 331 144 290L87 63C84 50 78 24 78 19 78-1 89-11 110-11 130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343 271 381 302 413 351 413 363 413 373 411 382 406 352 397 337 378 337 351 337 325 351 312 378 312 411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="m" transform="translate(1536,0)"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353 489 412 451 442 383 442 324 442 273 416 231 363 223 407 188 442 137 442 96 442 66 409 45 344 34 312 29 293 29 287 29 278 34 273 45 273 50 273 53 274 56 276 61 285 64 292 66 299 84 375 107 413 134 413 152 413 161 399 161 371 161 358 156 331 145 290L88 63C84 51 79 25 79 19 79-1 90-11 111-11 131-11 145-1 152 19 153 24 160 49 171 92L192 181 222 295C233 318 250 341 272 365 301 397 337 413 380 413 413 413 429 391 429 348 429 335 424 308 414 267L387 153C380 124 364 64 356 32 355 25 354 21 354 19 354-1 365-11 387-11 398-11 406-8 413-1 428 14 429 21 435 48L494 285C497 298 511 321 535 353 565 393 605 413 654 413 687 413 703 391 703 348 703 309 683 236 642 129 633 106 629 87 629 74 629 25 666-11 714-11 759-11 793 14 818 64 838 104 848 131 848 144 848 153 843 158 832 158 825 157 818 148 813 137 791 58 759 18 716 18 703 18 696 28 696 47 696 62 702 84 714 115 755 222 775 295 775 333 775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2414,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158 474 158 468 151 465 137 445 58 421 18 394 18 377 18 368 32 368 60 368 73 372 97 381 132L438 357C443 376 445 387 445 392 445 412 434 422 412 422 391 422 377 410 370 387 349 424 319 442 281 442 216 442 159 409 109 343 63 281 40 217 40 150 40 63 91-11 175-11 218-11 260 12 300 58 311 20 345-11 392-11 461-11 482 70 498 144M341 374C350 353 355 339 355 330 355 326 354 321 353 314L304 122C301 111 294 99 285 87 248 41 212 18 177 18 138 18 118 48 118 107 118 131 124 167 136 215 157 300 187 357 224 388 244 405 263 413 282 413 309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="l" transform="translate(2943,0)"><path data-c="1D459" d="M173 632 49 119C46 105 44 93 44 84 44 31 83-11 136-11 185-11 220 41 241 145 241 154 236 159 225 159 217 159 211 152 208 138 188 59 165 19 138 19 121 19 113 33 113 60 113 75 115 91 119 107L258 679 258 683C255 690 249 694 242 694 210 694 136 685 124 684 109 682 102 674 102 659 102 650 111 645 130 645 147 645 173 645 173 632Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(3241,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(3586,0)"><path data-c="1D467" d="M162 92 145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359 452 397 467 420 467 428 467 437 462 442 452 442 445 442 439 438 434 429 409 388 386 368 364 368 342 368 326 386 317 398 293 427 269 442 246 442 220 442 193 430 165 404 137 378 123 352 123 326 123 316 128 311 139 311 146 311 152 316 156 325 167 354 194 368 235 368 249 368 269 363 296 354 320 345 343 340 364 339 308 284 265 244 234 217L145 134C130 119 111 99 90 74 59 35 43 12 43 3 43-6 48-11 59-11 65-11 71-6 78 4 103 43 130 63 158 63 174 63 192 51 212 26 232 1 255-11 278-11 312-11 346 7 382 42 418 77 436 111 436 144 436 153 431 158 420 158 413 158 407 153 402 143 387 100 344 63 288 63 264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(4053,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250 372 264 394 284 405 309 412 326 415 342 415 355 415 410 363 442 307 442 268 442 229 432 190 412 113 372 46 281 46 171 46 69 105-11 204-11 257-11 304 2 345 27 379 48 404 69 420 90 427 99 430 106 430 109 430 120 425 126 414 126 409 126 404 122 398 114 365 70 324 42 277 30 246 22 223 18 206 18 149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387 262 404 287 413 307 413 343 413 375 391 375 355Z"></path></g><g data-mml-node="msub" data-latex="d_i" transform="translate(4519,0)"><g data-mml-node="mi" data-latex="d"><path data-c="1D451" d="M429 632 370 389C349 426 320 445 281 445 216 445 159 412 109 345 63 283 40 218 40 151 40 63 91-11 175-11 218-11 260 12 300 59 311 21 345-11 392-11 461-11 483 71 498 145 498 154 493 159 483 159 474 159 468 152 465 138 445 59 421 19 394 19 377 19 368 33 368 60 368 75 370 91 374 107L516 679 516 683C513 690 507 694 499 694 476 694 434 690 374 683 363 682 357 674 357 660 357 650 366 645 384 645 403 645 429 646 429 632M341 376C351 355 356 341 356 332 355 328 354 323 353 316L304 122C301 111 294 99 285 87 248 42 212 19 177 19 138 19 118 49 118 108 118 132 124 168 136 216 157 301 187 359 224 390 244 407 263 415 282 415 309 415 329 402 341 376Z"></path></g><g data-mml-node="mi" transform="translate(553,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g><g data-mml-node="mo" data-latex="=" transform="translate(5643.7,0)"><path data-c="3D" d="M698 367 80 367C64 367 56 359 56 344 56 329 64 321 80 321L698 321C714 321 722 329 722 344 722 356 711 367 698 367M698 179 80 179C64 179 56 171 56 156 56 141 64 133 80 133L698 133C714 133 722 141 722 156 722 169 711 179 698 179Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{feature_i-μ_i}{δ_i}" transform="translate(6699.5,0)"><g data-mml-node="mrow" data-latex="feature_i-μ_i" transform="translate(220,676)"><g data-mml-node="mi" data-latex="f"><path data-c="1D453" d="M552 633C552 677 509 705 462 705 400 705 357 665 334 586 329 568 318 517 302 433L237 433C215 433 204 432 204 411 204 400 214 395 235 395L295 395 222 8C211-49 201-91 192-119 180-156 163-175 141-175 126-175 114-171 103-164 135-159 151-140 151-108 151-82 138-69 111-69 77-69 53-99 53-133 53-177 94-205 141-205 166-205 189-195 208-174 240-141 265-94 283-31 294 8 304 46 311 84L369 395 451 395C474 395 484 396 484 419 484 428 474 433 454 433L377 433C383 474 411 625 420 644 430 665 444 675 462 675 477 675 490 671 501 664 470 657 454 639 454 608 454 582 467 569 494 569 528 569 552 599 552 633Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(552,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250 372 264 394 284 405 309 412 326 415 342 415 355 415 410 363 442 307 442 268 442 229 432 190 412 113 372 46 281 46 171 46 69 105-11 204-11 257-11 304 2 345 27 379 48 404 69 420 90 427 99 430 106 430 109 430 120 425 126 414 126 409 126 404 122 398 114 365 70 324 42 277 30 246 22 223 18 206 18 149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387 262 404 287 413 307 413 343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1018,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158 474 158 468 151 465 137 445 58 421 18 394 18 377 18 368 32 368 60 368 73 372 97 381 132L438 357C443 376 445 387 445 392 445 412 434 422 412 422 391 422 377 410 370 387 349 424 319 442 281 442 216 442 159 409 109 343 63 281 40 217 40 150 40 63 91-11 175-11 218-11 260 12 300 58 311 20 345-11 392-11 461-11 482 70 498 144M341 374C350 353 355 339 355 330 355 326 354 321 353 314L304 122C301 111 294 99 285 87 248 41 212 18 177 18 138 18 118 48 118 107 118 131 124 167 136 215 157 300 187 357 224 388 244 405 263 413 282 413 309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(1547,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595 257 616 246 626 225 626 202 626 188 613 182 587L145 433 56 433C34 433 23 432 23 411 23 400 33 395 54 395L135 395C86 200 62 97 62 84 62 28 100-11 156-11 194-11 227 6 256 41 280 70 297 98 308 125 312 136 314 142 314 145 314 154 309 159 299 159 291 159 285 154 281 143 247 60 206 19 157 19 140 19 131 33 131 60 131 75 133 91 137 107L208 395 297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="u" transform="translate(1908,0)"><path data-c="1D462" d="M543 144C543 153 538 158 527 158 518 158 513 151 510 137 505 118 500 99 493 80 480 39 462 18 440 18 422 18 413 32 413 60 413 77 420 111 433 161L460 267C469 303 477 328 483 359L489 386C491 393 492 398 492 401 492 421 481 431 459 431 437 431 423 419 417 394L343 98C342 95 338 88 330 76 314 50 275 18 235 18 197 18 178 44 178 95 178 136 196 202 231 294 242 324 248 345 248 357 248 407 213 442 163 442 118 442 83 417 58 367 39 328 29 301 29 287 29 278 34 273 45 273 58 273 60 279 64 293 87 373 119 413 160 413 174 413 181 403 181 384 181 369 175 348 164 319 126 218 107 148 107 111 107 34 155-11 232-11 275-11 314 9 347 50 361 9 391-11 437-11 506-11 527 70 543 144Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2480,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442 302 442 261 419 227 372 217 411 183 442 136 442 95 442 65 410 44 345 34 312 29 293 29 287 29 278 34 273 45 273 50 273 53 274 56 276 61 285 64 292 65 299 83 375 106 413 133 413 150 413 159 399 159 371 159 358 154 331 144 290L87 63C84 50 78 24 78 19 78-1 89-11 110-11 130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343 271 381 302 413 351 413 363 413 373 411 382 406 352 397 337 378 337 351 337 325 351 312 378 312 411 312 436 341 436 374Z"></path></g><g data-mml-node="msub" data-latex="e_i" transform="translate(2931,0)"><g data-mml-node="mi" data-latex="e"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250 372 264 394 284 405 309 412 326 415 342 415 355 415 410 363 442 307 442 268 442 229 432 190 412 113 372 46 281 46 171 46 69 105-11 204-11 257-11 304 2 345 27 379 48 404 69 420 90 427 99 430 106 430 109 430 120 425 126 414 126 409 126 404 122 398 114 365 70 324 42 277 30 246 22 223 18 206 18 149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387 262 404 287 413 307 413 343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" transform="translate(499,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g><g data-mml-node="mo" data-latex="-" transform="translate(3946.2,0)"><path data-c="2212" d="M698 270 80 270C64 270 56 263 56 250 56 237 64 230 80 230L698 230C714 230 722 237 722 250 722 262 710 270 698 270Z"></path></g><g data-mml-node="msub" data-latex="μ_i" transform="translate(4946.4,0)"><g data-mml-node="mi" data-latex="μ"><path data-c="1D707" d="M572 142C572 151 567 156 556 156 548 156 542 149 539 136 519 56 495 16 468 16 451 16 442 30 442 58 442 75 448 109 461 159L489 266C498 302 506 327 512 358L518 386C520 393 521 398 521 400 521 421 510 431 488 431 466 431 452 419 446 394L374 108C374 97 358 77 326 47 304 26 279 16 250 16 204 16 181 43 181 98 181 117 185 144 194 181L236 347C244 378 249 400 251 411 251 432 240 442 218 442 196 442 182 429 175 403L33-169C31-177 30-182 30-185 30-206 41-216 62-216 77-216 89-208 100-193 103-186 120-117 153 14 177-4 208-13 246-13 305-13 344 18 375 54 386 17 419-13 466-13 535-13 556 68 572 142Z"></path></g><g data-mml-node="mi" transform="translate(636,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g></g><g data-mml-node="msub" data-latex="δ_i" transform="translate(2772.7,-686)"><g data-mml-node="mi" data-latex="δ"><path data-c="1D6FF" d="M452 664C452 679 444 689 428 693 377 706 339 712 315 712 244 712 201 672 201 606 201 567 220 511 259 438 156 412 76 321 51 220 46 199 43 178 43 159 43 121 52 87 71 58 101 12 145-11 202-11 244-11 282 8 317 47 372 110 400 190 400 285 400 346 380 402 339 453L332 462C267 546 235 602 235 630 235 636 236 641 239 645 249 663 265 672 288 671 305 671 326 663 351 648 382 629 401 620 408 620 430 620 452 638 452 664M111 131C111 188 125 243 154 297 185 357 225 395 274 410 296 372 311 333 320 294 323 279 324 262 324 245 324 217 321 191 315 166 290 68 252 19 203 19 146 19 111 66 111 131Z"></path></g><g data-mml-node="mi" transform="translate(477,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g><rect width="6076.3" height="60" x="120" y="220"></rect></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -1362.4 1 2224.8"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:3" transform="translate(0,729.4)"><text data-id-align="true"></text><g data-idbox="true" transform="translate(0,-748)"><g data-mml-node="mtext" data-latex="\text{(3)}"><path data-c="28" d="M318-248C327-248 332-243 332-234 332-231 330-227 327-223 275-183 233-117 202-26 175 53 161 131 161 208L161 292C161 369 175 447 202 526 233 617 275 683 327 723 330 726 332 730 332 734 332 743 327 748 318 748 317 748 314 747 311 745 251 699 201 631 160 540 121 453 101 371 101 292L101 208C101 129 121 47 160-40 201-131 251-199 311-245 314-247 317-248 318-248Z"></path><path data-c="33" d="M303 353C369 378 431 441 431 526 431 569 410 604 369 631 333 654 292 666 246 666 201 666 162 654 127 631 88 605 68 571 68 528 68 495 90 472 122 472 154 472 176 495 176 527 176 560 157 578 119 580 145 615 186 633 242 633 302 633 332 598 332 527 332 485 324 450 309 421 282 373 245 364 183 364 171 362 165 357 165 348 165 333 172 333 192 333L235 333C310 333 348 280 348 173 348 88 317 14 241 14 176 14 128 36 99 80 134 79 160 105 160 139 160 173 135 198 101 198 62 198 42 178 42 137 42 88 64 49 108 18 147-9 193-22 244-22 301-22 350-3 393 34 436 71 457 117 457 173 457 267 383 332 303 353Z" transform="translate(389,0)"></path><path data-c="29" d="M78-245C138-199 188-131 229-40 268 47 288 129 288 208L288 292C288 371 268 453 229 540 188 631 138 699 78 745 75 747 72 748 71 748 62 748 57 743 57 734 57 730 59 726 62 723 114 683 156 617 187 526 214 447 228 369 228 292L228 208C228 131 214 53 187-26 156-117 114-183 62-223 59-227 57-231 57-234 57-243 62-248 71-248 72-248 75-247 78-245Z" transform="translate(889,0)"></path></g></g></g></g></svg></g></g></g></g></svg></mjx-container></p><h3 id="类别型变量"><a href="#类别型变量" class="headerlink" title="类别型变量"></a><strong>类别型变量</strong></h3><p>类别型特征可以用 one-hot 编码转换为几个二元特征,这几个二元特征可以看成数值型维度。</p><p>使用 N 位状态寄存器来对 N 个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。</p><p>解决了分类器不好处理属性数据的问题;在一定程度上也起到了扩充特征的作用。</p><h3 id="聚类结果评价指标"><a href="#聚类结果评价指标" class="headerlink" title="聚类结果评价指标"></a><strong>聚类结果评价指标</strong></h3><h4 id="Entropy(熵)"><a href="#Entropy(熵)" class="headerlink" title="Entropy(熵)"></a><strong>Entropy(熵)</strong></h4><p>好的聚类应该和人工标签保持一致,大部分情况下,标签相同的数据点应聚在一起,而标签不同的数据点不应该在一起,并且簇内的数据点标签相同。熵值会变得很小。</p><p>对于一个聚类 i,首先计算聚类 i 中的成员(member)属于类(class)j 的概率<br><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true" width="full" style="min-width:19.652ex"><svg style="vertical-align:-1.743ex;min-width:19.652ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="4.617ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -1270.4)"><g data-mml-node="math" data-latex="
P_{ij}=\frac{m_{ij} } {m_i}
"><g data-mml-node="mtable" data-latex="
P_{ij}=\frac{m_{ij} } {m_i}
" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 1270.4) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="2265.1 -1270.4 1 2040.7"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,73.4)"><g data-mml-node="mtd"><g data-mml-node="msub" data-latex="P_{i j}"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683 235 683C212 683 201 682 201 660 201 649 212 644 234 644 254 644 294 647 294 631 294 629 293 623 290 613L158 82C152 60 142 47 128 42 121 40 103 39 72 39 50 39 40 37 40 16 40 5 46 0 59 0L184 3 248 2C259 2 299 0 312 0 328 0 336 8 336 24 336 34 325 39 304 39 264 39 244 43 244 52 244 52 245 55 247 68L307 312 472 312C537 312 599 332 657 371 722 414 754 467 754 530 754 629 660 683 555 683M524 644C611 644 654 614 654 554 654 498 626 423 597 397 559 363 509 346 447 346L313 346 379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="TeXAtom" transform="translate(675,-150) scale(0.707)" data-latex="{i j}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="j" transform="translate(345,0)"><path data-c="1D457" d="M397 621C397 648 383 661 356 661 328 661 300 633 300 605 300 578 313 565 340 565 368 565 397 593 397 621M267 444C214 444 169 404 147 369 120 326 107 299 107 287 107 278 112 274 122 274 127 274 130 275 133 276 138 284 141 291 144 296 176 375 216 414 264 414 282 414 291 400 291 373 291 358 289 341 284 323L192-46C178-104 138-175 75-175 66-175 57-174 48-171 73-161 85-143 85-118 85-92 71-79 44-79 12-79-13-108-13-140-13-184 30-205 77-205 120-205 160-190 197-160 232-131 254-94 265-51L356 311C359 324 361 337 361 349 361 404 322 444 267 444Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(1538.1,0)"><path data-c="3D" d="M698 367 80 367C64 367 56 359 56 344 56 329 64 321 80 321L698 321C714 321 722 329 722 344 722 356 711 367 698 367M698 179 80 179C64 179 56 171 56 156 56 141 64 133 80 133L698 133C714 133 722 141 722 156 722 169 711 179 698 179Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{m_{ij} } {m_i}" transform="translate(2593.8,0)"><g data-mml-node="msub" data-latex="m_{ij} " transform="translate(220,755)"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353 489 412 451 442 383 442 324 442 273 416 231 363 223 407 188 442 137 442 96 442 66 409 45 344 34 312 29 293 29 287 29 278 34 273 45 273 50 273 53 274 56 276 61 285 64 292 66 299 84 375 107 413 134 413 152 413 161 399 161 371 161 358 156 331 145 290L88 63C84 51 79 25 79 19 79-1 90-11 111-11 131-11 145-1 152 19 153 24 160 49 171 92L192 181 222 295C233 318 250 341 272 365 301 397 337 413 380 413 413 413 429 391 429 348 429 335 424 308 414 267L387 153C380 124 364 64 356 32 355 25 354 21 354 19 354-1 365-11 387-11 398-11 406-8 413-1 428 14 429 21 435 48L494 285C497 298 511 321 535 353 565 393 605 413 654 413 687 413 703 391 703 348 703 309 683 236 642 129 633 106 629 87 629 74 629 25 666-11 714-11 759-11 793 14 818 64 838 104 848 131 848 144 848 153 843 158 832 158 825 157 818 148 813 137 791 58 759 18 716 18 703 18 696 28 696 47 696 62 702 84 714 115 755 222 775 295 775 333 775 404 728 442 657 442Z"></path></g><g data-mml-node="TeXAtom" transform="translate(911,-150) scale(0.707)" data-latex="{i j}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="j" transform="translate(345,0)"><path data-c="1D457" d="M397 621C397 648 383 661 356 661 328 661 300 633 300 605 300 578 313 565 340 565 368 565 397 593 397 621M267 444C214 444 169 404 147 369 120 326 107 299 107 287 107 278 112 274 122 274 127 274 130 275 133 276 138 284 141 291 144 296 176 375 216 414 264 414 282 414 291 400 291 373 291 358 289 341 284 323L192-46C178-104 138-175 75-175 66-175 57-174 48-171 73-161 85-143 85-118 85-92 71-79 44-79 12-79-13-108-13-140-13-184 30-205 77-205 120-205 160-190 197-160 232-131 254-94 265-51L356 311C359 324 361 337 361 349 361 404 322 444 267 444Z"></path></g></g></g><g data-mml-node="msub" data-latex="m_i" transform="translate(365.7,-686)"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353 489 412 451 442 383 442 324 442 273 416 231 363 223 407 188 442 137 442 96 442 66 409 45 344 34 312 29 293 29 287 29 278 34 273 45 273 50 273 53 274 56 276 61 285 64 292 66 299 84 375 107 413 134 413 152 413 161 399 161 371 161 358 156 331 145 290L88 63C84 51 79 25 79 19 79-1 90-11 111-11 131-11 145-1 152 19 153 24 160 49 171 92L192 181 222 295C233 318 250 341 272 365 301 397 337 413 380 413 413 413 429 391 429 348 429 335 424 308 414 267L387 153C380 124 364 64 356 32 355 25 354 21 354 19 354-1 365-11 387-11 398-11 406-8 413-1 428 14 429 21 435 48L494 285C497 298 511 321 535 353 565 393 605 413 654 413 687 413 703 391 703 348 703 309 683 236 642 129 633 106 629 87 629 74 629 25 666-11 714-11 759-11 793 14 818 64 838 104 848 131 848 144 848 153 843 158 832 158 825 157 818 148 813 137 791 58 759 18 716 18 703 18 696 28 696 47 696 62 702 84 714 115 755 222 775 295 775 333 775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" transform="translate(911,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g><rect width="1696.3" height="60" x="120" y="220"></rect></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -1270.4 1 2040.7"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:4" transform="translate(0,821.4)"><text data-id-align="true"></text><g data-idbox="true" transform="translate(0,-748)"><g data-mml-node="mtext" data-latex="\text{(4)}"><path data-c="28" d="M318-248C327-248 332-243 332-234 332-231 330-227 327-223 275-183 233-117 202-26 175 53 161 131 161 208L161 292C161 369 175 447 202 526 233 617 275 683 327 723 330 726 332 730 332 734 332 743 327 748 318 748 317 748 314 747 311 745 251 699 201 631 160 540 121 453 101 371 101 292L101 208C101 129 121 47 160-40 201-131 251-199 311-245 314-247 317-248 318-248Z"></path><path data-c="34" d="M353 677C344 677 336 672 330 663L28 199 28 163 289 163 289 81C289 63 285 51 278 46 271 41 252 39 219 39L194 39 194 0C223 2 269 3 331 3 393 3 439 2 468 0L468 39 443 39C410 39 391 41 384 46 377 51 373 63 373 81L373 163 471 163 471 202 373 202 373 660C373 670 366 677 353 677M295 553 295 202 67 202Z" transform="translate(389,0)"></path><path data-c="29" d="M78-245C138-199 188-131 229-40 268 47 288 129 288 208L288 292C288 371 268 453 229 540 188 631 138 699 78 745 75 747 72 748 71 748 62 748 57 743 57 734 57 730 59 726 62 723 114 683 156 617 187 526 214 447 228 369 228 292L228 208C228 131 214 53 187-26 156-117 114-183 62-223 59-227 57-231 57-234 57-243 62-248 71-248 72-248 75-247 78-245Z" transform="translate(889,0)"></path></g></g></g></g></svg></g></g></g></g></svg></mjx-container><br>其中<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align:-.357ex" xmlns="http://www.w3.org/2000/svg" width="2.726ex" height="1.357ex" role="img" focusable="false" viewBox="0 -442 1205 599.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="m_{i}"><g data-mml-node="msub" data-latex="m_{i}"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353 489 412 451 442 383 442 324 442 273 416 231 363 223 407 188 442 137 442 96 442 66 409 45 344 34 312 29 293 29 287 29 278 34 273 45 273 50 273 53 274 56 276 61 285 64 292 66 299 84 375 107 413 134 413 152 413 161 399 161 371 161 358 156 331 145 290L88 63C84 51 79 25 79 19 79-1 90-11 111-11 131-11 145-1 152 19 153 24 160 49 171 92L192 181 222 295C233 318 250 341 272 365 301 397 337 413 380 413 413 413 429 391 429 348 429 335 424 308 414 267L387 153C380 124 364 64 356 32 355 25 354 21 354 19 354-1 365-11 387-11 398-11 406-8 413-1 428 14 429 21 435 48L494 285C497 298 511 321 535 353 565 393 605 413 654 413 687 413 703 391 703 348 703 309 683 236 642 129 633 106 629 87 629 74 629 25 666-11 714-11 759-11 793 14 818 64 838 104 848 131 848 144 848 153 843 158 832 158 825 157 818 148 813 137 791 58 759 18 716 18 703 18 696 28 696 47 696 62 702 84 714 115 755 222 775 295 775 333 775 404 728 442 657 442Z"></path></g><g data-mml-node="TeXAtom" transform="translate(911,-150) scale(0.707)" data-latex="{i}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g></g></g></g></svg></mjx-container>是在聚类 i 中所有成员的个数,<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align:-.667ex" xmlns="http://www.w3.org/2000/svg" width="3.385ex" height="1.667ex" role="img" focusable="false" viewBox="0 -442 1496.3 737"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="m_{ij}"><g data-mml-node="msub" data-latex="m_{ij}"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353 489 412 451 442 383 442 324 442 273 416 231 363 223 407 188 442 137 442 96 442 66 409 45 344 34 312 29 293 29 287 29 278 34 273 45 273 50 273 53 274 56 276 61 285 64 292 66 299 84 375 107 413 134 413 152 413 161 399 161 371 161 358 156 331 145 290L88 63C84 51 79 25 79 19 79-1 90-11 111-11 131-11 145-1 152 19 153 24 160 49 171 92L192 181 222 295C233 318 250 341 272 365 301 397 337 413 380 413 413 413 429 391 429 348 429 335 424 308 414 267L387 153C380 124 364 64 356 32 355 25 354 21 354 19 354-1 365-11 387-11 398-11 406-8 413-1 428 14 429 21 435 48L494 285C497 298 511 321 535 353 565 393 605 413 654 413 687 413 703 391 703 348 703 309 683 236 642 129 633 106 629 87 629 74 629 25 666-11 714-11 759-11 793 14 818 64 838 104 848 131 848 144 848 153 843 158 832 158 825 157 818 148 813 137 791 58 759 18 716 18 703 18 696 28 696 47 696 62 702 84 714 115 755 222 775 295 775 333 775 404 728 442 657 442Z"></path></g><g data-mml-node="TeXAtom" transform="translate(911,-150) scale(0.707)" data-latex="{i j}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="j" transform="translate(345,0)"><path data-c="1D457" d="M397 621C397 648 383 661 356 661 328 661 300 633 300 605 300 578 313 565 340 565 368 565 397 593 397 621M267 444C214 444 169 404 147 369 120 326 107 299 107 287 107 278 112 274 122 274 127 274 130 275 133 276 138 284 141 291 144 296 176 375 216 414 264 414 282 414 291 400 291 373 291 358 289 341 284 323L192-46C178-104 138-175 75-175 66-175 57-174 48-171 73-161 85-143 85-118 85-92 71-79 44-79 12-79-13-108-13-140-13-184 30-205 77-205 120-205 160-190 197-160 232-131 254-94 265-51L356 311C359 324 361 337 361 349 361 404 322 444 267 444Z"></path></g></g></g></g></g></svg></mjx-container>是聚类 i 中的成员属于类 j 的个数。</p><p>每个聚类的 entropy 可以表示为<br><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true" width="full" style="min-width:29.536ex"><svg style="vertical-align:-2.903ex;min-width:29.536ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="6.938ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -1783.3)"><g data-mml-node="math" data-latex="
e_i=-\sum_{j=1}^{L}P_{ij}log_2P_{ij}
"><g data-mml-node="mtable" data-latex="
e_i=-\sum_{j=1}^{L}P_{ij}log_2 P_{ij}
" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 1783.3) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="4449.5 -1783.3 1 3066.6"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,49.6)"><g data-mml-node="mtd"><g data-mml-node="msub" data-latex="e_i"><g data-mml-node="mi" data-latex="e"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250 372 264 394 284 405 309 412 326 415 342 415 355 415 410 363 442 307 442 268 442 229 432 190 412 113 372 46 281 46 171 46 69 105-11 204-11 257-11 304 2 345 27 379 48 404 69 420 90 427 99 430 106 430 109 430 120 425 126 414 126 409 126 404 122 398 114 365 70 324 42 277 30 246 22 223 18 206 18 149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387 262 404 287 413 307 413 343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" transform="translate(499,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g><g data-mml-node="mo" data-latex="=" transform="translate(1070.7,0)"><path data-c="3D" d="M698 367 80 367C64 367 56 359 56 344 56 329 64 321 80 321L698 321C714 321 722 329 722 344 722 356 711 367 698 367M698 179 80 179C64 179 56 171 56 156 56 141 64 133 80 133L698 133C714 133 722 141 722 156 722 169 711 179 698 179Z"></path></g><g data-mml-node="mo" data-latex="-" transform="translate(2126.5,0)"><path data-c="2212" d="M698 270 80 270C64 270 56 263 56 250 56 237 64 230 80 230L698 230C714 230 722 237 722 250 722 262 710 270 698 270Z"></path></g><g data-mml-node="munderover" data-latex="\sum_{j=1}^{L}" transform="translate(3071.2,0)"><g data-mml-node="mo" data-latex="\sum"><path data-c="2211" d="M1265-450 1389-124 1355-124C1336-174 1304-216 1258-250 1145-334 1000-356 791-356L200-356 700 232C707 239 710 246 710 251L244 894 781 894C970 894 1127 870 1230 804 1290 766 1332 719 1356 663L1389 663 1265 950 88 950C70 950 60 947 57 941 56 938 56 926 56 905L581 187 68-415C61-423 57-430 57-435 57-445 67-450 88-450Z"></path></g><g data-mml-node="TeXAtom" transform="translate(124.5,-1087.9) scale(0.707)" data-latex="{j=1}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="j"><path data-c="1D457" d="M397 621C397 648 383 661 356 661 328 661 300 633 300 605 300 578 313 565 340 565 368 565 397 593 397 621M267 444C214 444 169 404 147 369 120 326 107 299 107 287 107 278 112 274 122 274 127 274 130 275 133 276 138 284 141 291 144 296 176 375 216 414 264 414 282 414 291 400 291 373 291 358 289 341 284 323L192-46C178-104 138-175 75-175 66-175 57-174 48-171 73-161 85-143 85-118 85-92 71-79 44-79 12-79-13-108-13-140-13-184 30-205 77-205 120-205 160-190 197-160 232-131 254-94 265-51L356 311C359 324 361 337 361 349 361 404 322 444 267 444Z"></path></g><g data-mml-node="mo" data-latex="=" transform="translate(412,0)"><path data-c="3D" d="M698 367 80 367C64 367 56 359 56 344 56 329 64 321 80 321L698 321C714 321 722 329 722 344 722 356 711 367 698 367M698 179 80 179C64 179 56 171 56 156 56 141 64 133 80 133L698 133C714 133 722 141 722 156 722 169 711 179 698 179Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(1190,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47 195 42 170 39 130 39L95 39 95 0C120 2 174 3 257 3 340 3 394 2 419 0L419 39 384 39C343 39 318 42 310 47 302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="TeXAtom" transform="translate(481.2,1150) scale(0.707)" data-latex="{L}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="L"><path data-c="1D43F" d="M520 667C520 678 513 683 500 683L354 680 223 683C208 684 200 676 200 659 200 652 203 647 209 646 218 645 226 644 231 644 262 643 279 641 284 640 289 639 292 636 292 631 292 629 291 623 288 613L156 82C150 60 140 47 125 42 119 40 101 39 70 39 49 39 39 31 39 15 39 5 49 0 70 0L527 0C552 0 554 0 561 19L639 233C642 240 643 245 643 248 643 258 638 263 627 263 617 263 612 254 607 240 588 191 570 154 555 131 518 75 455 39 363 39L270 39C259 39 252 39 249 40 242 40 239 42 239 45 239 47 241 54 244 67L377 601C383 624 396 637 415 642 421 643 442 644 478 644 506 644 520 644 520 667Z"></path></g></g></g><g data-mml-node="msub" data-latex="P_{i j}" transform="translate(4681.8,0)"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683 235 683C212 683 201 682 201 660 201 649 212 644 234 644 254 644 294 647 294 631 294 629 293 623 290 613L158 82C152 60 142 47 128 42 121 40 103 39 72 39 50 39 40 37 40 16 40 5 46 0 59 0L184 3 248 2C259 2 299 0 312 0 328 0 336 8 336 24 336 34 325 39 304 39 264 39 244 43 244 52 244 52 245 55 247 68L307 312 472 312C537 312 599 332 657 371 722 414 754 467 754 530 754 629 660 683 555 683M524 644C611 644 654 614 654 554 654 498 626 423 597 397 559 363 509 346 447 346L313 346 379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="TeXAtom" transform="translate(675,-150) scale(0.707)" data-latex="{i j}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="j" transform="translate(345,0)"><path data-c="1D457" d="M397 621C397 648 383 661 356 661 328 661 300 633 300 605 300 578 313 565 340 565 368 565 397 593 397 621M267 444C214 444 169 404 147 369 120 326 107 299 107 287 107 278 112 274 122 274 127 274 130 275 133 276 138 284 141 291 144 296 176 375 216 414 264 414 282 414 291 400 291 373 291 358 289 341 284 323L192-46C178-104 138-175 75-175 66-175 57-174 48-171 73-161 85-143 85-118 85-92 71-79 44-79 12-79-13-108-13-140-13-184 30-205 77-205 120-205 160-190 197-160 232-131 254-94 265-51L356 311C359 324 361 337 361 349 361 404 322 444 267 444Z"></path></g></g></g><g data-mml-node="mi" data-latex="l" transform="translate(5942.1,0)"><path data-c="1D459" d="M173 632 49 119C46 105 44 93 44 84 44 31 83-11 136-11 185-11 220 41 241 145 241 154 236 159 225 159 217 159 211 152 208 138 188 59 165 19 138 19 121 19 113 33 113 60 113 75 115 91 119 107L258 679 258 683C255 690 249 694 242 694 210 694 136 685 124 684 109 682 102 674 102 659 102 650 111 645 130 645 147 645 173 645 173 632Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(6240.1,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353 68 294 41 229 41 159 41 63 106-11 202-11 272-11 334 19 388 78 442 137 469 201 469 272 469 369 405 442 308 442M389 310C389 287 384 255 374 213 353 130 319 73 272 42 248 26 225 18 203 18 149 18 121 65 121 122 121 180 155 288 178 324 216 383 259 413 307 413 361 413 389 367 389 310Z"></path></g><g data-mml-node="msub" data-latex="g_2" transform="translate(6725.1,0)"><g data-mml-node="mi" data-latex="g"><path data-c="1D454" d="M15-141C15-184 60-205 150-205 197-205 241-193 280-170 324-144 351-109 362-66L471 373C473 383 474 389 474 392 474 412 463 422 442 422 420 422 406 410 399 387 377 424 347 442 310 442 246 442 189 410 140 346 95 286 72 223 72 158 72 71 123-3 207-3 246-3 282 14 315 47L285-71C256-140 211-175 148-175 122-175 100-173 82-169 103-158 113-141 113-118 113-93 99-80 72-80 40-80 15-109 15-141M356 392C376 371 386 351 386 331 386 330 385 325 383 318L336 129C330 106 313 82 286 60 259 38 233 27 210 27 170 27 150 56 150 114 150 169 184 291 204 327 235 384 270 412 311 412 329 412 344 405 356 392Z"></path></g><g data-mml-node="mn" transform="translate(510,-150) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612 69 576 50 534 50 483 50 449 75 424 106 424 136 424 161 450 161 480 161 513 137 536 105 536 102 536 100 536 98 535 117 584 161 627 224 627 306 627 352 556 352 470 352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0 450 180 417 180C409 129 402 100 396 91 391 86 361 84 306 84L139 84 236 179C304 243 390 312 419 365 439 400 449 435 449 470 449 588 357 666 237 666Z"></path></g></g><g data-mml-node="msub" data-latex="P_{i j}" transform="translate(7638.7,0)"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683 235 683C212 683 201 682 201 660 201 649 212 644 234 644 254 644 294 647 294 631 294 629 293 623 290 613L158 82C152 60 142 47 128 42 121 40 103 39 72 39 50 39 40 37 40 16 40 5 46 0 59 0L184 3 248 2C259 2 299 0 312 0 328 0 336 8 336 24 336 34 325 39 304 39 264 39 244 43 244 52 244 52 245 55 247 68L307 312 472 312C537 312 599 332 657 371 722 414 754 467 754 530 754 629 660 683 555 683M524 644C611 644 654 614 654 554 654 498 626 423 597 397 559 363 509 346 447 346L313 346 379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="TeXAtom" transform="translate(675,-150) scale(0.707)" data-latex="{i j}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="j" transform="translate(345,0)"><path data-c="1D457" d="M397 621C397 648 383 661 356 661 328 661 300 633 300 605 300 578 313 565 340 565 368 565 397 593 397 621M267 444C214 444 169 404 147 369 120 326 107 299 107 287 107 278 112 274 122 274 127 274 130 275 133 276 138 284 141 291 144 296 176 375 216 414 264 414 282 414 291 400 291 373 291 358 289 341 284 323L192-46C178-104 138-175 75-175 66-175 57-174 48-171 73-161 85-143 85-118 85-92 71-79 44-79 12-79-13-108-13-140-13-184 30-205 77-205 120-205 160-190 197-160 232-131 254-94 265-51L356 311C359 324 361 337 361 349 361 404 322 444 267 444Z"></path></g></g></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -1783.3 1 3066.6"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:5" transform="translate(0,797.6)"><text data-id-align="true"></text><g data-idbox="true" transform="translate(0,-748)"><g data-mml-node="mtext" data-latex="\text{(5)}"><path data-c="28" d="M318-248C327-248 332-243 332-234 332-231 330-227 327-223 275-183 233-117 202-26 175 53 161 131 161 208L161 292C161 369 175 447 202 526 233 617 275 683 327 723 330 726 332 730 332 734 332 743 327 748 318 748 317 748 314 747 311 745 251 699 201 631 160 540 121 453 101 371 101 292L101 208C101 129 121 47 160-40 201-131 251-199 311-245 314-247 317-248 318-248Z"></path><path data-c="35" d="M118 315C123 315 129 319 134 326 164 371 205 393 257 393 292 393 319 373 337 332 348 305 354 264 354 209 354 146 346 102 331 76 306 35 272 14 229 14 162 14 109 62 91 114 94 113 96 114 100 114 130 114 155 137 155 167 155 198 130 219 100 219 65 219 50 200 50 163 50 63 131-22 231-22 292-22 344 0 386 44 428 88 449 141 449 202 449 260 432 310 398 353 361 400 315 423 259 423 212 423 171 408 138 378L138 556C165 548 191 544 218 544 264 544 304 555 338 578 369 597 390 616 402 634 408 642 411 648 411 651 411 661 406 666 396 666 341 645 294 634 256 634 211 634 168 643 127 662 122 664 118 665 114 665 105 665 100 656 100 637L100 345C100 324 100 315 118 315Z" transform="translate(389,0)"></path><path data-c="29" d="M78-245C138-199 188-131 229-40 268 47 288 129 288 208L288 292C288 371 268 453 229 540 188 631 138 699 78 745 75 747 72 748 71 748 62 748 57 743 57 734 57 730 59 726 62 723 114 683 156 617 187 526 214 447 228 369 228 292L228 208C228 131 214 53 187-26 156-117 114-183 62-223 59-227 57-231 57-234 57-243 62-248 71-248 72-248 75-247 78-245Z" transform="translate(889,0)"></path></g></g></g></g></svg></g></g></g></g></svg></mjx-container><br>其中 L 是类(class)的个数。</p><p>整个聚类划分的 entropy 为<br><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true" width="full" style="min-width:22.634ex"><svg style="vertical-align:-2.748ex;min-width:22.634ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="6.628ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -1714.7)"><g data-mml-node="math" data-latex="
e=\sum_{i=1}^{K}\frac{m_i}{m}e_i
"><g data-mml-node="mtable" data-latex="
e=\sum_{i=1}^{K}\frac{m_i}{m}e_i
" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 1714.7) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="2924.1 -1714.7 1 2929.4"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,-19)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="e"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250 372 264 394 284 405 309 412 326 415 342 415 355 415 410 363 442 307 442 268 442 229 432 190 412 113 372 46 281 46 171 46 69 105-11 204-11 257-11 304 2 345 27 379 48 404 69 420 90 427 99 430 106 430 109 430 120 425 126 414 126 409 126 404 122 398 114 365 70 324 42 277 30 246 22 223 18 206 18 149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387 262 404 287 413 307 413 343 413 375 391 375 355Z"></path></g><g data-mml-node="mo" data-latex="=" transform="translate(743.8,0)"><path data-c="3D" d="M698 367 80 367C64 367 56 359 56 344 56 329 64 321 80 321L698 321C714 321 722 329 722 344 722 356 711 367 698 367M698 179 80 179C64 179 56 171 56 156 56 141 64 133 80 133L698 133C714 133 722 141 722 156 722 169 711 179 698 179Z"></path></g><g data-mml-node="munderover" data-latex="\sum_{i=1}^{K}" transform="translate(1799.6,0)"><g data-mml-node="mo" data-latex="\sum"><path data-c="2211" d="M1265-450 1389-124 1355-124C1336-174 1304-216 1258-250 1145-334 1000-356 791-356L200-356 700 232C707 239 710 246 710 251L244 894 781 894C970 894 1127 870 1230 804 1290 766 1332 719 1356 663L1389 663 1265 950 88 950C70 950 60 947 57 941 56 938 56 926 56 905L581 187 68-415C61-423 57-430 57-435 57-445 67-450 88-450Z"></path></g><g data-mml-node="TeXAtom" transform="translate(148.2,-1087.9) scale(0.707)" data-latex="{i=1}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g><g data-mml-node="mo" data-latex="=" transform="translate(345,0)"><path data-c="3D" d="M698 367 80 367C64 367 56 359 56 344 56 329 64 321 80 321L698 321C714 321 722 329 722 344 722 356 711 367 698 367M698 179 80 179C64 179 56 171 56 156 56 141 64 133 80 133L698 133C714 133 722 141 722 156 722 169 711 179 698 179Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(1123,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47 195 42 170 39 130 39L95 39 95 0C120 2 174 3 257 3 340 3 394 2 419 0L419 39 384 39C343 39 318 42 310 47 302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="TeXAtom" transform="translate(407.7,1150) scale(0.707)" data-latex="{K}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="K"><path data-c="1D43E" d="M804 680C783 680 715 683 694 683 679 683 671 675 671 659 671 651 678 646 692 643 706 640 714 635 714 628 714 617 703 602 680 585L302 296 379 602C384 623 393 636 406 641 412 643 429 644 458 644 484 644 496 644 496 668 496 678 490 683 478 683L351 680 223 683C207 684 199 676 199 660 199 649 210 644 232 644 252 644 293 647 293 631 293 629 292 623 289 613L156 82C151 60 141 47 126 42 119 40 101 39 70 39 48 39 38 37 38 16 38 5 44 0 57 0L183 3 246 2C257 2 299 0 310 0 326 0 334 8 334 24 334 34 324 39 303 39 262 39 242 43 242 52 242 57 245 72 251 95L290 249 433 359 546 98C553 81 557 70 557 65 557 48 541 39 510 39 492 39 484 35 484 15 484 5 490 0 502 0 524 0 600 3 622 3 641 3 701 0 720 0 734 0 741 8 741 24 741 33 733 38 718 39 677 39 667 50 653 81L512 404C511 409 509 413 508 416L708 570C757 608 799 631 833 639 857 643 889 642 889 668 889 678 884 683 874 683 860 683 818 680 804 680Z"></path></g></g></g><g data-mml-node="mfrac" data-latex="\frac{m_i}{m}" transform="translate(3410.2,0)"><g data-mml-node="msub" data-latex="m_i" transform="translate(220,676)"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353 489 412 451 442 383 442 324 442 273 416 231 363 223 407 188 442 137 442 96 442 66 409 45 344 34 312 29 293 29 287 29 278 34 273 45 273 50 273 53 274 56 276 61 285 64 292 66 299 84 375 107 413 134 413 152 413 161 399 161 371 161 358 156 331 145 290L88 63C84 51 79 25 79 19 79-1 90-11 111-11 131-11 145-1 152 19 153 24 160 49 171 92L192 181 222 295C233 318 250 341 272 365 301 397 337 413 380 413 413 413 429 391 429 348 429 335 424 308 414 267L387 153C380 124 364 64 356 32 355 25 354 21 354 19 354-1 365-11 387-11 398-11 406-8 413-1 428 14 429 21 435 48L494 285C497 298 511 321 535 353 565 393 605 413 654 413 687 413 703 391 703 348 703 309 683 236 642 129 633 106 629 87 629 74 629 25 666-11 714-11 759-11 793 14 818 64 838 104 848 131 848 144 848 153 843 158 832 158 825 157 818 148 813 137 791 58 759 18 716 18 703 18 696 28 696 47 696 62 702 84 714 115 755 222 775 295 775 333 775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" transform="translate(911,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g><g data-mml-node="mi" data-latex="m" transform="translate(383.5,-686)"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353 489 412 451 442 383 442 324 442 273 416 231 363 223 407 188 442 137 442 96 442 66 409 45 344 34 312 29 293 29 287 29 278 34 273 45 273 50 273 53 274 56 276 61 285 64 292 66 299 84 375 107 413 134 413 152 413 161 399 161 371 161 358 156 331 145 290L88 63C84 51 79 25 79 19 79-1 90-11 111-11 131-11 145-1 152 19 153 24 160 49 171 92L192 181 222 295C233 318 250 341 272 365 301 397 337 413 380 413 413 413 429 391 429 348 429 335 424 308 414 267L387 153C380 124 364 64 356 32 355 25 354 21 354 19 354-1 365-11 387-11 398-11 406-8 413-1 428 14 429 21 435 48L494 285C497 298 511 321 535 353 565 393 605 413 654 413 687 413 703 391 703 348 703 309 683 236 642 129 633 106 629 87 629 74 629 25 666-11 714-11 759-11 793 14 818 64 838 104 848 131 848 144 848 153 843 158 832 158 825 157 818 148 813 137 791 58 759 18 716 18 703 18 696 28 696 47 696 62 702 84 714 115 755 222 775 295 775 333 775 404 728 442 657 442Z"></path></g><rect width="1405" height="60" x="120" y="220"></rect></g><g data-mml-node="msub" data-latex="e_i" transform="translate(5055.2,0)"><g data-mml-node="mi" data-latex="e"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250 372 264 394 284 405 309 412 326 415 342 415 355 415 410 363 442 307 442 268 442 229 432 190 412 113 372 46 281 46 171 46 69 105-11 204-11 257-11 304 2 345 27 379 48 404 69 420 90 427 99 430 106 430 109 430 120 425 126 414 126 409 126 404 122 398 114 365 70 324 42 277 30 246 22 223 18 206 18 149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387 262 404 287 413 307 413 343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" transform="translate(499,-150) scale(0.707)" data-latex="i"><path data-c="1D456" d="M284 621C284 648 271 661 244 661 216 661 188 633 188 605 188 578 202 565 229 565 257 565 284 593 284 621M259 138C237 59 205 19 164 19 151 19 144 28 144 47 144 64 173 150 232 306 240 329 244 347 244 360 244 409 210 445 161 445 118 445 84 420 59 369 39 328 29 301 29 288 29 279 34 275 45 275 58 275 60 281 64 295 87 375 118 415 158 415 171 415 178 406 178 387 178 373 175 357 168 338 145 275 121 208 101 155 86 115 78 88 78 74 78 25 114-11 162-11 205-11 239 14 264 64 283 103 293 130 293 145 293 154 288 159 277 159 274 159 259 150 259 138Z"></path></g></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -1714.7 1 2929.4"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:6" transform="translate(0,729)"><text data-id-align="true"></text><g data-idbox="true" transform="translate(0,-748)"><g data-mml-node="mtext" data-latex="\text{(6)}"><path data-c="28" d="M318-248C327-248 332-243 332-234 332-231 330-227 327-223 275-183 233-117 202-26 175 53 161 131 161 208L161 292C161 369 175 447 202 526 233 617 275 683 327 723 330 726 332 730 332 734 332 743 327 748 318 748 317 748 314 747 311 745 251 699 201 631 160 540 121 453 101 371 101 292L101 208C101 129 121 47 160-40 201-131 251-199 311-245 314-247 317-248 318-248Z"></path><path data-c="36" d="M383 504C416 504 432 521 432 555 432 627 378 666 304 666 221 666 155 627 106 548 63 480 42 403 42 316 42 189 65 100 112 47 152 1 198-22 251-22 312-22 362 1 401 47 438 91 457 144 457 205 457 266 439 318 403 361 365 407 316 431 257 431 205 431 165 402 138 346L138 352C138 465 166 561 226 605 252 624 279 633 306 633 342 633 368 623 385 602 351 602 334 583 334 553 334 525 355 504 383 504M344 340C355 317 361 272 361 206 361 141 356 98 345 76 325 35 294 14 251 14 222 14 200 24 184 44 171 60 162 74 158 85 146 116 140 163 140 227 140 255 144 282 151 308 164 355 201 399 256 399 295 399 325 379 344 340Z" transform="translate(389,0)"></path><path data-c="29" d="M78-245C138-199 188-131 229-40 268 47 288 129 288 208L288 292C288 371 268 453 229 540 188 631 138 699 78 745 75 747 72 748 71 748 62 748 57 743 57 734 57 730 59 726 62 723 114 683 156 617 187 526 214 447 228 369 228 292L228 208C228 131 214 53 187-26 156-117 114-183 62-223 59-227 57-231 57-234 57-243 62-248 71-248 72-248 75-247 78-245Z" transform="translate(889,0)"></path></g></g></g></g></svg></g></g></g></g></svg></mjx-container><br>其中 K 是聚类(cluster)的数目,m 是整个聚类划分所涉及到的成员个数。</p><h4 id="Accuracy-准确率"><a href="#Accuracy-准确率" class="headerlink" title="Accuracy(准确率)"></a><strong>Accuracy (准确率)</strong></h4><p>比较每一条聚类结果是否和真的结果一致.</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true" width="full" style="min-width:20.766ex"><svg style="vertical-align:-1.748ex;min-width:20.766ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="4.627ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -1272.5)"><g data-mml-node="math" data-latex="
acc=\frac{N_{cor} } {N}
"><g data-mml-node="mtable" data-latex="
acc=\frac{N_{cor} } {N}
" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 1272.5) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="2511.3 -1272.5 1 2045"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,-86.5)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="a"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158 474 158 468 151 465 137 445 58 421 18 394 18 377 18 368 32 368 60 368 73 372 97 381 132L438 357C443 376 445 387 445 392 445 412 434 422 412 422 391 422 377 410 370 387 349 424 319 442 281 442 216 442 159 409 109 343 63 281 40 217 40 150 40 63 91-11 175-11 218-11 260 12 300 58 311 20 345-11 392-11 461-11 482 70 498 144M341 374C350 353 355 339 355 330 355 326 354 321 353 314L304 122C301 111 294 99 285 87 248 41 212 18 177 18 138 18 118 48 118 107 118 131 124 167 136 215 157 300 187 357 224 388 244 405 263 413 282 413 309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="c" transform="translate(529,0)"><path data-c="1D450" d="M328 325C328 300 341 287 368 287 404 287 427 318 427 354 427 410 368 442 308 442 239 442 176 412 122 353 68 294 41 229 41 159 41 61 106-11 204-11 257-11 304 2 345 27 379 48 404 69 420 90 427 99 430 106 430 109 430 120 425 126 414 126 409 126 404 122 398 114 365 70 324 42 277 30 246 22 223 18 206 18 149 18 121 53 121 122 121 184 150 274 174 317 198 361 249 413 308 413 346 413 372 402 386 381 355 378 328 358 328 325Z"></path></g><g data-mml-node="mi" data-latex="c" transform="translate(962,0)"><path data-c="1D450" d="M328 325C328 300 341 287 368 287 404 287 427 318 427 354 427 410 368 442 308 442 239 442 176 412 122 353 68 294 41 229 41 159 41 61 106-11 204-11 257-11 304 2 345 27 379 48 404 69 420 90 427 99 430 106 430 109 430 120 425 126 414 126 409 126 404 122 398 114 365 70 324 42 277 30 246 22 223 18 206 18 149 18 121 53 121 122 121 184 150 274 174 317 198 361 249 413 308 413 346 413 372 402 386 381 355 378 328 358 328 325Z"></path></g><g data-mml-node="mo" data-latex="=" transform="translate(1672.8,0)"><path data-c="3D" d="M698 367 80 367C64 367 56 359 56 344 56 329 64 321 80 321L698 321C714 321 722 329 722 344 722 356 711 367 698 367M698 179 80 179C64 179 56 171 56 156 56 141 64 133 80 133L698 133C714 133 722 141 722 156 722 169 711 179 698 179Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{N_{cor} } {N}" transform="translate(2728.6,0)"><g data-mml-node="msub" data-latex="N_{cor} " transform="translate(220,676)"><g data-mml-node="mi" data-latex="N"><path data-c="1D441" d="M864 683C845 683 783 680 764 680 745 680 682 683 663 683 648 683 641 675 641 659 641 650 648 645 663 644 705 644 726 631 726 605 726 599 725 592 724 585L616 157 401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659 200 649 211 644 232 644 274 644 295 643 296 640L163 110C154 71 131 49 95 42 69 39 39 43 39 15 39 5 45 0 56 0 74 0 136 3 155 3 174 3 238 0 257 0 272 0 279 8 279 24 279 33 271 38 255 39 214 40 194 53 194 78 194 83 195 90 197 100L326 611 576 21C582 7 590 0 599 0 608 0 614 8 618 24L757 574C770 625 798 643 860 644 874 645 881 653 881 669 878 678 877 683 864 683Z"></path></g><g data-mml-node="TeXAtom" transform="translate(836,-150) scale(0.707)" data-latex="{c o r}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="c"><path data-c="1D450" d="M328 325C328 300 341 287 368 287 404 287 427 318 427 354 427 410 368 442 308 442 239 442 176 412 122 353 68 294 41 229 41 159 41 61 106-11 204-11 257-11 304 2 345 27 379 48 404 69 420 90 427 99 430 106 430 109 430 120 425 126 414 126 409 126 404 122 398 114 365 70 324 42 277 30 246 22 223 18 206 18 149 18 121 53 121 122 121 184 150 274 174 317 198 361 249 413 308 413 346 413 372 402 386 381 355 378 328 358 328 325Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(433,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353 68 294 41 229 41 159 41 63 106-11 202-11 272-11 334 19 388 78 442 137 469 201 469 272 469 369 405 442 308 442M389 310C389 287 384 255 374 213 353 130 319 73 272 42 248 26 225 18 203 18 149 18 121 65 121 122 121 180 155 288 178 324 216 383 259 413 307 413 361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(918,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442 302 442 261 419 227 372 217 411 183 442 136 442 95 442 65 410 44 345 34 312 29 293 29 287 29 278 34 273 45 273 50 273 53 274 56 276 61 285 64 292 65 299 83 375 106 413 133 413 150 413 159 399 159 371 159 358 154 331 144 290L87 63C84 50 78 24 78 19 78-1 89-11 110-11 130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343 271 381 302 413 351 413 363 413 373 411 382 406 352 397 337 378 337 351 337 325 351 312 378 312 411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mi" data-latex="N" transform="translate(706.5,-686)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680 745 680 682 683 663 683 648 683 641 675 641 659 641 650 648 645 663 644 705 644 726 631 726 605 726 599 725 592 724 585L616 157 401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659 200 649 211 644 232 644 274 644 295 643 296 640L163 110C154 71 131 49 95 42 69 39 39 43 39 15 39 5 45 0 56 0 74 0 136 3 155 3 174 3 238 0 257 0 272 0 279 8 279 24 279 33 271 38 255 39 214 40 194 53 194 78 194 83 195 90 197 100L326 611 576 21C582 7 590 0 599 0 608 0 614 8 618 24L757 574C770 625 798 643 860 644 874 645 881 653 881 669 878 678 877 683 864 683Z"></path></g><rect width="2054" height="60" x="120" y="220"></rect></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -1272.5 1 2045"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:7" transform="translate(0,661.5)"><text data-id-align="true"></text><g data-idbox="true" transform="translate(0,-748)"><g data-mml-node="mtext" data-latex="\text{(7)}"><path data-c="28" d="M318-248C327-248 332-243 332-234 332-231 330-227 327-223 275-183 233-117 202-26 175 53 161 131 161 208L161 292C161 369 175 447 202 526 233 617 275 683 327 723 330 726 332 730 332 734 332 743 327 748 318 748 317 748 314 747 311 745 251 699 201 631 160 540 121 453 101 371 101 292L101 208C101 129 121 47 160-40 201-131 251-199 311-245 314-247 317-248 318-248Z"></path><path data-c="37" d="M475 604C482 613 485 626 485 644L243 644C174 644 135 648 128 657 125 660 122 667 120 676L89 676 55 464 88 464C98 520 106 550 112 555 115 558 146 560 205 560L401 560 295 410C214 295 174 171 174 36 174-3 190-22 223-22 256-22 272-3 272 36L272 87C272 239 296 349 343 416Z" transform="translate(389,0)"></path><path data-c="29" d="M78-245C138-199 188-131 229-40 268 47 288 129 288 208L288 292C288 371 268 453 229 540 188 631 138 699 78 745 75 747 72 748 71 748 62 748 57 743 57 734 57 730 59 726 62 723 114 683 156 617 187 526 214 447 228 369 228 292L228 208C228 131 214 53 187-26 156-117 114-183 62-223 59-227 57-231 57-234 57-243 62-248 71-248 72-248 75-247 78-245Z" transform="translate(889,0)"></path></g></g></g></g></svg></g></g></g></g></svg></mjx-container></p><p>其中 N 表示文档总数,<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align:-.357ex" xmlns="http://www.w3.org/2000/svg" width="4.195ex" height="1.902ex" role="img" focusable="false" viewBox="0 -683 1854 840.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="N_{cor}"><g data-mml-node="msub" data-latex="N_{cor}"><g data-mml-node="mi" data-latex="N"><path data-c="1D441" d="M864 683C845 683 783 680 764 680 745 680 682 683 663 683 648 683 641 675 641 659 641 650 648 645 663 644 705 644 726 631 726 605 726 599 725 592 724 585L616 157 401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659 200 649 211 644 232 644 274 644 295 643 296 640L163 110C154 71 131 49 95 42 69 39 39 43 39 15 39 5 45 0 56 0 74 0 136 3 155 3 174 3 238 0 257 0 272 0 279 8 279 24 279 33 271 38 255 39 214 40 194 53 194 78 194 83 195 90 197 100L326 611 576 21C582 7 590 0 599 0 608 0 614 8 618 24L757 574C770 625 798 643 860 644 874 645 881 653 881 669 878 678 877 683 864 683Z"></path></g><g data-mml-node="TeXAtom" transform="translate(836,-150) scale(0.707)" data-latex="{c o r}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="c"><path data-c="1D450" d="M328 325C328 300 341 287 368 287 404 287 427 318 427 354 427 410 368 442 308 442 239 442 176 412 122 353 68 294 41 229 41 159 41 61 106-11 204-11 257-11 304 2 345 27 379 48 404 69 420 90 427 99 430 106 430 109 430 120 425 126 414 126 409 126 404 122 398 114 365 70 324 42 277 30 246 22 223 18 206 18 149 18 121 53 121 122 121 184 150 274 174 317 198 361 249 413 308 413 346 413 372 402 386 381 355 378 328 358 328 325Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(433,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353 68 294 41 229 41 159 41 63 106-11 202-11 272-11 334 19 388 78 442 137 469 201 469 272 469 369 405 442 308 442M389 310C389 287 384 255 374 213 353 130 319 73 272 42 248 26 225 18 203 18 149 18 121 65 121 122 121 180 155 288 178 324 216 383 259 413 307 413 361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(918,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442 302 442 261 419 227 372 217 411 183 442 136 442 95 442 65 410 44 345 34 312 29 293 29 287 29 278 34 273 45 273 50 273 53 274 56 276 61 285 64 292 65 299 83 375 106 413 133 413 150 413 159 399 159 371 159 358 154 331 144 290L87 63C84 50 78 24 78 19 78-1 89-11 110-11 130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343 271 381 302 413 351 413 363 413 373 411 382 406 352 397 337 378 337 351 337 325 351 312 378 312 411 312 436 341 436 374Z"></path></g></g></g></g></g></svg></mjx-container>表示正确聚类的文档数.</p></div><div class="story post-story"><h2 id="实验过程"><a href="#实验过程" class="headerlink" title="实验过程"></a>实验过程</h2><h3 id="准备数据,上传至HDFS"><a href="#准备数据,上传至HDFS" class="headerlink" title="准备数据,上传至HDFS"></a>准备数据,上传至 HDFS</h3><p>HDFS 创建文件夹</p><p><img src="https://static.mhuig.top/npm/imbox@0.0.3/data/202082162416.png" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.3/data/202082162416.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="HDFS创建文件夹"></p><p>hadoop 关闭安全模式</p><p><img src="https://static.mhuig.top/npm/imbox@0.0.3/data/20208216240.png" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.3/data/20208216240.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="hadoop关闭安全模式"></p><p>上传 KDD Cup 1999 数据集</p><p><img src="https://static.mhuig.top/npm/imbox@0.0.3/data/202082162343.png" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.3/data/202082162343.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="上传KDD Cup 1999 数据集"></p><p><img src="https://static.mhuig.top/npm/imbox@0.0.3/data/202082162318.png" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.3/data/202082162318.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="上传KDD Cup 1999 数据集"></p><p><img src="https://static.mhuig.top/npm/imbox@0.0.3/data/202082162254.png" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.3/data/202082162254.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="上传KDD Cup 1999 数据集"></p><p>查看上传成功</p><p><img src="https://static.mhuig.top/npm/imbox@0.0.3/data/202082162233.png" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.3/data/202082162233.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="查看上传成功"></p><h3 id="通过kddcup-names加载列名称"><a href="#通过kddcup-names加载列名称" class="headerlink" title="通过kddcup.names加载列名称"></a>通过 kddcup.names 加载列名称</h3><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">names=[]</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">"/export/work/F/3/data/kddcup.names"</span>) <span class="keyword">as</span> f:</span><br><span class="line">    line = f.readline()</span><br><span class="line">    line = f.readline()</span><br><span class="line">    <span class="keyword">while</span> line:</span><br><span class="line">        names.append(line.split(<span class="string">":"</span>)[<span class="number">0</span>])</span><br><span class="line">        line = f.readline()</span><br><span class="line"></span><br><span class="line">names.append(<span class="string">"label"</span>)</span><br></pre></td></tr></tbody></table></figure><p>输出列名称:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">[<span class="string">'duration'</span>, <span class="string">'protocol_type'</span>, <span class="string">'service'</span>, <span class="string">'flag'</span>, <span class="string">'src_bytes'</span>, <span class="string">'dst_bytes'</span>, <span class="string">'land'</span>, <span class="string">'wrong_fragment'</span>, <span class="string">'urgent'</span>, <span class="string">'hot'</span>, <span class="string">'num_failed_logins'</span>, <span class="string">'logged_in'</span>, <span class="string">'num_compromised'</span>, <span class="string">'root_shell'</span>, <span class="string">'su_attempted'</span>, <span class="string">'num_root'</span>, <span class="string">'num_file_creations'</span>, <span class="string">'num_shells'</span>, <span class="string">'num_access_files'</span>, <span class="string">'num_outbound_cmds'</span>, <span class="string">'is_host_login'</span>, <span class="string">'is_guest_login'</span>, <span class="string">'count'</span>, <span class="string">'srv_count'</span>, <span class="string">'serror_rate'</span>, <span class="string">'srv_serror_rate'</span>, <span class="string">'rerror_rate'</span>, <span class="string">'srv_rerror_rate'</span>, <span class="string">'same_srv_rate'</span>, <span class="string">'diff_srv_rate'</span>, <span class="string">'srv_diff_host_rate'</span>, <span class="string">'dst_host_count'</span>, <span class="string">'dst_host_srv_count'</span>, <span class="string">'dst_host_same_srv_rate'</span>, <span class="string">'dst_host_diff_srv_rate'</span>, <span class="string">'dst_host_same_src_port_rate'</span>, <span class="string">'dst_host_srv_diff_host_rate'</span>, <span class="string">'dst_host_serror_rate'</span>, <span class="string">'dst_host_srv_serror_rate'</span>, <span class="string">'dst_host_rerror_rate'</span>, <span class="string">'dst_host_srv_rerror_rate'</span>, <span class="string">'label'</span>]</span><br></pre></td></tr></tbody></table></figure><h3 id="构建Dataframe"><a href="#构建Dataframe" class="headerlink" title="构建Dataframe"></a>构建 Dataframe</h3><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">names=[<span class="string">'duration'</span>, <span class="string">'protocol_type'</span>, <span class="string">'service'</span>, <span class="string">'flag'</span>, <span class="string">'src_bytes'</span>, <span class="string">'dst_bytes'</span>, <span class="string">'land'</span>, <span class="string">'wrong_fragment'</span>, <span class="string">'urgent'</span>, <span class="string">'hot'</span>, <span class="string">'num_failed_logins'</span>, <span class="string">'logged_in'</span>, <span class="string">'num_compromised'</span>, <span class="string">'root_shell'</span>, <span class="string">'su_attempted'</span>, <span class="string">'num_root'</span>, <span class="string">'num_file_creations'</span>, <span class="string">'num_shells'</span>, <span class="string">'num_access_files'</span>, <span class="string">'num_outbound_cmds'</span>, <span class="string">'is_host_login'</span>, <span class="string">'is_guest_login'</span>, <span class="string">'count'</span>, <span class="string">'srv_count'</span>, <span class="string">'serror_rate'</span>, <span class="string">'srv_serror_rate'</span>, <span class="string">'rerror_rate'</span>, <span class="string">'srv_rerror_rate'</span>, <span class="string">'same_srv_rate'</span>, <span class="string">'diff_srv_rate'</span>, <span class="string">'srv_diff_host_rate'</span>, <span class="string">'dst_host_count'</span>, <span class="string">'dst_host_srv_count'</span>, <span class="string">'dst_host_same_srv_rate'</span>, <span class="string">'dst_host_diff_srv_rate'</span>, <span class="string">'dst_host_same_src_port_rate'</span>, <span class="string">'dst_host_srv_diff_host_rate'</span>, <span class="string">'dst_host_serror_rate'</span>, <span class="string">'dst_host_srv_serror_rate'</span>, <span class="string">'dst_host_rerror_rate'</span>, <span class="string">'dst_host_srv_rerror_rate'</span>, <span class="string">'label'</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> pyspark.sql.types <span class="keyword">import</span> Row</span><br><span class="line"><span class="keyword">from</span> pyspark.sql.types <span class="keyword">import</span> StructType</span><br><span class="line"><span class="keyword">from</span> pyspark.sql.types <span class="keyword">import</span> StructField</span><br><span class="line"><span class="keyword">from</span> pyspark.sql.types <span class="keyword">import</span> StringType</span><br><span class="line"><span class="keyword">from</span> pyspark.sql.types <span class="keyword">import</span> FloatType</span><br><span class="line"><span class="keyword">from</span> pyspark.conf <span class="keyword">import</span> SparkConf</span><br><span class="line"><span class="keyword">from</span> pyspark <span class="keyword">import</span> SparkContext</span><br><span class="line"><span class="keyword">from</span> pyspark.sql.session <span class="keyword">import</span> SparkSession</span><br><span class="line"><span class="comment"># 构建Dataframe</span></span><br><span class="line">conf = SparkConf().setAppName(<span class="string">"applicaiton"</span>).<span class="built_in">set</span>(<span class="string">"spark.executor.heartbeatInterval"</span>,<span class="string">"200000"</span>).<span class="built_in">set</span>(<span class="string">"spark.network.timeout"</span>,<span class="string">"300000"</span>)</span><br><span class="line">sc = SparkContext.getOrCreate(conf)</span><br><span class="line">spark = SparkSession(sc)</span><br><span class="line">testRDD = sc.textFile(<span class="string">"/3/corrected"</span>)</span><br><span class="line">fields = <span class="built_in">list</span>(<span class="built_in">map</span>( <span class="keyword">lambda</span> fieldName : StructField(fieldName, StringType(), nullable = <span class="literal">True</span>) <span class="keyword">if</span>  fieldName <span class="keyword">in</span> [<span class="string">"protocol_type"</span>, <span class="string">"service"</span>, <span class="string">"flag"</span>,<span class="string">"label"</span>] <span class="keyword">else</span> StructField(fieldName, FloatType(), nullable = <span class="literal">True</span>) , names))</span><br><span class="line">schema = StructType(fields)</span><br><span class="line">rowRDD = testRDD.<span class="built_in">map</span>(<span class="keyword">lambda</span> line : line.split(<span class="string">","</span>)).<span class="built_in">map</span>(<span class="keyword">lambda</span> attr : Row(<span class="built_in">float</span>(attr[<span class="number">0</span>]),attr[<span class="number">1</span>],attr[<span class="number">2</span>],attr[<span class="number">3</span>],<span class="built_in">float</span>(attr[<span class="number">4</span>]),<span class="built_in">float</span>(attr[<span class="number">5</span>]),<span class="built_in">float</span>(attr[<span class="number">6</span>]),<span class="built_in">float</span>(attr[<span class="number">7</span>]),<span class="built_in">float</span>(attr[<span class="number">8</span>]),<span class="built_in">float</span>(attr[<span class="number">9</span>]),<span class="built_in">float</span>(attr[<span class="number">10</span>]),<span class="built_in">float</span>(attr[<span class="number">11</span>]),<span class="built_in">float</span>(attr[<span class="number">12</span>]),<span class="built_in">float</span>(attr[<span class="number">13</span>]),<span class="built_in">float</span>(attr[<span class="number">14</span>]),<span class="built_in">float</span>(attr[<span class="number">15</span>]),<span class="built_in">float</span>(attr[<span class="number">16</span>]),<span class="built_in">float</span>(attr[<span class="number">17</span>]),<span class="built_in">float</span>(attr[<span class="number">18</span>]),<span class="built_in">float</span>(attr[<span class="number">19</span>]),<span class="built_in">float</span>(attr[<span class="number">20</span>]),<span class="built_in">float</span>(attr[<span class="number">21</span>]),<span class="built_in">float</span>(attr[<span class="number">22</span>]),<span class="built_in">float</span>(attr[<span class="number">23</span>]),<span class="built_in">float</span>(attr[<span class="number">24</span>]),<span class="built_in">float</span>(attr[<span class="number">25</span>]),<span class="built_in">float</span>(attr[<span class="number">26</span>]),<span class="built_in">float</span>(attr[<span class="number">27</span>]),<span class="built_in">float</span>(attr[<span class="number">28</span>]),<span class="built_in">float</span>(attr[<span class="number">29</span>]),<span class="built_in">float</span>(attr[<span class="number">30</span>]),<span class="built_in">float</span>(attr[<span class="number">31</span>]),<span class="built_in">float</span>(attr[<span class="number">32</span>]),<span class="built_in">float</span>(attr[<span class="number">33</span>]),<span class="built_in">float</span>(attr[<span class="number">34</span>]),<span class="built_in">float</span>(attr[<span class="number">35</span>]),<span class="built_in">float</span>(attr[<span class="number">36</span>]),<span class="built_in">float</span>(attr[<span class="number">37</span>]),<span class="built_in">float</span>(attr[<span class="number">38</span>]),<span class="built_in">float</span>(attr[<span class="number">39</span>]),<span class="built_in">float</span>(attr[<span class="number">40</span>]),attr[<span class="number">41</span>]))</span><br><span class="line">testDF = spark.createDataFrame(rowRDD, schema)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">dataRDD = sc.textFile(<span class="string">"/3/kddcup.data"</span>)</span><br><span class="line">fields = <span class="built_in">list</span>(<span class="built_in">map</span>( <span class="keyword">lambda</span> fieldName : StructField(fieldName, StringType(), nullable = <span class="literal">True</span>) <span class="keyword">if</span>  fieldName <span class="keyword">in</span> [<span class="string">"protocol_type"</span>, <span class="string">"service"</span>, <span class="string">"flag"</span>,<span class="string">"label"</span>] <span class="keyword">else</span> StructField(fieldName, FloatType(), nullable = <span class="literal">True</span>) , names))</span><br><span class="line">schema = StructType(fields)</span><br><span class="line">rowRDD = dataRDD.<span class="built_in">map</span>(<span class="keyword">lambda</span> line : line.split(<span class="string">","</span>)).<span class="built_in">map</span>(<span class="keyword">lambda</span> attr : Row(<span class="built_in">float</span>(attr[<span class="number">0</span>]),attr[<span class="number">1</span>],attr[<span class="number">2</span>],attr[<span class="number">3</span>],<span class="built_in">float</span>(attr[<span class="number">4</span>]),<span class="built_in">float</span>(attr[<span class="number">5</span>]),<span class="built_in">float</span>(attr[<span class="number">6</span>]),<span class="built_in">float</span>(attr[<span class="number">7</span>]),<span class="built_in">float</span>(attr[<span class="number">8</span>]),<span class="built_in">float</span>(attr[<span class="number">9</span>]),<span class="built_in">float</span>(attr[<span class="number">10</span>]),<span class="built_in">float</span>(attr[<span class="number">11</span>]),<span class="built_in">float</span>(attr[<span class="number">12</span>]),<span class="built_in">float</span>(attr[<span class="number">13</span>]),<span class="built_in">float</span>(attr[<span class="number">14</span>]),<span class="built_in">float</span>(attr[<span class="number">15</span>]),<span class="built_in">float</span>(attr[<span class="number">16</span>]),<span class="built_in">float</span>(attr[<span class="number">17</span>]),<span class="built_in">float</span>(attr[<span class="number">18</span>]),<span class="built_in">float</span>(attr[<span class="number">19</span>]),<span class="built_in">float</span>(attr[<span class="number">20</span>]),<span class="built_in">float</span>(attr[<span class="number">21</span>]),<span class="built_in">float</span>(attr[<span class="number">22</span>]),<span class="built_in">float</span>(attr[<span class="number">23</span>]),<span class="built_in">float</span>(attr[<span class="number">24</span>]),<span class="built_in">float</span>(attr[<span class="number">25</span>]),<span class="built_in">float</span>(attr[<span class="number">26</span>]),<span class="built_in">float</span>(attr[<span class="number">27</span>]),<span class="built_in">float</span>(attr[<span class="number">28</span>]),<span class="built_in">float</span>(attr[<span class="number">29</span>]),<span class="built_in">float</span>(attr[<span class="number">30</span>]),<span class="built_in">float</span>(attr[<span class="number">31</span>]),<span class="built_in">float</span>(attr[<span class="number">32</span>]),<span class="built_in">float</span>(attr[<span class="number">33</span>]),<span class="built_in">float</span>(attr[<span class="number">34</span>]),<span class="built_in">float</span>(attr[<span class="number">35</span>]),<span class="built_in">float</span>(attr[<span class="number">36</span>]),<span class="built_in">float</span>(attr[<span class="number">37</span>]),<span class="built_in">float</span>(attr[<span class="number">38</span>]),<span class="built_in">float</span>(attr[<span class="number">39</span>]),<span class="built_in">float</span>(attr[<span class="number">40</span>]),attr[<span class="number">41</span>]))</span><br><span class="line">dataDF = spark.createDataFrame(rowRDD, schema)</span><br></pre></td></tr></tbody></table></figure><h3 id="数据集统计"><a href="#数据集统计" class="headerlink" title="数据集统计"></a>数据集统计</h3><p>统计数据集中各个类别标号以及每类样本有多少,并展示。</p><p>数据集的类别标号以及每类样本数</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">dataDF.groupBy(<span class="string">"label"</span>).count().show(<span class="number">10000</span>)</span><br><span class="line"></span><br><span class="line">+----------------+-------+                                                      </span><br><span class="line">|           label|  count|</span><br><span class="line">+----------------+-------+</span><br><span class="line">|    warezmaster.|     <span class="number">20</span>|</span><br><span class="line">|          smurf.|<span class="number">2807886</span>|</span><br><span class="line">|            pod.|    <span class="number">264</span>|</span><br><span class="line">|           imap.|     <span class="number">12</span>|</span><br><span class="line">|           nmap.|   <span class="number">2316</span>|</span><br><span class="line">|   guess_passwd.|     <span class="number">53</span>|</span><br><span class="line">|        ipsweep.|  <span class="number">12481</span>|</span><br><span class="line">|      portsweep.|  <span class="number">10413</span>|</span><br><span class="line">|          satan.|  <span class="number">15892</span>|</span><br><span class="line">|           land.|     <span class="number">21</span>|</span><br><span class="line">|     loadmodule.|      <span class="number">9</span>|</span><br><span class="line">|      ftp_write.|      <span class="number">8</span>|</span><br><span class="line">|buffer_overflow.|     <span class="number">30</span>|</span><br><span class="line">|        rootkit.|     <span class="number">10</span>|</span><br><span class="line">|    warezclient.|   <span class="number">1020</span>|</span><br><span class="line">|       teardrop.|    <span class="number">979</span>|</span><br><span class="line">|           perl.|      <span class="number">3</span>|</span><br><span class="line">|            phf.|      <span class="number">4</span>|</span><br><span class="line">|       multihop.|      <span class="number">7</span>|</span><br><span class="line">|        neptune.|<span class="number">1072017</span>|</span><br><span class="line">|           back.|   <span class="number">2203</span>|</span><br><span class="line">|            spy.|      <span class="number">2</span>|</span><br><span class="line">|         normal.| <span class="number">972781</span>|</span><br><span class="line">+----------------+-------+</span><br></pre></td></tr></tbody></table></figure><p>测试集的类别标号以及每类样本数</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">testDF.groupBy(<span class="string">"label"</span>).count().show(<span class="number">10000</span>) </span><br><span class="line"></span><br><span class="line">+----------------+------+</span><br><span class="line">|           label| count|</span><br><span class="line">+----------------+------+</span><br><span class="line">|      snmpguess.|  <span class="number">2406</span>|</span><br><span class="line">|          xlock.|     <span class="number">9</span>|</span><br><span class="line">|    warezmaster.|  <span class="number">1602</span>|</span><br><span class="line">|   processtable.|   <span class="number">759</span>|</span><br><span class="line">|          smurf.|<span class="number">164091</span>|</span><br><span class="line">|            pod.|    <span class="number">87</span>|</span><br><span class="line">|           worm.|     <span class="number">2</span>|</span><br><span class="line">|  snmpgetattack.|  <span class="number">7741</span>|</span><br><span class="line">|          mscan.|  <span class="number">1053</span>|</span><br><span class="line">|           nmap.|    <span class="number">84</span>|</span><br><span class="line">|           imap.|     <span class="number">1</span>|</span><br><span class="line">|          xterm.|    <span class="number">13</span>|</span><br><span class="line">|      sqlattack.|     <span class="number">2</span>|</span><br><span class="line">|   guess_passwd.|  <span class="number">4367</span>|</span><br><span class="line">|       mailbomb.|  <span class="number">5000</span>|</span><br><span class="line">|         xsnoop.|     <span class="number">4</span>|</span><br><span class="line">|        ipsweep.|   <span class="number">306</span>|</span><br><span class="line">|      portsweep.|   <span class="number">354</span>|</span><br><span class="line">|          named.|    <span class="number">17</span>|</span><br><span class="line">|          satan.|  <span class="number">1633</span>|</span><br><span class="line">|           land.|     <span class="number">9</span>|</span><br><span class="line">|     loadmodule.|     <span class="number">2</span>|</span><br><span class="line">|      ftp_write.|     <span class="number">3</span>|</span><br><span class="line">|       sendmail.|    <span class="number">17</span>|</span><br><span class="line">|buffer_overflow.|    <span class="number">22</span>|</span><br><span class="line">|     httptunnel.|   <span class="number">158</span>|</span><br><span class="line">|        apache2.|   <span class="number">794</span>|</span><br><span class="line">|          saint.|   <span class="number">736</span>|</span><br><span class="line">|        rootkit.|    <span class="number">13</span>|</span><br><span class="line">|       teardrop.|    <span class="number">12</span>|</span><br><span class="line">|           perl.|     <span class="number">2</span>|</span><br><span class="line">|            phf.|     <span class="number">2</span>|</span><br><span class="line">|       multihop.|    <span class="number">18</span>|</span><br><span class="line">|       udpstorm.|     <span class="number">2</span>|</span><br><span class="line">|        neptune.| <span class="number">58001</span>|</span><br><span class="line">|           back.|  <span class="number">1098</span>|</span><br><span class="line">|             ps.|    <span class="number">16</span>|</span><br><span class="line">|         normal.| <span class="number">60593</span>|</span><br><span class="line">+----------------+------+</span><br></pre></td></tr></tbody></table></figure><h3 id="尝试聚类"><a href="#尝试聚类" class="headerlink" title="尝试聚类"></a>尝试聚类</h3><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> pyspark.ml <span class="keyword">import</span> Pipeline,PipelineModel</span><br><span class="line"><span class="keyword">from</span> pyspark.ml.clustering <span class="keyword">import</span> KMeans,KMeansModel</span><br><span class="line"><span class="keyword">from</span> pyspark.ml.feature <span class="keyword">import</span> VectorAssembler</span><br><span class="line"><span class="keyword">from</span> pyspark.sql <span class="keyword">import</span> DataFrame</span><br><span class="line"><span class="keyword">import</span> random</span><br></pre></td></tr></tbody></table></figure><p>用 VectorAssembler 创建一个特征向量,基于这些特征向量用一个 K 均值实现来创建一个模型,再用一个管道将它们拼接在一起。从得到的模型中,可以提取并检验簇群中心。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">numericOnly = dataDF.drop(<span class="string">"protocol_type"</span>, <span class="string">"service"</span>, <span class="string">"flag"</span>).cache()</span><br><span class="line">assembler = VectorAssembler(inputCols=numericOnly.drop(<span class="string">"label"</span>).columns, outputCol=<span class="string">"featureVector"</span>)</span><br><span class="line">kmeans = KMeans().setPredictionCol(<span class="string">"cluster"</span>).setFeaturesCol(<span class="string">"featureVector"</span>)</span><br><span class="line">pipeline = Pipeline().setStages([assembler, kmeans])</span><br><span class="line">pipelineModel = pipeline.fit(numericOnly)</span><br><span class="line">kmeansModel = pipelineModel.stages[-<span class="number">1</span>]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> kmeansModel.clusterCenters():<span class="built_in">print</span>(i)</span><br></pre></td></tr></tbody></table></figure><p>输出:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">[<span class="number">4.83401949e+01</span> <span class="number">1.83462154e+03</span> <span class="number">8.26203195e+02</span> <span class="number">5.71611720e-06</span>                    </span><br><span class="line"> <span class="number">6.48779303e-04</span> <span class="number">7.96173468e-06</span> <span class="number">1.24376586e-02</span> <span class="number">3.20510858e-05</span></span><br><span class="line"> <span class="number">1.43529049e-01</span> <span class="number">8.08830584e-03</span> <span class="number">6.81851124e-05</span> <span class="number">3.67464677e-05</span></span><br><span class="line"> <span class="number">1.29349608e-02</span> <span class="number">1.18874823e-03</span> <span class="number">7.43095237e-05</span> <span class="number">1.02114351e-03</span></span><br><span class="line"> <span class="number">0.00000000e+00</span> <span class="number">4.08294086e-07</span> <span class="number">8.35165553e-04</span> <span class="number">3.34973508e+02</span></span><br><span class="line"> <span class="number">2.95267146e+02</span> <span class="number">1.77970317e-01</span> <span class="number">1.78036989e-01</span> <span class="number">5.76648988e-02</span></span><br><span class="line"> <span class="number">5.77299094e-02</span> <span class="number">7.89884132e-01</span> <span class="number">2.11796105e-02</span> <span class="number">2.82608102e-02</span></span><br><span class="line"> <span class="number">2.32981078e+02</span> <span class="number">1.89214283e+02</span> <span class="number">7.53713390e-01</span> <span class="number">3.07109788e-02</span></span><br><span class="line"> <span class="number">6.05051931e-01</span> <span class="number">6.46410786e-03</span> <span class="number">1.78091184e-01</span> <span class="number">1.77885898e-01</span></span><br><span class="line"> <span class="number">5.79276115e-02</span> <span class="number">5.76592214e-02</span>]</span><br><span class="line">[<span class="number">1.09990000e+04</span> <span class="number">0.00000000e+00</span> <span class="number">1.30993741e+09</span> <span class="number">0.00000000e+00</span></span><br><span class="line"> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span></span><br><span class="line"> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span></span><br><span class="line"> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span></span><br><span class="line"> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">1.00000000e+00</span></span><br><span class="line"> <span class="number">1.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">1.00000000e+00</span></span><br><span class="line"> <span class="number">1.00000000e+00</span> <span class="number">1.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span></span><br><span class="line"> <span class="number">2.55000000e+02</span> <span class="number">1.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">6.49999976e-01</span></span><br><span class="line"> <span class="number">1.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span> <span class="number">0.00000000e+00</span></span><br><span class="line"> <span class="number">1.00000000e+00</span> <span class="number">1.00000000e+00</span>]</span><br></pre></td></tr></tbody></table></figure><p>对这些数字做一个直观的解释并不容易,但是每一个数字都表示模型生成的一个簇群中心,也称为质心(centroid)。就每个数值输入特征而言,这些值是质心的坐标。</p><h3 id="k的选择"><a href="#k的选择" class="headerlink" title="k的选择"></a>k 的选择</h3><p>如果每个数据点都紧靠最近的质心,则可认为聚类是较优的。这里的 “近” 采用欧氏距离定义。这是评估聚类质量的一种简单又常用的方法,使用与所有点之间距离的平均值,有时也可以使用平方距离的平均值。实际上,KMeansModel 提供了一个 computeCost 方法来计算平方距离的总和,并且很容易用来计算平方距离的平均值。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">numericOnly = dataDF.drop(<span class="string">"protocol_type"</span>, <span class="string">"service"</span>, <span class="string">"flag"</span>).cache()</span><br><span class="line"><span class="comment"># computeCost 方法来计算平方距离的总和,并且很容易用来计算平方距离的平均值。</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">clusteringScore0</span>(<span class="params">data,k</span>):</span><br><span class="line">    assembler = VectorAssembler(inputCols=data.drop(<span class="string">"label"</span>).columns, outputCol=<span class="string">"featureVector"</span>)</span><br><span class="line">    kmeans = KMeans().setSeed(<span class="built_in">int</span>(random.random()*<span class="number">10</span>)).setK(k).setPredictionCol(<span class="string">"cluster"</span>).setFeaturesCol(<span class="string">"featureVector"</span>) <span class="comment">#.setMaxIter(40).setTol(1.0e-5)</span></span><br><span class="line">    pipeline = Pipeline().setStages([assembler, kmeans])</span><br><span class="line">    pipelineModel = pipeline.fit(data)</span><br><span class="line">    kmeansModel = pipelineModel.stages[-<span class="number">1</span>]</span><br><span class="line">    Srore=kmeansModel.computeCost(assembler.transform(data)) / data.count()</span><br><span class="line">    <span class="keyword">return</span> Srore</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">20</span>, <span class="number">100</span>, <span class="number">20</span>):</span><br><span class="line">    <span class="built_in">print</span>([k, clusteringScore0(numericOnly, k)])</span><br></pre></td></tr></tbody></table></figure><p>输出结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">[<span class="number">20</span>, <span class="number">148277112.23861197</span>]                                                        </span><br><span class="line">[<span class="number">40</span>, <span class="number">49940659.143821806</span>]</span><br><span class="line">[<span class="number">60</span>, <span class="number">18265796.561388526</span>]</span><br><span class="line">[<span class="number">80</span>, <span class="number">15313289.324247833</span>]</span><br></pre></td></tr></tbody></table></figure><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651998844488/202082162158.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651998844488/202082162158.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="输出结果显示得分随着 k 的增加而降低"></p><p>输出结果显示得分<strong>随着 k 的增加而降低</strong>。</p><p>增加迭代时间可以优化聚类结果。算法提供了 setTol () 来设置一个阈值,该阈值控制聚类过程中簇质心进行有效移动的最小值。降低该阈值能使质心继续移动更长的时间。使用 setMaxIter () 增加最大迭代次数也可以防止它过早停止,代价是可能需要更多的计算。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">clusteringScore1</span>(<span class="params">data,k</span>):</span><br><span class="line">    assembler = VectorAssembler(inputCols=data.drop(<span class="string">"label"</span>).columns, outputCol=<span class="string">"featureVector"</span>)</span><br><span class="line">    kmeans = KMeans().setSeed(<span class="built_in">int</span>(random.random()*<span class="number">10</span>)).setK(k).setPredictionCol(<span class="string">"cluster"</span>).setFeaturesCol(<span class="string">"featureVector"</span>).setMaxIter(<span class="number">40</span>).setTol(<span class="number">1.0e-5</span>)</span><br><span class="line">    pipeline = Pipeline().setStages([assembler, kmeans])</span><br><span class="line">    pipelineModel = pipeline.fit(data)</span><br><span class="line">    kmeansModel = pipelineModel.stages[-<span class="number">1</span>]</span><br><span class="line">    Srore=kmeansModel.computeCost(assembler.transform(data)) / data.count()</span><br><span class="line">    <span class="keyword">return</span> Srore</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">20</span>, <span class="number">120</span>, <span class="number">20</span>):</span><br><span class="line">    <span class="built_in">print</span>([k, clusteringScore1(numericOnly, k)])</span><br></pre></td></tr></tbody></table></figure><p>输出结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">[<span class="number">20</span>, <span class="number">148277112.23861197</span>]                                                        </span><br><span class="line">[<span class="number">40</span>, <span class="number">11564470.915401561</span>]</span><br><span class="line">[<span class="number">60</span>, <span class="number">16343181.409780543</span>]</span><br><span class="line">[<span class="number">80</span>, <span class="number">22323383.079484705</span>]</span><br><span class="line">[<span class="number">100</span>, <span class="number">7572838.84573523</span>]</span><br></pre></td></tr></tbody></table></figure><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651998932373/202082162140.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651998932373/202082162140.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="在 k 过了 100 这个点之后得分下降还是很明显,所以 k 的拐点值应该大于 100。"></p><p>糟糕的情况是,前面的结果中 k = 80 时的距离居然比 k = 60 的距离大。这不应该发生,因为 k 取更大值时,聚类的结果应该至少与 k 取一个较小值时的结果一样好。问题的原因在于,这种给定 k 值的 K 均值算法并不一定能得到最优聚类。K 均值的迭代过程是从一个随机点开始的,因此可能收敛于一个局部最小值,这个局部最小值可能还不错,但并不是全局最优的。</p><p><strong>在 k 过了 100 这个点之后得分下降还是很明显,所以 k 的拐点值应该大于 100。</strong></p><h3 id="特征的规范化-1"><a href="#特征的规范化-1" class="headerlink" title="特征的规范化"></a>特征的规范化</h3><p>特征的规范化可以通过将每个特征转换为标准得分来完成。这就是说用对每个特征值求平均,用每个特征值减去平均值,然后除以特征值的标准差。</p><p>由于减去平均值相当于把所有数据点沿相同方法移动相同距离,不影响点之间的欧氏距离,所以实际上减去平均值对聚类结果没有影响。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> pyspark.ml.feature <span class="keyword">import</span> StandardScaler</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">clusteringScore2</span>(<span class="params">data,k</span>):</span><br><span class="line">    assembler = VectorAssembler(inputCols=data.drop(<span class="string">"label"</span>).columns, outputCol=<span class="string">"featureVector"</span>)</span><br><span class="line">    scaler = StandardScaler(inputCol=<span class="string">"featureVector"</span>, outputCol=<span class="string">"scaledFeatureVector"</span>, withStd=<span class="literal">True</span>, withMean=<span class="literal">False</span>)</span><br><span class="line">    kmeans = KMeans().setSeed(<span class="built_in">int</span>(random.random()*<span class="number">10</span>)).setK(k).setPredictionCol(<span class="string">"cluster"</span>).setFeaturesCol(<span class="string">"scaledFeatureVector"</span>).setMaxIter(<span class="number">40</span>).setTol(<span class="number">1.0e-5</span>)</span><br><span class="line">    pipeline = Pipeline().setStages([assembler,scaler,kmeans])</span><br><span class="line">    pipelineModel = pipeline.fit(data)</span><br><span class="line">    kmeansModel = pipelineModel.stages[-<span class="number">1</span>]</span><br><span class="line">    Srore=kmeansModel.computeCost(pipelineModel.transform(data)) / data.count()</span><br><span class="line">    <span class="keyword">return</span> Srore</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">60</span>, <span class="number">300</span>, <span class="number">30</span>):</span><br><span class="line">    <span class="built_in">print</span>([k, clusteringScore2(numericOnly, k)])</span><br></pre></td></tr></tbody></table></figure><p>这有助于将维度放到更平等的基准上,而且在绝对的意义上,看点之间的绝对距离(也就是代价)要小得多。然而,k 值还没有出现一个明显的点,超过该点后,增加 k 值对于改善代价没有明显的作用:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">[<span class="number">60</span>, <span class="number">1.1611941370693641</span>]</span><br><span class="line">[<span class="number">90</span>, <span class="number">0.7236962692254361</span>]</span><br><span class="line">[<span class="number">120</span>, <span class="number">0.5581874996147724</span>]</span><br><span class="line">[<span class="number">150</span>, <span class="number">0.3886887438817504</span>]</span><br><span class="line">[<span class="number">180</span>, <span class="number">0.3333248112741165</span>]</span><br><span class="line">[<span class="number">210</span>, <span class="number">0.27497680552057235</span>]</span><br><span class="line">[<span class="number">240</span>, <span class="number">0.2556693718314817</span>]</span><br><span class="line">[<span class="number">270</span>, <span class="number">0.22710138015576076</span>]</span><br></pre></td></tr></tbody></table></figure><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651998980409/202082162121.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651998980409/202082162121.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="特征的规范化"></p><h3 id="类别型变量-1"><a href="#类别型变量-1" class="headerlink" title="类别型变量"></a>类别型变量</h3><p>归一化使聚类结果有了可贵的进步,但聚类结果还有进一步提升的空间。比如说,几个特征由于不是数值型就被去掉了,于是这些特征里有价值的信息也被丢掉了。如果将这些信息以某种形式加回来,我们应该能得到更好的聚类。</p><p>类别型特征可以用 one-hot 编码转换为几个二元特征,这几个二元特征可以看成数值型维度。举个例子,数据集的第二列代表协议类型,取值可能是 tcp、udp 或 icmp。可以把它们看成 3 个特征,分别取名为 is_tcp、is_udp 和 is_icmp。这样,特征值 tcp 就变成 1,0,0,udp 对应 0,1,0,icmp 对应 0,0,1,以此类推。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> pyspark.ml.feature <span class="keyword">import</span> OneHotEncoder, StringIndexer</span><br><span class="line"><span class="comment"># 类别型特征可以用 one-hot 编码转换为几个二元特征,这几个二元特征可以看成数值型维度。</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">oneHotPipeline</span>(<span class="params">inputCol</span>):</span><br><span class="line">    indexer = StringIndexer(inputCol=inputCol,outputCol=inputCol + <span class="string">"_indexed"</span>).setHandleInvalid(<span class="string">"keep"</span>)</span><br><span class="line">    encoder = OneHotEncoder(inputCol=inputCol + <span class="string">"_indexed"</span>,outputCol=inputCol + <span class="string">"_vec"</span>)</span><br><span class="line">    pipeline = Pipeline().setStages([indexer, encoder])</span><br><span class="line">    <span class="keyword">return</span> (pipeline, inputCol + <span class="string">"_vec"</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">clusteringScore3</span>(<span class="params">data,k</span>):</span><br><span class="line">    protoTypeEncoder, protoTypeVecCol = oneHotPipeline(<span class="string">"protocol_type"</span>)</span><br><span class="line">    serviceEncoder, serviceVecCol = oneHotPipeline(<span class="string">"service"</span>)</span><br><span class="line">    flagEncoder, flagVecCol = oneHotPipeline(<span class="string">"flag"</span>)</span><br><span class="line">    assembleCols = (<span class="built_in">set</span>(data.columns)-<span class="built_in">set</span>([<span class="string">"label"</span>, <span class="string">"protocol_type"</span>, <span class="string">"service"</span>, <span class="string">"flag"</span>])).union(<span class="built_in">set</span>([protoTypeVecCol, serviceVecCol, flagVecCol]))</span><br><span class="line">    assembler = VectorAssembler(inputCols=<span class="built_in">list</span>(assembleCols), outputCol=<span class="string">"featureVector"</span>)</span><br><span class="line">    scaler = StandardScaler(inputCol=<span class="string">"featureVector"</span>, outputCol=<span class="string">"scaledFeatureVector"</span>, withStd=<span class="literal">True</span>, withMean=<span class="literal">False</span>)</span><br><span class="line">    kmeans = KMeans().setSeed(<span class="built_in">int</span>(random.random()*<span class="number">10</span>)).setK(k).setPredictionCol(<span class="string">"cluster"</span>).setFeaturesCol(<span class="string">"scaledFeatureVector"</span>).setMaxIter(<span class="number">40</span>).setTol(<span class="number">1.0e-5</span>)</span><br><span class="line">    pipeline = Pipeline().setStages([protoTypeEncoder, serviceEncoder, flagEncoder, assembler, scaler, kmeans])</span><br><span class="line">    pipelineModel = pipeline.fit(data)</span><br><span class="line">    kmeansModel = pipelineModel.stages[-<span class="number">1</span>]</span><br><span class="line">    Srore=kmeansModel.computeCost(pipelineModel.transform(data)) / data.count()</span><br><span class="line">    <span class="keyword">return</span> Srore</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">60</span>, <span class="number">300</span>, <span class="number">30</span>):</span><br><span class="line">    <span class="built_in">print</span>([k, clusteringScore3(dataDF, k)])</span><br></pre></td></tr></tbody></table></figure><p>输出:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">[<span class="number">60</span>, <span class="number">38.01382297522162</span>]</span><br><span class="line">[<span class="number">90</span>, <span class="number">16.419330083446177</span>]</span><br><span class="line">[<span class="number">120</span>, <span class="number">3.2093992442174235</span>]</span><br><span class="line">[<span class="number">150</span>, <span class="number">2.1454678299121843</span>]</span><br><span class="line">[<span class="number">180</span>, <span class="number">1.6142523558430413</span>]</span><br><span class="line">[<span class="number">210</span>, <span class="number">1.3533093788147306</span>]</span><br><span class="line">[<span class="number">240</span>, <span class="number">1.0616778921723296</span>]</span><br><span class="line">[<span class="number">270</span>, <span class="number">0.9068134376554267</span>]</span><br></pre></td></tr></tbody></table></figure><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651999052076/20208216211.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651999052076/20208216211.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="类别型变量"></p><p>局部放大:</p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651999083338/202082162045.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651999083338/202082162045.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="局部放大"></p><p>这些样本结果表明,从 k = 180 这个点开始,评分值的变化趋于平缓。至少现在聚类使用了所有的输入特征。</p><h3 id="利用标号的熵信息"><a href="#利用标号的熵信息" class="headerlink" title="利用标号的熵信息"></a>利用标号的熵信息</h3><p>标签告诉我们每个数据点的真实性质。好的聚类应该和人工标签保持一致,大部分情况 下,标签相同的数据点应聚在一起,而标签不同的数据点不应该在一起,并且簇内的数据 点标签相同。</p><p>良好的聚类结果簇中样本类别大体相同,因而熵值较低。我们可以对各个簇的熵加权平均,将结果作为聚类得分:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">entropy</span>(<span class="params">x</span>):</span><br><span class="line">    ent = <span class="number">0.0</span></span><br><span class="line">    x_value_list = [x[i] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(x.shape[<span class="number">0</span>])]</span><br><span class="line">    n=<span class="built_in">sum</span>(x_value_list)</span><br><span class="line">    <span class="keyword">for</span> x_value <span class="keyword">in</span> x_value_list:</span><br><span class="line">        p = <span class="built_in">float</span>(x_value) / n</span><br><span class="line">        ent -= p * numpy.log(p)</span><br><span class="line">    <span class="keyword">return</span> ent</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">fitPipeline4</span>(<span class="params">data, k</span>):</span><br><span class="line">    protoTypeEncoder, protoTypeVecCol = oneHotPipeline(<span class="string">"protocol_type"</span>)</span><br><span class="line">    serviceEncoder, serviceVecCol = oneHotPipeline(<span class="string">"service"</span>)</span><br><span class="line">    flagEncoder, flagVecCol = oneHotPipeline(<span class="string">"flag"</span>)</span><br><span class="line">    assembleCols = (<span class="built_in">set</span>(data.columns)-<span class="built_in">set</span>([<span class="string">"label"</span>, <span class="string">"protocol_type"</span>, <span class="string">"service"</span>, <span class="string">"flag"</span>])).union(<span class="built_in">set</span>([protoTypeVecCol, serviceVecCol, flagVecCol]))</span><br><span class="line">    assembler = VectorAssembler(inputCols=<span class="built_in">list</span>(assembleCols), outputCol=<span class="string">"featureVector"</span>)</span><br><span class="line">    scaler = StandardScaler(inputCol=<span class="string">"featureVector"</span>, outputCol=<span class="string">"scaledFeatureVector"</span>, withStd=<span class="literal">True</span>, withMean=<span class="literal">False</span>)</span><br><span class="line">    kmeans = KMeans().setSeed(<span class="built_in">int</span>(random.random()*<span class="number">10</span>)).setK(k).setPredictionCol(<span class="string">"cluster"</span>).setFeaturesCol(<span class="string">"scaledFeatureVector"</span>).setMaxIter(<span class="number">40</span>).setTol(<span class="number">1.0e-5</span>)</span><br><span class="line">    pipeline = Pipeline().setStages([protoTypeEncoder, serviceEncoder, flagEncoder, assembler, scaler, kmeans])</span><br><span class="line">    pipelineModel = pipeline.fit(data)</span><br><span class="line">    <span class="keyword">return</span> pipelineModel</span><br><span class="line"></span><br><span class="line"><span class="comment"># 良好的聚类结果簇中样本类别大体相同,因而熵值较低。对各个簇的熵加权平均,将结果作为聚类得分</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">clusteringScore4</span>(<span class="params">data, k</span>):</span><br><span class="line">    pipelineModel = fitPipeline4(data, k)</span><br><span class="line">    clusterLabel = pipelineModel.transform(data).select(<span class="string">"cluster"</span>, <span class="string">"label"</span>)</span><br><span class="line">    pd=clusterLabel.toPandas()</span><br><span class="line">    Sum=<span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> name, group <span class="keyword">in</span> pd.groupby(<span class="string">"cluster"</span>):</span><br><span class="line">        labelsize=group.count()[<span class="number">0</span>]</span><br><span class="line">        a=numpy.array(group.groupby(<span class="string">'label'</span>).count())</span><br><span class="line">        b=[]</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(a)):</span><br><span class="line">            <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(a[i])):</span><br><span class="line">                b.append(a[i][j])</span><br><span class="line">        One=labelsize*entropy(numpy.array(b))</span><br><span class="line">        Sum=Sum+One</span><br><span class="line">    <span class="keyword">return</span> Sum/data.count()</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">60</span>, <span class="number">300</span>, <span class="number">30</span>):</span><br><span class="line">    <span class="built_in">print</span>([k, clusteringScore4(dataDF, k)])</span><br></pre></td></tr></tbody></table></figure><p>输出结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">[<span class="number">60</span>, <span class="number">0.038993775215004474</span>]</span><br><span class="line">[<span class="number">90</span>, <span class="number">0.02985377476611417</span>]</span><br><span class="line">[<span class="number">120</span>, <span class="number">0.02266161774992263</span>]</span><br><span class="line">[<span class="number">150</span>, <span class="number">0.020766076760220943</span>]</span><br><span class="line">[<span class="number">180</span>, <span class="number">0.017547365257679748</span>]</span><br><span class="line">[<span class="number">210</span>, <span class="number">0.012974819022593053</span>]</span><br><span class="line">[<span class="number">240</span>, <span class="number">0.007150061376894767</span>]</span><br><span class="line">[<span class="number">270</span>, <span class="number">0.00833981903044443</span>]</span><br></pre></td></tr></tbody></table></figure><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651999142438/202082162021.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651999142438/202082162021.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="利用标号的熵信息"></p><p>跟以前一样,可以根据上面的分析结果大致看出 k 的合适取值。随着 k 的增加,熵不一定会减小,因此我们找到的可能是一个局部最小值。这里结果同样表明,k 取 240 可能比较合理,因为它的得分实际上低于 210 以及 270。</p><h3 id="聚类实战"><a href="#聚类实战" class="headerlink" title="聚类实战"></a>聚类实战</h3><p><strong>取 k = 180</strong></p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">pipelineModel = fitPipeline4(dataDF, <span class="number">180</span>)</span><br><span class="line">countByClusterLabel = pipelineModel.transform(dataDF).select(<span class="string">"cluster"</span>, <span class="string">"label"</span>).groupBy(<span class="string">"cluster"</span>, <span class="string">"label"</span>).count().orderBy(<span class="string">"cluster"</span>, <span class="string">"label"</span>)</span><br><span class="line">countByClusterLabel.show()</span><br></pre></td></tr></tbody></table></figure><p>这里我们同样把每个簇的标号打印出来。聚类的结果中大部分属于同一簇,以及其他的少部分簇。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">+-------+----------+-------+                                                    </span><br><span class="line">|cluster|     label|  count|</span><br><span class="line">+-------+----------+-------+</span><br><span class="line">|      <span class="number">0</span>|  neptune.| <span class="number">362876</span>|</span><br><span class="line">|      <span class="number">0</span>|portsweep.|      <span class="number">1</span>|</span><br><span class="line">|      <span class="number">1</span>|  ipsweep.|     <span class="number">40</span>|</span><br><span class="line">|      <span class="number">1</span>|     nmap.|      <span class="number">6</span>|</span><br><span class="line">|      <span class="number">1</span>|   normal.|   <span class="number">3421</span>|</span><br><span class="line">|      <span class="number">1</span>|portsweep.|      <span class="number">2</span>|</span><br><span class="line">|      <span class="number">1</span>|    satan.|     <span class="number">11</span>|</span><br><span class="line">|      <span class="number">1</span>|    smurf.|<span class="number">2807886</span>|</span><br><span class="line">|      <span class="number">2</span>|  neptune.|   <span class="number">1038</span>|</span><br><span class="line">|      <span class="number">2</span>|portsweep.|     <span class="number">13</span>|</span><br><span class="line">|      <span class="number">2</span>|    satan.|      <span class="number">3</span>|</span><br><span class="line">|      <span class="number">3</span>|  ipsweep.|     <span class="number">13</span>|</span><br><span class="line">|      <span class="number">3</span>|  neptune.|   <span class="number">1046</span>|</span><br><span class="line">|      <span class="number">3</span>|   normal.|     <span class="number">38</span>|</span><br><span class="line">|      <span class="number">3</span>|portsweep.|     <span class="number">11</span>|</span><br><span class="line">|      <span class="number">3</span>|    satan.|      <span class="number">3</span>|</span><br><span class="line">|      <span class="number">4</span>|  neptune.|   <span class="number">1034</span>|</span><br><span class="line">|      <span class="number">4</span>|   normal.|      <span class="number">4</span>|</span><br><span class="line">|      <span class="number">4</span>|portsweep.|      <span class="number">7</span>|</span><br><span class="line">|      <span class="number">4</span>|    satan.|      <span class="number">4</span>|</span><br><span class="line">+-------+----------+-------+</span><br><span class="line">only showing top <span class="number">20</span> rows</span><br></pre></td></tr></tbody></table></figure><p>现在可以建立一个真正的异常检测系统了。异常检测时需要度量新数据点到最近的簇质心 的距离。如果这个距离超过某个阈值,那么就表示这个新数据点是异常的。我们可以把阈 值设为已知数据中离中心最远的第 100 个点到中心的距离。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> os, tempfile</span><br><span class="line"><span class="keyword">from</span> pyspark.ml.linalg <span class="keyword">import</span> Vector, Vectors</span><br><span class="line"></span><br><span class="line">pipelineModel = fitPipeline4(dataDF, <span class="number">180</span>)</span><br><span class="line">kmeansModel = pipelineModel.stages[-<span class="number">1</span>]</span><br><span class="line">kmeansModel.save(<span class="string">"/model/3/kmeansModel"</span>)</span><br><span class="line">pipelineModel.save(<span class="string">"/model/3/pipelineModel"</span>)</span><br><span class="line">centroids = kmeansModel.clusterCenters()</span><br><span class="line">clustered = pipelineModel.transform(dataDF)</span><br><span class="line">threshold=clustered.select(<span class="string">"cluster"</span>, <span class="string">"scaledFeatureVector"</span>).rdd.<span class="built_in">map</span>(<span class="keyword">lambda</span> a:Vectors.squared_distance(centroids[a.cluster], a.scaledFeatureVector)).sortBy(<span class="keyword">lambda</span> x: x).take(<span class="number">100</span>)[-<span class="number">1</span>]</span><br><span class="line"><span class="built_in">print</span>(threshold)</span><br></pre></td></tr></tbody></table></figure><p>输出阈值:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="number">3.232811853048799e-05</span></span><br></pre></td></tr></tbody></table></figure><p>最后一步就是在新数据点出现的时候使用阈值进行评估。在 unlabled 数据上进行测试找出异常流量记录,并计算正确率。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">clustered = pipelineModel.transform(testDF)</span><br><span class="line">anomalies = clustered.rdd.<span class="built_in">filter</span>(<span class="keyword">lambda</span> a:Vectors.squared_distance(centroids[a.cluster], a.scaledFeatureVector) &gt;= threshold).collect()</span><br><span class="line">n=<span class="built_in">len</span>(anomalies)</span><br><span class="line">v=<span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> anomalies:</span><br><span class="line">    <span class="keyword">if</span> i[<span class="string">"label"</span>]!=<span class="string">'normal.'</span>:</span><br><span class="line">        v=v+<span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">"正确率:"</span>+<span class="built_in">str</span>(<span class="built_in">float</span>(v)/n))</span><br></pre></td></tr></tbody></table></figure><p>输出结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">正确率:<span class="number">0.8051841158484633</span> </span><br></pre></td></tr></tbody></table></figure><p><strong>取 k = 240</strong></p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> os, tempfile</span><br><span class="line"><span class="keyword">from</span> pyspark.ml.linalg <span class="keyword">import</span> Vector, Vectors</span><br><span class="line">pipelineModel = fitPipeline4(dataDF, <span class="number">240</span>)</span><br><span class="line">kmeansModel = pipelineModel.stages[-<span class="number">1</span>]</span><br><span class="line">kmeansModel.save(<span class="string">"/model/3/test/kmeansModel"</span>)</span><br><span class="line">pipelineModel.save(<span class="string">"/model/3/test/pipelineModel"</span>)</span><br><span class="line">centroids = kmeansModel.clusterCenters()</span><br><span class="line">clustered = pipelineModel.transform(dataDF)</span><br><span class="line">threshold=clustered.select(<span class="string">"cluster"</span>, <span class="string">"scaledFeatureVector"</span>).rdd.<span class="built_in">map</span>(<span class="keyword">lambda</span> a:Vectors.squared_distance(centroids[a.cluster], a.scaledFeatureVector)).sortBy(<span class="keyword">lambda</span> x: x).take(<span class="number">100</span>)[-<span class="number">1</span>]</span><br><span class="line"><span class="built_in">print</span>(threshold)</span><br></pre></td></tr></tbody></table></figure><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="number">7.665805787851659e-06</span> </span><br></pre></td></tr></tbody></table></figure><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">clustered = pipelineModel.transform(testDF)</span><br><span class="line">anomalies = clustered.rdd.<span class="built_in">filter</span>(<span class="keyword">lambda</span> a:Vectors.squared_distance(centroids[a.cluster], a.scaledFeatureVector) &gt;= threshold).collect()</span><br><span class="line">n=<span class="built_in">len</span>(anomalies)</span><br><span class="line">v=<span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> anomalies:</span><br><span class="line">    <span class="keyword">if</span> i[<span class="string">"label"</span>]!=<span class="string">'normal.'</span>:</span><br><span class="line">        v=v+<span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">"正确率:"</span>+<span class="built_in">str</span>(<span class="built_in">float</span>(v)/n))</span><br></pre></td></tr></tbody></table></figure><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">正确率:<span class="number">0.8050769488123118</span></span><br></pre></td></tr></tbody></table></figure><p>可以看出 K = 180 是在 unlabled 数据上进行测试找出异常流量记录,计算正确率比 K = 240 有较好的结果。</p><p>缩短计算的步长:</p><figure class="highlight py"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">150</span>, <span class="number">220</span>, <span class="number">10</span>):</span><br><span class="line">    <span class="built_in">print</span>([k, clusteringScore3(dataDF, k)])</span><br></pre></td></tr></tbody></table></figure><p>得到评分结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">[<span class="number">150</span>, <span class="number">2.292921780026778</span>]</span><br><span class="line">[<span class="number">160</span>, <span class="number">4.917845778754763</span>]</span><br><span class="line">[<span class="number">170</span>, <span class="number">2.0016455721528015</span>]</span><br><span class="line">[<span class="number">180</span>, <span class="number">1.7177635513092788</span>]</span><br><span class="line">[<span class="number">190</span>, <span class="number">1.5766159846344556</span>]</span><br><span class="line">[<span class="number">200</span>, <span class="number">1.5550587983858675</span>]</span><br><span class="line">[<span class="number">210</span>, <span class="number">1.2785418817225693</span>]</span><br></pre></td></tr></tbody></table></figure><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651999198821/202082161957.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651999198821/202082161957.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="评分结果"></p><p>局部放大:</p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651999229193/20208216196.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651999229193/20208216196.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="局部放大"></p><p><strong>取 k = 190</strong></p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> os, tempfile</span><br><span class="line"><span class="keyword">from</span> pyspark.ml.linalg <span class="keyword">import</span> Vector, Vectors</span><br><span class="line">pipelineModel = fitPipeline4(dataDF, <span class="number">190</span>)</span><br><span class="line">kmeansModel = pipelineModel.stages[-<span class="number">1</span>]</span><br><span class="line">kmeansModel.save(<span class="string">"/model/3/190/kmeansModel"</span>)</span><br><span class="line">pipelineModel.save(<span class="string">"/model/3/190/pipelineModel"</span>)</span><br><span class="line">centroids = kmeansModel.clusterCenters()</span><br><span class="line">clustered = pipelineModel.transform(dataDF)</span><br><span class="line">threshold=clustered.select(<span class="string">"cluster"</span>, <span class="string">"scaledFeatureVector"</span>).rdd.<span class="built_in">map</span>(<span class="keyword">lambda</span> a:Vectors.squared_distance(centroids[a.cluster], a.scaledFeatureVector)).sortBy(<span class="keyword">lambda</span> x: x).take(<span class="number">100</span>)[-<span class="number">1</span>]</span><br><span class="line"><span class="built_in">print</span>(threshold)</span><br></pre></td></tr></tbody></table></figure><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="number">3.247829147436459e-05</span> </span><br></pre></td></tr></tbody></table></figure><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">clustered = pipelineModel.transform(testDF)</span><br><span class="line">anomalies = clustered.rdd.<span class="built_in">filter</span>(<span class="keyword">lambda</span> a:Vectors.squared_distance(centroids[a.cluster], a.scaledFeatureVector) &gt;= threshold).collect()</span><br><span class="line">n=<span class="built_in">len</span>(anomalies)</span><br><span class="line">v=<span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> anomalies:</span><br><span class="line">    <span class="keyword">if</span> i[<span class="string">"label"</span>]!=<span class="string">'normal.'</span>:</span><br><span class="line">        v=v+<span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">"正确率:"</span>+<span class="built_in">str</span>(<span class="built_in">float</span>(v)/n))</span><br></pre></td></tr></tbody></table></figure><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">正确率:<span class="number">0.8051841158484633</span> </span><br></pre></td></tr></tbody></table></figure><p>可以看出 K = 190 是在 unlabled 数据上进行测试找出异常流量记录,计算正确率比 K = 180 有较好的结果。</p></div></div><div class="footer"></div><div class="article-meta" id="bottom"><div class="new-meta-box"></div></div><div class="prev-next"><a class="prev" href="/notes/Spark/als"><p class="title"><i class="fa-solid fa-chevron-left" aria-hidden="true"></i>基于Audioscrobbler数据集的音乐推荐(pyspark)</p><p class="content">本文基于Audioscrobbler数据集(含14.1万用户、160万艺术家及2420万条播放记录),使用PySpark实现ALS协同过滤算法构建音乐推荐系统。通过交替最小二乘法处理隐式反馈数据,将用户-艺术家交互分解为矩阵乘积,设置rank=10、最大迭代15次,最终AUC评估达0.909,衡量推荐质量。</p></a></div><div class="recommended-article"><div class="recommended-article-header"><i class="fa-solid fa-bookmark fa-fw" aria-hidden="true"></i> <span>推荐阅读</span></div><div class="recommended-article-group"> <a class="recommended-article-item" href="/notes/Spark/als.html" title="基于Audioscrobbler数据集的音乐推荐(pyspark)" rel="bookmark"><img src="https://static.mhuig.top/npm/imbox@0.0.15/c/53.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.15/c/53.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="基于Audioscrobbler数据集的音乐推荐(pyspark)"> <span class="title">基于Audioscrobbler数据集的音乐推荐(pyspark)</span></a> <a class="recommended-article-item" href="/notes/Zeta/65.html" title="论黎曼解析数论遗稿 西格尔(1932)[中文]" rel="bookmark"><img src="https://static.mhuig.top/npm/imbox@0.0.15/c/93.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.15/c/93.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="论黎曼解析数论遗稿 西格尔(1932)[中文]"> <span class="title">论黎曼解析数论遗稿 西格尔(1932)[中文]</span></a> <a class="recommended-article-item" href="/notes/Spark/rdd.html" title="Spark RDD 编程" rel="bookmark"><img src="https://static.mhuig.top/npm/imbox@0.0.15/c/106.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.15/c/106.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Spark RDD 编程"> <span class="title">Spark RDD 编程</span></a> <a class="recommended-article-item" href="/notes/person/1.html" title="希尔伯特23问题" rel="bookmark"><img src="https://static.mhuig.top/npm/imbox@0.0.15/c/109.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.15/c/109.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="希尔伯特23问题"> <span class="title">希尔伯特23问题</span></a> <a class="recommended-article-item" href="/p/48f700eb/" title="BERT 预训练模型及其应用案例" rel="bookmark"><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651974150318/2020116102430.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651974150318/2020116102430.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="BERT 预训练模型及其应用案例"> <span class="title">BERT 预训练模型及其应用案例</span></a> <a class="recommended-article-item" href="/notes/Zeta/70.html" title="Zeta(3)" rel="bookmark"><img src="https://static.mhuig.top/npm/imbox@0.0.15/c/115.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.15/c/115.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Zeta(3)"> <span class="title">Zeta(3)</span></a></div></div></article><article class="post white-box shadow floatable blur" id="comments"><span hidden=""><meta itemprop="discussionUrl" content="/notes/Spark/k-means#comments"></span><p ct=""><i class="fa-duotone fa-comments"></i> 留言区</p><div id="layoutHelper-comments"></div></article></div><aside id="l_side" itemscope="" itemtype="http://schema.org/WPSideBar"><section class="widget text desktop mobile pjax"><header><a href="/notes/"><i class="fa-duotone fa-book fa-fw" aria-hidden="true"></i> <span class="name">Notes</span></a></header><div class="content"></div></section><section class="widget list group desktop mobile pjax"><header><i class="fa-duotone fa-comet fa-fw" aria-hidden="true"></i> <span class="name">Spark-快速大数据分析技术</span></header><div class="content"><ul class="list entry navigation"><li><a class="flat-box" title="/notes/Spark/" href="/notes/Spark/" active-action="action-notesSpark"><div class="name"> Welcome</div></a></li><li><a class="flat-box" title="/notes/Spark/env" href="/notes/Spark/env" active-action="action-notesSparkenv"><div class="name"> Environment Deployment</div></a></li><li><a class="flat-box" title="/notes/Spark/rdd" href="/notes/Spark/rdd" active-action="action-notesSparkrdd"><div class="name"> RDD</div></a></li><li><a class="flat-box" title="/notes/Spark/streaming" href="/notes/Spark/streaming" active-action="action-notesSparkstreaming"><div class="name"> Streaming</div></a></li><li><a class="flat-box" title="/notes/Spark/streaming-kafka" href="/notes/Spark/streaming-kafka" active-action="action-notesSparkstreaming-kafka"><div class="name"> Kafka</div></a></li><li><a class="flat-box" title="/notes/Spark/als" href="/notes/Spark/als" active-action="action-notesSparkals"><div class="name"> ALS</div></a></li><li><a class="flat-box" title="/notes/Spark/k-means" href="/notes/Spark/k-means" active-action="action-notesSparkk-means"><div class="name"> K-Means</div></a></li></ul></div></section><div class="widget-sticky pjax"><section class="widget toc-wrapper desktop mobile" id="toc-div"><header><i class="fa-duotone fa-list fa-fw" aria-hidden="true"></i> <span class="name">本文目录</span></header><div class="content"><ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%95%B0%E6%8D%AE%E9%9B%86"><span class="toc-text">数据集</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%AE%97%E6%B3%95"><span class="toc-text">算法</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#K%E5%9D%87%E5%80%BC%E8%81%9A%E7%B1%BB%E7%AE%97%E6%B3%95"><span class="toc-text">K 均值聚类算法</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%AE%97%E6%B3%95%E8%BF%87%E7%A8%8B"><span class="toc-text">算法过程</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%BC%AA%E4%BB%A3%E7%A0%81"><span class="toc-text">伪代码</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#K-means%E8%81%9A%E7%B1%BB%E6%9C%80%E4%BC%98k%E5%80%BC%E7%9A%84%E9%80%89%E5%8F%96%EF%BC%88%E6%89%8B%E8%82%98%E6%B3%95%EF%BC%89"><span class="toc-text">K-means 聚类最优 k 值的选取(手肘法)</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%89%B9%E5%BE%81%E7%9A%84%E8%A7%84%E8%8C%83%E5%8C%96"><span class="toc-text">特征的规范化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%B1%BB%E5%88%AB%E5%9E%8B%E5%8F%98%E9%87%8F"><span class="toc-text">类别型变量</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%81%9A%E7%B1%BB%E7%BB%93%E6%9E%9C%E8%AF%84%E4%BB%B7%E6%8C%87%E6%A0%87"><span class="toc-text">聚类结果评价指标</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#Entropy%EF%BC%88%E7%86%B5%EF%BC%89"><span class="toc-text">Entropy(熵)</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#Accuracy-%E5%87%86%E7%A1%AE%E7%8E%87"><span class="toc-text">Accuracy (准确率)</span></a></li></ol></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B"><span class="toc-text">实验过程</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%87%86%E5%A4%87%E6%95%B0%E6%8D%AE%EF%BC%8C%E4%B8%8A%E4%BC%A0%E8%87%B3HDFS"><span class="toc-text">准备数据,上传至 HDFS</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%80%9A%E8%BF%87kddcup-names%E5%8A%A0%E8%BD%BD%E5%88%97%E5%90%8D%E7%A7%B0"><span class="toc-text">通过 kddcup.names 加载列名称</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%9E%84%E5%BB%BADataframe"><span class="toc-text">构建 Dataframe</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%95%B0%E6%8D%AE%E9%9B%86%E7%BB%9F%E8%AE%A1"><span class="toc-text">数据集统计</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%B0%9D%E8%AF%95%E8%81%9A%E7%B1%BB"><span class="toc-text">尝试聚类</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#k%E7%9A%84%E9%80%89%E6%8B%A9"><span class="toc-text">k 的选择</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%89%B9%E5%BE%81%E7%9A%84%E8%A7%84%E8%8C%83%E5%8C%96-1"><span class="toc-text">特征的规范化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%B1%BB%E5%88%AB%E5%9E%8B%E5%8F%98%E9%87%8F-1"><span class="toc-text">类别型变量</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%88%A9%E7%94%A8%E6%A0%87%E5%8F%B7%E7%9A%84%E7%86%B5%E4%BF%A1%E6%81%AF"><span class="toc-text">利用标号的熵信息</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%81%9A%E7%B1%BB%E5%AE%9E%E6%88%98"><span class="toc-text">聚类实战</span></a></li></ol></li></ol></div></section></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div></aside><pjax><script>window.pdata={},pdata.ispage=!1,pdata.commentPath="",pdata.commentPlaceholder="",pdata.commentConfig={};var l_header=document.getElementById("l_header");l_header.classList.add("show");var cover_wrapper=document.querySelector("#l_cover .cover-wrapper"),scroll_down=document.getElementById("scroll-down");cover_wrapper.id="none",cover_wrapper.style.display="none",scroll_down.style.display="none"</script></pjax></div><footer class="footer clearfix" itemscope="" itemtype="http://schema.org/WPFooter"><br><br><div class="aplayer-container"><div class="aplayer-local"></div></div><br><div class="social-wrapper" itemprop="about" itemscope="" itemtype="http://schema.org/Thing"><a href="/atom.xml" class="social fa-duotone fa-rss flat-btn" target="_blank" rel="external nofollow noopener noreferrer" itemprop="url"></a><a href="https://mhuig.top/contact/" class="social fa-duotone fa-envelope flat-btn" target="_blank" rel="external nofollow noopener noreferrer" itemprop="url"></a><a href="https://github.com/MHuiG" class="social fa-brands fa-github flat-btn" target="_blank" rel="external nofollow noopener noreferrer" itemprop="url"></a><a href="https://t.me/MHuiG" class="social fa-brands fa-telegram flat-btn" target="_blank" rel="external nofollow noopener noreferrer" itemprop="url"></a></div><div><p>博客内容遵循 <a target="_blank" rel="external nofollow noopener noreferrer" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans">署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议</a></p></div><div class="copyright"><p><a href="https://icp.gov.moe" target="_blank" rel="external nofollow noopener noreferrer">萌ICP备</a> <a href="https://icp.gov.moe/?keyword=2020012138" target="_blank" rel="external nofollow noopener noreferrer">2020012138号</a><br><a target="_blank" rel="noopener" href="https://mhuig.top/">Copyright © Since 2018 MHuiG</a></p></div></footer><a id="s-top" class="fa-solid fa-arrow-up fa-fw" title="top"></a></div></div><div><script>volantis.dom.bodyAnchor=volantis.dom.$(document.getElementById("safearea")),volantis.dom.topBtn=volantis.dom.$(document.getElementById("s-top")),volantis.dom.wrapper=volantis.dom.$(document.getElementById("wrapper")),volantis.dom.coverAnchor=volantis.dom.$(document.querySelector("#l_cover .cover-wrapper")),volantis.dom.switcher=volantis.dom.$(document.querySelector("#l_header .switcher .s-search")),volantis.dom.header=volantis.dom.$(document.getElementById("l_header")),volantis.dom.search=volantis.dom.$(document.querySelector("#l_header .m_search")),volantis.dom.mPhoneList=volantis.dom.$(document.querySelectorAll("#l_header .m-phone .list-v"))</script><script>volantis.css("https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/libs/@fortawesome/fontawesome-pro/css/all.min.css")</script><script src="/js/app.js"></script><script>const rootElement=document.documentElement,darkModeStorageKey="color-scheme",rootElementDarkModeAttributeName="color-scheme",setLS=(e,t)=>{localStorage.setItem(e,t)},removeLS=e=>{localStorage.removeItem(e)},getLS=e=>localStorage.getItem(e),getModeFromCSSMediaQuery=()=>window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light",resetRootDarkModeAttributeAndLS=()=>{rootElement.removeAttribute("color-scheme"),removeLS("color-scheme")},validColorModeKeys={dark:!0,light:!0},applyCustomDarkModeSettings=e=>{const t=e||getLS("color-scheme");getCustomDarkMode(),t===getModeFromCSSMediaQuery()?resetRootDarkModeAttributeAndLS():validColorModeKeys[t]?rootElement.setAttribute("color-scheme",t):resetRootDarkModeAttributeAndLS()},invertDarkModeObj={dark:"light",light:"dark"},getCustomDarkMode=()=>{let e=getLS("color-scheme");if(validColorModeKeys[e])e=invertDarkModeObj[e];else{if(null!==e)return;e=invertDarkModeObj[getModeFromCSSMediaQuery()]}volantis.dark.mode="dark"==e?"light":"dark"},toggleCustomDarkMode=()=>{let e=getLS("color-scheme");if(validColorModeKeys[e])e=invertDarkModeObj[e];else{if(null!==e)return;e=invertDarkModeObj[getModeFromCSSMediaQuery()]}return setLS("color-scheme",e),e};function bindToggleButton(){document.querySelectorAll("#wrapper .toggle-mode-btn,#rightmenu-wrapper .toggle-mode-btn").forEach((function(e){volantis.dom.$(e).on("click",volantis.dark.toggle)}))}volantis.dark.toggle=()=>{const e=toggleCustomDarkMode();applyCustomDarkModeSettings(e),volantis.dark.method.toggle.start()},applyCustomDarkModeSettings(),document.addEventListener("DOMContentLoaded",(()=>{volantis.requestAnimationFrame(bindToggleButton)})),volantis.pjax.push(bindToggleButton);const darkModelListeners={dark:e=>{e.matches&&(volantis.dark.mode="dark"),volantis.dark.method.toggle.start()},light:e=>{e.matches&&(volantis.dark.mode="light"),volantis.dark.method.toggle.start()}};window.matchMedia("(prefers-color-scheme: dark)").addListener(darkModelListeners.dark),window.matchMedia("(prefers-color-scheme: light)").addListener(darkModelListeners.light)</script><script>function loadIssuesJS(){null!=document.getElementById("sites-api")&&"undefined"==typeof SitesJS&&volantis.js("/js/plugins/tags/sites.js");null!=document.getElementById("friends-api")&&"undefined"==typeof FriendsJS&&volantis.js("/js/plugins/tags/friends.js");null!=document.getElementById("contributors-api")&&"undefined"==typeof ContributorsJS&&volantis.js("/js/plugins/tags/contributors.js")}loadIssuesJS(),volantis.pjax.push((()=>{loadIssuesJS()}))</script><script defer="" src="https://cdn.bootcdn.net/ajax/libs/vanilla-lazyload/17.1.0/lazyload.min.js"></script><script>window.lazyLoadOptions={elements_selector:".lazyload",threshold:0},window.addEventListener("LazyLoad::Initialized",(function(n){window.lazyLoadInstance=n.detail.instance}),!1),document.addEventListener("DOMContentLoaded",(function(){lazyLoadInstance.update()})),document.addEventListener("pjax:complete",(function(){lazyLoadInstance.update()}))</script><script>window.FPConfig={delay:0,ignoreKeywords:["#"],maxRPS:6,hoverDelay:0}</script><script defer="" src="https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/libs/flying-pages/flying-pages.min.js"></script><script>volantis.css("https://cdn.bootcdn.net/ajax/libs/aplayer/1.10.1/APlayer.min.css"),volantis.js("https://cdn.bootcdn.net/ajax/libs/aplayer/1.10.1/APlayer.min.js").then((()=>{function e(){document.querySelector(".aplayer-local-min")&&document.querySelectorAll(".aplayer-local-min").forEach((e=>{new APlayer(Object.assign({container:e,mini:!0,order:"list",volume:"0.7",autoplay:!1,loop:"all",theme:"#1BCDFC",listMaxHeight:"320px",listFolded:"true",preload:"auto",lrcType:3,audio:[{name:"虹之间",artist:"钢琴版伴奏",url:"https://blog.mhuig.top/music-Archive/BetweenTheRainbow.mp3",lrc:"https://blog.mhuig.top/music-Archive/BetweenTheRainbow.lrc",cover:"https://blog.mhuig.top/music-Archive/BetweenTheRainbow.jpg"},{name:"Avem",artist:"Alan Walker",url:"https://blog.mhuig.top/music-Archive/Avem.mp3",lrc:"https://blog.mhuig.top/music-Archive/Avem.lrc",cover:"https://blog.mhuig.top/music-Archive/Avem.jpg"},{name:"Fly",artist:"Marshmello / Leau Culver",url:"https://blog.mhuig.top/music-Archive/fly.mp3",lrc:"https://blog.mhuig.top/music-Archive/fly.lrc",cover:"https://blog.mhuig.top/music-Archive/fly.jpg"},{name:"Alone",artist:"Marshmello",url:"https://blog.mhuig.top/music-Archive/alone.mp3",lrc:"https://blog.mhuig.top/music-Archive/alone.lrc",cover:"https://blog.mhuig.top/music-Archive/alone.jpg"}]},JSON.parse(e.querySelector(".aplayer-local-min-conf").innerText)))}))}document.querySelectorAll(".aplayer-local").forEach((e=>{new APlayer({container:e,fixed:!1,order:"list",volume:"0.7",autoplay:!1,loop:"all",theme:"#1BCDFC",listMaxHeight:"320px",listFolded:"true",preload:"auto",lrcType:3,audio:[{name:"虹之间",artist:"钢琴版伴奏",url:"https://blog.mhuig.top/music-Archive/BetweenTheRainbow.mp3",lrc:"https://blog.mhuig.top/music-Archive/BetweenTheRainbow.lrc",cover:"https://blog.mhuig.top/music-Archive/BetweenTheRainbow.jpg"},{name:"Avem",artist:"Alan Walker",url:"https://blog.mhuig.top/music-Archive/Avem.mp3",lrc:"https://blog.mhuig.top/music-Archive/Avem.lrc",cover:"https://blog.mhuig.top/music-Archive/Avem.jpg"},{name:"Fly",artist:"Marshmello / Leau Culver",url:"https://blog.mhuig.top/music-Archive/fly.mp3",lrc:"https://blog.mhuig.top/music-Archive/fly.lrc",cover:"https://blog.mhuig.top/music-Archive/fly.jpg"},{name:"Alone",artist:"Marshmello",url:"https://blog.mhuig.top/music-Archive/alone.mp3",lrc:"https://blog.mhuig.top/music-Archive/alone.lrc",cover:"https://blog.mhuig.top/music-Archive/alone.jpg"}]})})),e(),volantis.pjax.push(e,"aplayerMin")}))</script><script>function check_giscus(){return"dark"===volantis.dark.mode?volantis.giscus.Theme="dark":volantis.giscus.Theme="light",document.getElementById("giscus_container")}function pjax_giscus(){const t=check_giscus();if(!t)return;let s=Object.assign({theme:{light:"light",dark:"dark"},repo:"MHuiG/talk","repo-id":"MDEwOlJlcG9zaXRvcnkyODQ4NDg1NTg=",category:"Giscus","category-id":"DIC_kwDOEPpxrs4B_X67",mapping:"pathname","reactions-enabled":"1","emit-metadata":"1",lang:"zh-CN","input-position":"top"},pdata.commentConfig);const e=document.createElement("script");e.setAttribute("src","https://giscus.app/client.js"),Object.keys(s).forEach((t=>{"theme"!=t&&e.setAttribute("data-"+t,s[t])})),e.setAttribute("data-theme",volantis.giscus.Theme),e.setAttribute("crossorigin","anonymous"),t.appendChild(e)}function dark_giscus(){if(!check_giscus())return;const t={setConfig:{theme:volantis.giscus.Theme}};document.querySelector("iframe.giscus-frame").contentWindow.postMessage({giscus:t},"https://giscus.app")}volantis.layoutHelper("comments",'<div id="giscus_container"></div>'),volantis.giscus={},pjax_giscus(),volantis.pjax.push(pjax_giscus),volantis.dark.push(dark_giscus)</script><script>async function loadSearchScript(){return volantis.js("/js/search/hexo.js")}function loadSearchService(){loadSearchScript(),document.querySelectorAll(".input.u-search-input").forEach((e=>{e.removeEventListener("focus",loadSearchService,!1)})),document.querySelectorAll(".u-search-form").forEach((e=>{e.addEventListener("submit",(e=>{e.preventDefault()}),!1)}))}function OpenSearch(e){"undefined"==typeof SearchService?loadSearchScript().then((()=>{SearchService.setQueryText(e),SearchService.search()})):(SearchService.setQueryText(e),SearchService.search())}if(window.location.search&&/^\?s=/g.test(window.location.search)){OpenSearch(decodeURI(window.location.search).replace(/\ /g,"-").replace(/^\?s=/g,""))}document.querySelectorAll(".input.u-search-input").forEach((e=>{e.addEventListener("focus",loadSearchService,!1)}))</script><script>function pjax_highlightjs_copyCode(){(document.querySelector(".highlight .code pre")||document.querySelector(".article pre code"))&&VolantisApp.utilCopyCode(".highlight .code pre, .article pre code")}volantis.requestAnimationFrame(pjax_highlightjs_copyCode),volantis.pjax.push(pjax_highlightjs_copyCode)</script><script>function load_swiper(){document.querySelectorAll(".swiper-container")[0]&&(volantis.css("https://cdn.bootcdn.net/ajax/libs/Swiper/8.3.2/swiper-bundle.min.css"),volantis.js("https://cdn.bootcdn.net/ajax/libs/Swiper/8.3.2/swiper-bundle.min.js").then((()=>{pjax_swiper()})))}function pjax_swiper(){volantis.swiper=new Swiper(".swiper-container",{slidesPerView:"auto",spaceBetween:8,centeredSlides:!0,loop:!0,pagination:{el:".swiper-pagination",clickable:!0},navigation:{nextEl:".swiper-button-next",prevEl:".swiper-button-prev"}})}load_swiper(),volantis.pjax.push((()=>{document.querySelectorAll(".swiper-container")[0]&&(void 0===volantis.swiper?load_swiper():pjax_swiper())}))</script><script>volantis.css("https://cdn.bootcdn.net/ajax/libs/pace/1.2.4/themes/blue/pace-theme-minimal.min.css"),volantis.js("https://cdn.bootcdn.net/ajax/libs/pace/1.2.4/pace.min.js").then((()=>{Pace.options.restartOnPushState=!1,volantis.pjax.send(Pace.restart,"Pace.restart"),volantis.scroll.push(volantis.debounce((()=>{Pace.stop(),Pace.trigger("start"),Pace.bar.update(100*volantis.scroll.progress()),document.body.className=document.body.className.replaceAll("pace-running ","")})),"阅读进度")}))</script><pjax></pjax><script>function listenSidebarTOC(){const t=document.querySelectorAll(".toc li");if(!t.length)return;const e=[];Array.from(t).forEach((t=>{const n=t.querySelector(".toc-link"),i=document.getElementById(n.getAttribute("href")?decodeURI(n.getAttribute("href")).replace("#",""):n.getAttribute("toc-action").split("toc-")[1]);return e.push(i),n.getAttribute("href")&&(n.setAttribute("toc-action","toc-"+decodeURI(n.getAttribute("href")).replace("#","")),n.removeAttribute("href")),i&&i.id&&n.addEventListener("click",(t=>{t.preventDefault(),volantis.scroll.to(i,{addTop:5,observer:!0}),history.pushState(null,document.title,"#"+i.id)})),i}));function n(t){if(t.classList.contains("active-current"))return;document.querySelectorAll(".toc .active").forEach((t=>{t.classList.remove("active","active-current")})),t.classList.add("active","active-current");let e=t.parentNode;for(;!e.matches(".toc");)e.matches("li")&&e.classList.add("active"),e=e.parentNode}volantis.activateNavIndex=0,n(t[volantis.activateNavIndex]),e[0]&&volantis.scroll.push(volantis.debounce((()=>{if(e[0].getBoundingClientRect().top>=0)volantis.activateNavIndex=0;else if(e[e.length-1].getBoundingClientRect().top<0)volantis.activateNavIndex=e.length-1;else for(let t=0;t<e.length;t++){const n=e[t],i=e[(t+1)%e.length];if(n.getBoundingClientRect().top<0&&i.getBoundingClientRect().top>=0){volantis.activateNavIndex=t;break}}n(t[volantis.activateNavIndex])})),"sidebar-toc")}document.addEventListener("DOMContentLoaded",(()=>{volantis.requestAnimationFrame(listenSidebarTOC)})),volantis.pjax.push(listenSidebarTOC,"listenSidebarTOC")</script><script>try{let e=(e,t,n=2)=>Math.abs(e-t)<=n,t=(t,n)=>!e(t.width,n.width)||!e(t.height,n.height),n=new WeakMap,i=(e,i=e.getClientBoundingRect())=>{let o=n.get(e);o&&!t(o,i)||(n.set(e,i),e.style["contain-intrinsic-size"]=`${i.width}px ${i.height}px`)},o=new IntersectionObserver(((e,t)=>{e.forEach((e=>{i(e.target,e.boundingClientRect)}))}),{rootMargin:"500px 0px 500px 0px"}),r=new ResizeObserver(((e,t)=>{e.forEach((e=>{i(e.target,e.contentRect)}))})),s=e=>{let t=document.querySelectorAll(e);t.length&&(t.forEach((e=>{o.observe(e),r.observe(e)})),requestAnimationFrame((()=>{requestAnimationFrame((()=>{t[0].style["content-visibility"]="auto"}))})))},a=()=>{"content-visibility"in document.documentElement.style&&s(".post-story")};a(),volantis.pjax.push(a)}catch(e){console.log(e)}</script><script>document.onreadystatechange=function(){if("complete"==document.readyState){const{saveData:e,effectiveType:t}=navigator.connection||navigator.mozConnection||navigator.webkitConnection||{};("none"==getComputedStyle(document.querySelector("#safearea"),null).display||e||/2g/.test(t))&&(document.querySelectorAll(".reveal").forEach((function(e){e.style.opacity="1"})),document.querySelector("#safearea").style.display="block")}}</script><script src="https://cdn.bootcdn.net/ajax/libs/pjax/0.2.8/pjax.min.js"></script><script>const performanceMonitor={slowThreshold:800,slowCount:0,maxSlowAllowed:1,requestStartTime:0,start(){this.requestStartTime=Date.now()},check(){Date.now()-this.requestStartTime>this.slowThreshold?this.slowCount++:this.slowCount=0},res(){return this.slowCount>=this.maxSlowAllowed}};var pjax;document.addEventListener("DOMContentLoaded",(function(){pjax=new Pjax({elements:'a[href]:not([href^="#"]):not([href="javascript:void(0)"]):not([pjax-fancybox]):not([onclick="return false;"]):not([onclick="return!1"]):not([target="_blank"]):not([target="view_window"]):not([href$=".xml"])',selectors:["head title","head meta[name=keywords]","head meta[name=description]","#l_main","#pjax-header-nav-list",".pjax","pjax","meta[name=robots]","link[rel=canonical]","meta[property='og:title']","meta[property='og:description']","meta[property='og:url']","meta[property='og:image']","script[type='application/ld+json']"],cacheBust:!1,timeout:900})})),document.addEventListener("pjax:send",(function(e){window.stop(),performanceMonitor.start();try{var t=window.location.pathname,o=e.triggerElement.href,n=[""];""!=n[0]&&n.forEach((e=>{-1==t.indexOf(e)&&-1==o.indexOf(e)||(window.location.href=o)})),performanceMonitor.res()&&(window.location.href=o)}catch(e){}volantis.pjax.method.send.start()})),document.addEventListener("pjax:complete",(function(){performanceMonitor.check(),document.querySelectorAll("script[data-pjax], .pjax-reload script").forEach((e=>{const t=e.text||e.textContent||e.innerHTML||"",o=document.createElement("script");Object.keys(e.attributes).forEach((t=>{o.setAttribute(e.attributes[t].nodeName,e.attributes[t].nodeValue)})),t&&o.appendChild(document.createTextNode(t)),e.parentNode.replaceChild(o,e)})),volantis.pjax.method.complete.start()})),document.addEventListener("pjax:error",(function(e){"pjax"===volantis.debug?(console.error(e),console.log("pjax error: \n"+JSON.stringify(e))):(volantis.pjax.method.error.start(),window.location.href=e.triggerElement.href)}))</script></div><pjax> <a style="display:none" target="_blank" rel="external nofollow noopener noreferrer" href="https://bot-trap.mhuig.top/">Are You A Robot?</a></pjax><script>(()=>{function t(){if("localhost:4000"!=window.location.host&&!/blog\.mhuig\.top/.test(window.location.host)){const t=document.createElement("meta");t.name="robots",t.content=atob("bm9pbmRleCwgbm9mb2xsb3csIG5vYXJjaGl2ZQ=="),document.head.appendChild(t)}}function o(){document.querySelector("figcaption")&&document.querySelectorAll("figcaption").forEach((t=>{volantis.dom.$(t).on("click",(function(){const t=!window.CodeBlockFullscreen;window.CodeBlockFullscreen=t;const o=document.getElementById("post")||document.getElementById("docs")||document.getElementById("page");if(!o)return;const e=this.parentElement,n=e.parentElement,l=document.documentElement,c=document.querySelectorAll(".highlight > table .gutter");o.classList.toggle("code-block-fullscreen",t),e.classList.toggle("code-block-fullscreen",t),n.classList.toggle("code-block-fullscreen",t),e.classList.toggle("code-block-fullscreen-overflow-auto",t),l.classList.toggle("code-block-fullscreen-html-scroll",t),c.forEach((o=>{o.classList.toggle("code-block-fullscreen-gutter",t)}))}))}))}t(),volantis.pjax.push(t),top.location!=self.location&&(top.location=self.location),"mhuig.github.io"==window.location.host||"localhost:4000"==window.location.host||/mhuig\.top$/.test(window.location.host)||/kix\.moe$/.test(window.location.host)||/mhuig/.test(window.location.host)||/ipfs/.test(window.location.host)||(window.location.href=atob("aHR0cHM6Ly9ibG9nLm1odWlnLnRvcC8=")),o(),volantis.pjax.push(o);const e=[{month:12,day:13},function(){const t=(new Date).getFullYear(),o=t%100,e=t>=2e3?4.81:5.59,n=Math.floor(o/4),l=Math.floor(.2422*o+e)-n;return{month:4,day:Math.max(4,l)}}(),{month:7,day:7},{month:9,day:18},{month:9,day:30}];function n(){document.documentElement.classList.remove("mourning-mode");if(!["/","/index.html","/index.htm","/index"].includes(window.location.pathname))return;const t=new Date,o=t.getMonth()+1,n=t.getDate();e.some((t=>t.month===o&&t.day===n))&&document.documentElement.classList.add("mourning-mode")}const l=document.createElement("style");l.textContent="\n      html.mourning-mode {\n        filter: grayscale(100%);\n        -webkit-filter: grayscale(100%);\n        transition: filter 0.5s ease;\n      }\n    ",document.head.appendChild(l),n(),document.addEventListener("pjax:complete",n)})()</script></body></html>