{"id":159,"date":"2018-10-17T12:45:44","date_gmt":"2018-10-17T12:45:44","guid":{"rendered":"http:\/\/vargas-solar.com\/data-centric-smart-everything\/?page_id=159"},"modified":"2020-01-23T18:24:15","modified_gmt":"2020-01-23T18:24:15","slug":"unsupervised-learning-comparing-clustering-methods","status":"publish","type":"page","link":"http:\/\/vargas-solar.com\/data-centric-smart-everything\/hands-on\/unsupervised-learning-comparing-clustering-methods\/","title":{"rendered":"Unsupervised learning comparing clustering methods"},"content":{"rendered":"<p><!DOCTYPE html><br \/>\n<html><br \/>\n<head><meta charset=\"utf-8\" \/><\/p>\n<p><title>ch07_Unsupervised_Learning<\/title><\/p>\n<p><script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/require.js\/2.1.10\/require.min.js\"><\/script><br \/>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jquery\/2.0.3\/jquery.min.js\"><\/script><\/p>\n<style type=\"text\/css\">\n    \/*!\n*\n* Twitter Bootstrap\n*\n*\/\n\/*!\n * Bootstrap v3.3.7 (http:\/\/getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https:\/\/github.com\/twbs\/bootstrap\/blob\/master\/LICENSE)\n *\/\n\/*! normalize.css v3.0.3 | MIT License | github.com\/necolas\/normalize.css *\/\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\nmark {\n  background: #ff0;\n  color: #000;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  box-sizing: content-box;\n  height: 0;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n  border: 0;\n  padding: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\ntd,\nth {\n  padding: 0;\n}\n\/*! Source: https:\/\/github.com\/h5bp\/html5-boilerplate\/blob\/master\/src\/css\/main.css *\/\n@media print {\n  *,\n  *:before,\n  *:after {\n    background: transparent !important;\n    box-shadow: none !important;\n    text-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('..\/components\/bootstrap\/fonts\/glyphicons-halflings-regular.eot');\n  src: url('..\/components\/bootstrap\/fonts\/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('..\/components\/bootstrap\/fonts\/glyphicons-halflings-regular.woff2') format('woff2'), url('..\/components\/bootstrap\/fonts\/glyphicons-halflings-regular.woff') format('woff'), url('..\/components\/bootstrap\/fonts\/glyphicons-halflings-regular.ttf') format('truetype'), url('..\/components\/bootstrap\/fonts\/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\002a\";\n}\n.glyphicon-plus:before {\n  content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.glyphicon-cd:before {\n  content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n  content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n  content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n  content: \"\\e204\";\n}\n.glyphicon-copy:before {\n  content: \"\\e205\";\n}\n.glyphicon-paste:before {\n  content: \"\\e206\";\n}\n.glyphicon-alert:before {\n  content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n  content: \"\\e210\";\n}\n.glyphicon-king:before {\n  content: \"\\e211\";\n}\n.glyphicon-queen:before {\n  content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n  content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n  content: \"\\e214\";\n}\n.glyphicon-knight:before {\n  content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n  content: \"\\e216\";\n}\n.glyphicon-tent:before {\n  content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n  content: \"\\e218\";\n}\n.glyphicon-bed:before {\n  content: \"\\e219\";\n}\n.glyphicon-apple:before {\n  content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n  content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n  content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n  content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n  content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n  content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n  content: \"\\e227\";\n}\n.glyphicon-btc:before {\n  content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n  content: \"\\e227\";\n}\n.glyphicon-yen:before {\n  content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n  content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n  content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n  content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n  content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\";\n}\n.glyphicon-education:before {\n  content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n  content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n  content: \"\\e237\";\n}\n.glyphicon-oil:before {\n  content: \"\\e238\";\n}\n.glyphicon-grain:before {\n  content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n  content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n  content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n  content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n  content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n  content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n  content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n  content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n  content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n  content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n  content: \"\\e253\";\n}\n.glyphicon-console:before {\n  content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n  content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n  content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n  content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n  content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n  content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n  content: \"\\e260\";\n}\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #000;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 3px;\n}\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 2px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 18px;\n  margin-bottom: 18px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n[role=\"button\"] {\n  cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 18px;\n  margin-bottom: 9px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 9px;\n  margin-bottom: 9px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 33px;\n}\nh2,\n.h2 {\n  font-size: 27px;\n}\nh3,\n.h3 {\n  font-size: 23px;\n}\nh4,\n.h4 {\n  font-size: 17px;\n}\nh5,\n.h5 {\n  font-size: 13px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 9px;\n}\n.lead {\n  margin-bottom: 18px;\n  font-size: 14px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 19.5px;\n  }\n}\nsmall,\n.small {\n  font-size: 92%;\n}\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 8px;\n  margin: 36px 0 18px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 9px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 18px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 541px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 9px 18px;\n  margin: 0 0 18px;\n  font-size: inherit;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 18px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 2px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #888;\n  background-color: transparent;\n  border-radius: 1px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  box-shadow: none;\n}\npre {\n  display: block;\n  padding: 8.5px;\n  margin: 0 0 9px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 2px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 0px;\n  padding-right: 0px;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 768px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 940px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1140px;\n  }\n}\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 0px;\n  padding-right: 0px;\n}\n.row {\n  margin-left: 0px;\n  margin-right: 0px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 0px;\n  padding-right: 0px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0%;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0%;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 18px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 13.5px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 18px;\n  font-size: 19.5px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #555555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 32px;\n  padding: 6px 12px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #555555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 2px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control::-ms-expand {\n  border: 0;\n  background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  background-color: #eeeeee;\n  opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"].form-control,\n  input[type=\"time\"].form-control,\n  input[type=\"datetime-local\"].form-control,\n  input[type=\"month\"].form-control {\n    line-height: 32px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm,\n  .input-group-sm input[type=\"date\"],\n  .input-group-sm input[type=\"time\"],\n  .input-group-sm input[type=\"datetime-local\"],\n  .input-group-sm input[type=\"month\"] {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg,\n  .input-group-lg input[type=\"date\"],\n  .input-group-lg input[type=\"time\"],\n  .input-group-lg input[type=\"datetime-local\"],\n  .input-group-lg input[type=\"month\"] {\n    line-height: 45px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 18px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n  min-height: 31px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 1px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 1px;\n}\n.form-group-sm select.form-control {\n  height: 30px;\n  line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n  height: auto;\n}\n.form-group-sm .form-control-static {\n  height: 30px;\n  min-height: 30px;\n  padding: 6px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.input-lg {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 17px;\n  line-height: 1.3333333;\n  border-radius: 3px;\n}\nselect.input-lg {\n  height: 45px;\n  line-height: 45px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n  height: auto;\n}\n.form-group-lg .form-control {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 17px;\n  line-height: 1.3333333;\n  border-radius: 3px;\n}\n.form-group-lg select.form-control {\n  height: 45px;\n  line-height: 45px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n  height: auto;\n}\n.form-group-lg .form-control-static {\n  height: 45px;\n  min-height: 35px;\n  padding: 11px 16px;\n  font-size: 17px;\n  line-height: 1.3333333;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 40px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 32px;\n  height: 32px;\n  line-height: 32px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: 45px;\n  height: 45px;\n  line-height: 45px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  border-color: #3c763d;\n  background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 23px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #404040;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 25px;\n}\n.form-horizontal .form-group {\n  margin-left: 0px;\n  margin-right: 0px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 0px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 11px;\n    font-size: 17px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n    font-size: 12px;\n  }\n}\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  border-radius: 2px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  outline: 0;\n  background-image: none;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n  pointer-events: none;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #8c8c8c;\n}\n.btn-default:hover {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n  color: #333;\n  background-color: #d4d4d4;\n  border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n  color: #fff;\n  background-color: #286090;\n  border-color: #122b40;\n}\n.btn-primary:hover {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n  color: #fff;\n  background-color: #204d74;\n  border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #255625;\n}\n.btn-success:hover {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n  color: #fff;\n  background-color: #398439;\n  border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #1b6d85;\n}\n.btn-info:hover {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n  color: #fff;\n  background-color: #269abc;\n  border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #985f0d;\n}\n.btn-warning:hover {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n  color: #fff;\n  background-color: #d58512;\n  border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #761c19;\n}\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n  color: #fff;\n  background-color: #ac2925;\n  border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  color: #337ab7;\n  font-weight: normal;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 17px;\n  line-height: 1.3333333;\n  border-radius: 3px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 1px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 1px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-property: height, visibility;\n  transition-property: height, visibility;\n  -webkit-transition-duration: 0.35s;\n  transition-duration: 0.35s;\n  -webkit-transition-timing-function: ease;\n  transition-timing-function: ease;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px dashed;\n  border-top: 4px solid \\9;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 13px;\n  text-align: left;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 2px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 8px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  left: auto;\n  right: 0;\n}\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px dashed;\n  border-bottom: 4px solid \\9;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px;\n}\n@media (min-width: 541px) {\n  .navbar-right .dropdown-menu {\n    left: auto;\n    right: 0;\n  }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 2px;\n  border-top-left-radius: 2px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n  border-bottom-right-radius: 2px;\n  border-bottom-left-radius: 2px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  float: none;\n  display: table-cell;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group .form-control:focus {\n  z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 17px;\n  line-height: 1.3333333;\n  border-radius: 3px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  line-height: 45px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 1px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 13px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n  border-radius: 2px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 1px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 17px;\n  border-radius: 3px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  z-index: 2;\n  margin-left: -1px;\n}\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n  color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777777;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 8px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 2px 2px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 2px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 2px 2px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 2px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #fff;\n  background-color: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 2px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 2px 2px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 30px;\n  margin-bottom: 18px;\n  border: 1px solid transparent;\n}\n@media (min-width: 541px) {\n  .navbar {\n    border-radius: 2px;\n  }\n}\n@media (min-width: 541px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 0px;\n  padding-left: 0px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 541px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 540px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: 0px;\n  margin-left: 0px;\n}\n@media (min-width: 541px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 541px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 541px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  padding: 6px 0px;\n  font-size: 17px;\n  line-height: 18px;\n  height: 30px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 541px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: 0px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 0px;\n  padding: 9px 10px;\n  margin-top: -2px;\n  margin-bottom: -2px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 2px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 541px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 3px 0px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 18px;\n}\n@media (max-width: 540px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 18px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 541px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 6px;\n    padding-bottom: 6px;\n  }\n}\n.navbar-form {\n  margin-left: 0px;\n  margin-right: 0px;\n  padding: 10px 0px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  margin-top: -1px;\n  margin-bottom: -1px;\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 540px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 541px) {\n  .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-right-radius: 2px;\n  border-top-left-radius: 2px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: -1px;\n  margin-bottom: -1px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 0px;\n  margin-bottom: 0px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 4px;\n  margin-bottom: 4px;\n}\n.navbar-text {\n  margin-top: 6px;\n  margin-bottom: 6px;\n}\n@media (min-width: 541px) {\n  .navbar-text {\n    float: left;\n    margin-left: 0px;\n    margin-right: 0px;\n  }\n}\n@media (min-width: 541px) {\n  .navbar-left {\n    float: left !important;\n    float: left;\n  }\n  .navbar-right {\n    float: right !important;\n    float: right;\n    margin-right: 0px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  background-color: #e7e7e7;\n  color: #555;\n}\n@media (max-width: 540px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #080808;\n  color: #fff;\n}\n@media (max-width: 540px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #fff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 18px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 2px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  content: \"\/\\00a0\";\n  padding: 0 5px;\n  color: #5e5e5e;\n}\n.breadcrumb > .active {\n  color: #777777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 18px 0;\n  border-radius: 2px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  line-height: 1.42857143;\n  text-decoration: none;\n  color: #337ab7;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 2px;\n  border-top-left-radius: 2px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-bottom-right-radius: 2px;\n  border-top-right-radius: 2px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  z-index: 2;\n  color: #23527c;\n  background-color: #eeeeee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 3;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n  cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777777;\n  background-color: #fff;\n  border-color: #ddd;\n  cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 17px;\n  line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 1px;\n  border-top-left-radius: 1px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 1px;\n  border-top-right-radius: 1px;\n}\n.pager {\n  padding-left: 0;\n  margin: 18px 0;\n  list-style: none;\n  text-align: center;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777777;\n  background-color: #fff;\n  cursor: not-allowed;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #fff;\n  line-height: 1;\n  vertical-align: middle;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #777777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding-top: 30px;\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 20px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 3px;\n  padding-left: 0px;\n  padding-right: 0px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 59px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 18px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 2px;\n  -webkit-transition: border 0.2s ease-in-out;\n  -o-transition: border 0.2s ease-in-out;\n  transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-left: auto;\n  margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #000;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 18px;\n  border: 1px solid transparent;\n  border-radius: 2px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #3c763d;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 18px;\n  margin-bottom: 18px;\n  background-color: #f5f5f5;\n  border-radius: 2px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 18px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden;\n}\n.media-body {\n  width: 10000px;\n}\n.media-object {\n  display: block;\n}\n.media-object.img-thumbnail {\n  max-width: none;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-right-radius: 2px;\n  border-top-left-radius: 2px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 2px;\n  border-bottom-left-radius: 2px;\n}\na.list-group-item,\nbutton.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n  text-decoration: none;\n  color: #555;\n  background-color: #f5f5f5;\n}\nbutton.list-group-item {\n  width: 100%;\n  text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  background-color: #eeeeee;\n  color: #777777;\n  cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 18px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 1px;\n  border-top-left-radius: 1px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 15px;\n  color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 1px;\n  border-bottom-left-radius: 1px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-right-radius: 1px;\n  border-top-left-radius: 1px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 1px;\n  border-bottom-left-radius: 1px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 1px;\n  border-top-left-radius: 1px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 1px;\n  border-top-right-radius: 1px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 1px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 1px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 1px;\n  border-bottom-left-radius: 1px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-left-radius: 1px;\n  border-bottom-right-radius: 1px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 1px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 1px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0;\n}\n.panel-group {\n  margin-bottom: 18px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 2px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  height: 100%;\n  width: 100%;\n  border: 0;\n}\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 2px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 3px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 1px;\n}\n.close {\n  float: right;\n  font-size: 19.5px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  -o-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 3px;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n  outline: 0;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: 1.42857143;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  font-size: 12px;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 2px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: 1.42857143;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  font-size: 13px;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 3px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 13px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 2px 2px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top > .arrow:after {\n  content: \" \";\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #fff;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n  content: \" \";\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom > .arrow:after {\n  content: \" \";\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n  content: \" \";\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #fff;\n  bottom: -10px;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform 0.6s ease-in-out;\n    -moz-transition: -moz-transform 0.6s ease-in-out;\n    -o-transition: -o-transform 0.6s ease-in-out;\n    transition: transform 0.6s ease-in-out;\n    -webkit-backface-visibility: hidden;\n    -moz-backface-visibility: hidden;\n    backface-visibility: hidden;\n    -webkit-perspective: 1000px;\n    -moz-perspective: 1000px;\n    perspective: 1000px;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n    left: 0;\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n  left: auto;\n  right: 0;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  outline: 0;\n  color: #fff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  margin-top: -10px;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  line-height: 1;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  border: 1px solid #fff;\n  border-radius: 10px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n  margin: 0;\n  width: 12px;\n  height: 12px;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -10px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -10px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -10px;\n  }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after,\n.item_buttons:before,\n.item_buttons:after {\n  content: \" \";\n  display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after,\n.item_buttons:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0\/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n\/*!\n*\n* Font Awesome\n*\n*\/\n\/*!\n *  Font Awesome 4.7.0 by @davegandy - http:\/\/fontawesome.io - @fontawesome\n *  License - http:\/\/fontawesome.io\/license (Font: SIL OFL 1.1, CSS: MIT License)\n *\/\n\/* FONT PATH\n * -------------------------- *\/\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('..\/components\/font-awesome\/fonts\/fontawesome-webfont.eot?v=4.7.0');\n  src: url('..\/components\/font-awesome\/fonts\/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('..\/components\/font-awesome\/fonts\/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('..\/components\/font-awesome\/fonts\/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('..\/components\/font-awesome\/fonts\/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('..\/components\/font-awesome\/fonts\/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n.fa {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\/* makes the font 33% larger relative to the icon container *\/\n.fa-lg {\n  font-size: 1.33333333em;\n  line-height: 0.75em;\n  vertical-align: -15%;\n}\n.fa-2x {\n  font-size: 2em;\n}\n.fa-3x {\n  font-size: 3em;\n}\n.fa-4x {\n  font-size: 4em;\n}\n.fa-5x {\n  font-size: 5em;\n}\n.fa-fw {\n  width: 1.28571429em;\n  text-align: center;\n}\n.fa-ul {\n  padding-left: 0;\n  margin-left: 2.14285714em;\n  list-style-type: none;\n}\n.fa-ul > li {\n  position: relative;\n}\n.fa-li {\n  position: absolute;\n  left: -2.14285714em;\n  width: 2.14285714em;\n  top: 0.14285714em;\n  text-align: center;\n}\n.fa-li.fa-lg {\n  left: -1.85714286em;\n}\n.fa-border {\n  padding: .2em .25em .15em;\n  border: solid 0.08em #eee;\n  border-radius: .1em;\n}\n.fa-pull-left {\n  float: left;\n}\n.fa-pull-right {\n  float: right;\n}\n.fa.fa-pull-left {\n  margin-right: .3em;\n}\n.fa.fa-pull-right {\n  margin-left: .3em;\n}\n\/* Deprecated as of 4.4.0 *\/\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n.fa.pull-left {\n  margin-right: .3em;\n}\n.fa.pull-right {\n  margin-left: .3em;\n}\n.fa-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n  animation: fa-spin 2s infinite linear;\n}\n.fa-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n  animation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n.fa-rotate-90 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg);\n}\n.fa-rotate-180 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";\n  -webkit-transform: rotate(180deg);\n  -ms-transform: rotate(180deg);\n  transform: rotate(180deg);\n}\n.fa-rotate-270 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";\n  -webkit-transform: rotate(270deg);\n  -ms-transform: rotate(270deg);\n  transform: rotate(270deg);\n}\n.fa-flip-horizontal {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";\n  -webkit-transform: scale(-1, 1);\n  -ms-transform: scale(-1, 1);\n  transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n  -webkit-transform: scale(1, -1);\n  -ms-transform: scale(1, -1);\n  transform: scale(1, -1);\n}\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n  filter: none;\n}\n.fa-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.fa-stack-1x,\n.fa-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.fa-stack-1x {\n  line-height: inherit;\n}\n.fa-stack-2x {\n  font-size: 2em;\n}\n.fa-inverse {\n  color: #fff;\n}\n\/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons *\/\n.fa-glass:before {\n  content: \"\\f000\";\n}\n.fa-music:before {\n  content: \"\\f001\";\n}\n.fa-search:before {\n  content: \"\\f002\";\n}\n.fa-envelope-o:before {\n  content: \"\\f003\";\n}\n.fa-heart:before {\n  content: \"\\f004\";\n}\n.fa-star:before {\n  content: \"\\f005\";\n}\n.fa-star-o:before {\n  content: \"\\f006\";\n}\n.fa-user:before {\n  content: \"\\f007\";\n}\n.fa-film:before {\n  content: \"\\f008\";\n}\n.fa-th-large:before {\n  content: \"\\f009\";\n}\n.fa-th:before {\n  content: \"\\f00a\";\n}\n.fa-th-list:before {\n  content: \"\\f00b\";\n}\n.fa-check:before {\n  content: \"\\f00c\";\n}\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n  content: \"\\f00d\";\n}\n.fa-search-plus:before {\n  content: \"\\f00e\";\n}\n.fa-search-minus:before {\n  content: \"\\f010\";\n}\n.fa-power-off:before {\n  content: \"\\f011\";\n}\n.fa-signal:before {\n  content: \"\\f012\";\n}\n.fa-gear:before,\n.fa-cog:before {\n  content: \"\\f013\";\n}\n.fa-trash-o:before {\n  content: \"\\f014\";\n}\n.fa-home:before {\n  content: \"\\f015\";\n}\n.fa-file-o:before {\n  content: \"\\f016\";\n}\n.fa-clock-o:before {\n  content: \"\\f017\";\n}\n.fa-road:before {\n  content: \"\\f018\";\n}\n.fa-download:before {\n  content: \"\\f019\";\n}\n.fa-arrow-circle-o-down:before {\n  content: \"\\f01a\";\n}\n.fa-arrow-circle-o-up:before {\n  content: \"\\f01b\";\n}\n.fa-inbox:before {\n  content: \"\\f01c\";\n}\n.fa-play-circle-o:before {\n  content: \"\\f01d\";\n}\n.fa-rotate-right:before,\n.fa-repeat:before {\n  content: \"\\f01e\";\n}\n.fa-refresh:before {\n  content: \"\\f021\";\n}\n.fa-list-alt:before {\n  content: \"\\f022\";\n}\n.fa-lock:before {\n  content: \"\\f023\";\n}\n.fa-flag:before {\n  content: \"\\f024\";\n}\n.fa-headphones:before {\n  content: \"\\f025\";\n}\n.fa-volume-off:before {\n  content: \"\\f026\";\n}\n.fa-volume-down:before {\n  content: \"\\f027\";\n}\n.fa-volume-up:before {\n  content: \"\\f028\";\n}\n.fa-qrcode:before {\n  content: \"\\f029\";\n}\n.fa-barcode:before {\n  content: \"\\f02a\";\n}\n.fa-tag:before {\n  content: \"\\f02b\";\n}\n.fa-tags:before {\n  content: \"\\f02c\";\n}\n.fa-book:before {\n  content: \"\\f02d\";\n}\n.fa-bookmark:before {\n  content: \"\\f02e\";\n}\n.fa-print:before {\n  content: \"\\f02f\";\n}\n.fa-camera:before {\n  content: \"\\f030\";\n}\n.fa-font:before {\n  content: \"\\f031\";\n}\n.fa-bold:before {\n  content: \"\\f032\";\n}\n.fa-italic:before {\n  content: \"\\f033\";\n}\n.fa-text-height:before {\n  content: \"\\f034\";\n}\n.fa-text-width:before {\n  content: \"\\f035\";\n}\n.fa-align-left:before {\n  content: \"\\f036\";\n}\n.fa-align-center:before {\n  content: \"\\f037\";\n}\n.fa-align-right:before {\n  content: \"\\f038\";\n}\n.fa-align-justify:before {\n  content: \"\\f039\";\n}\n.fa-list:before {\n  content: \"\\f03a\";\n}\n.fa-dedent:before,\n.fa-outdent:before {\n  content: \"\\f03b\";\n}\n.fa-indent:before {\n  content: \"\\f03c\";\n}\n.fa-video-camera:before {\n  content: \"\\f03d\";\n}\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n  content: \"\\f03e\";\n}\n.fa-pencil:before {\n  content: \"\\f040\";\n}\n.fa-map-marker:before {\n  content: \"\\f041\";\n}\n.fa-adjust:before {\n  content: \"\\f042\";\n}\n.fa-tint:before {\n  content: \"\\f043\";\n}\n.fa-edit:before,\n.fa-pencil-square-o:before {\n  content: \"\\f044\";\n}\n.fa-share-square-o:before {\n  content: \"\\f045\";\n}\n.fa-check-square-o:before {\n  content: \"\\f046\";\n}\n.fa-arrows:before {\n  content: \"\\f047\";\n}\n.fa-step-backward:before {\n  content: \"\\f048\";\n}\n.fa-fast-backward:before {\n  content: \"\\f049\";\n}\n.fa-backward:before {\n  content: \"\\f04a\";\n}\n.fa-play:before {\n  content: \"\\f04b\";\n}\n.fa-pause:before {\n  content: \"\\f04c\";\n}\n.fa-stop:before {\n  content: \"\\f04d\";\n}\n.fa-forward:before {\n  content: \"\\f04e\";\n}\n.fa-fast-forward:before {\n  content: \"\\f050\";\n}\n.fa-step-forward:before {\n  content: \"\\f051\";\n}\n.fa-eject:before {\n  content: \"\\f052\";\n}\n.fa-chevron-left:before {\n  content: \"\\f053\";\n}\n.fa-chevron-right:before {\n  content: \"\\f054\";\n}\n.fa-plus-circle:before {\n  content: \"\\f055\";\n}\n.fa-minus-circle:before {\n  content: \"\\f056\";\n}\n.fa-times-circle:before {\n  content: \"\\f057\";\n}\n.fa-check-circle:before {\n  content: \"\\f058\";\n}\n.fa-question-circle:before {\n  content: \"\\f059\";\n}\n.fa-info-circle:before {\n  content: \"\\f05a\";\n}\n.fa-crosshairs:before {\n  content: \"\\f05b\";\n}\n.fa-times-circle-o:before {\n  content: \"\\f05c\";\n}\n.fa-check-circle-o:before {\n  content: \"\\f05d\";\n}\n.fa-ban:before {\n  content: \"\\f05e\";\n}\n.fa-arrow-left:before {\n  content: \"\\f060\";\n}\n.fa-arrow-right:before {\n  content: \"\\f061\";\n}\n.fa-arrow-up:before {\n  content: \"\\f062\";\n}\n.fa-arrow-down:before {\n  content: \"\\f063\";\n}\n.fa-mail-forward:before,\n.fa-share:before {\n  content: \"\\f064\";\n}\n.fa-expand:before {\n  content: \"\\f065\";\n}\n.fa-compress:before {\n  content: \"\\f066\";\n}\n.fa-plus:before {\n  content: \"\\f067\";\n}\n.fa-minus:before {\n  content: \"\\f068\";\n}\n.fa-asterisk:before {\n  content: \"\\f069\";\n}\n.fa-exclamation-circle:before {\n  content: \"\\f06a\";\n}\n.fa-gift:before {\n  content: \"\\f06b\";\n}\n.fa-leaf:before {\n  content: \"\\f06c\";\n}\n.fa-fire:before {\n  content: \"\\f06d\";\n}\n.fa-eye:before {\n  content: \"\\f06e\";\n}\n.fa-eye-slash:before {\n  content: \"\\f070\";\n}\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n  content: \"\\f071\";\n}\n.fa-plane:before {\n  content: \"\\f072\";\n}\n.fa-calendar:before {\n  content: \"\\f073\";\n}\n.fa-random:before {\n  content: \"\\f074\";\n}\n.fa-comment:before {\n  content: \"\\f075\";\n}\n.fa-magnet:before {\n  content: \"\\f076\";\n}\n.fa-chevron-up:before {\n  content: \"\\f077\";\n}\n.fa-chevron-down:before {\n  content: \"\\f078\";\n}\n.fa-retweet:before {\n  content: \"\\f079\";\n}\n.fa-shopping-cart:before {\n  content: \"\\f07a\";\n}\n.fa-folder:before {\n  content: \"\\f07b\";\n}\n.fa-folder-open:before {\n  content: \"\\f07c\";\n}\n.fa-arrows-v:before {\n  content: \"\\f07d\";\n}\n.fa-arrows-h:before {\n  content: \"\\f07e\";\n}\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n  content: \"\\f080\";\n}\n.fa-twitter-square:before {\n  content: \"\\f081\";\n}\n.fa-facebook-square:before {\n  content: \"\\f082\";\n}\n.fa-camera-retro:before {\n  content: \"\\f083\";\n}\n.fa-key:before {\n  content: \"\\f084\";\n}\n.fa-gears:before,\n.fa-cogs:before {\n  content: \"\\f085\";\n}\n.fa-comments:before {\n  content: \"\\f086\";\n}\n.fa-thumbs-o-up:before {\n  content: \"\\f087\";\n}\n.fa-thumbs-o-down:before {\n  content: \"\\f088\";\n}\n.fa-star-half:before {\n  content: \"\\f089\";\n}\n.fa-heart-o:before {\n  content: \"\\f08a\";\n}\n.fa-sign-out:before {\n  content: \"\\f08b\";\n}\n.fa-linkedin-square:before {\n  content: \"\\f08c\";\n}\n.fa-thumb-tack:before {\n  content: \"\\f08d\";\n}\n.fa-external-link:before {\n  content: \"\\f08e\";\n}\n.fa-sign-in:before {\n  content: \"\\f090\";\n}\n.fa-trophy:before {\n  content: \"\\f091\";\n}\n.fa-github-square:before {\n  content: \"\\f092\";\n}\n.fa-upload:before {\n  content: \"\\f093\";\n}\n.fa-lemon-o:before {\n  content: \"\\f094\";\n}\n.fa-phone:before {\n  content: \"\\f095\";\n}\n.fa-square-o:before {\n  content: \"\\f096\";\n}\n.fa-bookmark-o:before {\n  content: \"\\f097\";\n}\n.fa-phone-square:before {\n  content: \"\\f098\";\n}\n.fa-twitter:before {\n  content: \"\\f099\";\n}\n.fa-facebook-f:before,\n.fa-facebook:before {\n  content: \"\\f09a\";\n}\n.fa-github:before {\n  content: \"\\f09b\";\n}\n.fa-unlock:before {\n  content: \"\\f09c\";\n}\n.fa-credit-card:before {\n  content: \"\\f09d\";\n}\n.fa-feed:before,\n.fa-rss:before {\n  content: \"\\f09e\";\n}\n.fa-hdd-o:before {\n  content: \"\\f0a0\";\n}\n.fa-bullhorn:before {\n  content: \"\\f0a1\";\n}\n.fa-bell:before {\n  content: \"\\f0f3\";\n}\n.fa-certificate:before {\n  content: \"\\f0a3\";\n}\n.fa-hand-o-right:before {\n  content: \"\\f0a4\";\n}\n.fa-hand-o-left:before {\n  content: \"\\f0a5\";\n}\n.fa-hand-o-up:before {\n  content: \"\\f0a6\";\n}\n.fa-hand-o-down:before {\n  content: \"\\f0a7\";\n}\n.fa-arrow-circle-left:before {\n  content: \"\\f0a8\";\n}\n.fa-arrow-circle-right:before {\n  content: \"\\f0a9\";\n}\n.fa-arrow-circle-up:before {\n  content: \"\\f0aa\";\n}\n.fa-arrow-circle-down:before {\n  content: \"\\f0ab\";\n}\n.fa-globe:before {\n  content: \"\\f0ac\";\n}\n.fa-wrench:before {\n  content: \"\\f0ad\";\n}\n.fa-tasks:before {\n  content: \"\\f0ae\";\n}\n.fa-filter:before {\n  content: \"\\f0b0\";\n}\n.fa-briefcase:before {\n  content: \"\\f0b1\";\n}\n.fa-arrows-alt:before {\n  content: \"\\f0b2\";\n}\n.fa-group:before,\n.fa-users:before {\n  content: \"\\f0c0\";\n}\n.fa-chain:before,\n.fa-link:before {\n  content: \"\\f0c1\";\n}\n.fa-cloud:before {\n  content: \"\\f0c2\";\n}\n.fa-flask:before {\n  content: \"\\f0c3\";\n}\n.fa-cut:before,\n.fa-scissors:before {\n  content: \"\\f0c4\";\n}\n.fa-copy:before,\n.fa-files-o:before {\n  content: \"\\f0c5\";\n}\n.fa-paperclip:before {\n  content: \"\\f0c6\";\n}\n.fa-save:before,\n.fa-floppy-o:before {\n  content: \"\\f0c7\";\n}\n.fa-square:before {\n  content: \"\\f0c8\";\n}\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n  content: \"\\f0c9\";\n}\n.fa-list-ul:before {\n  content: \"\\f0ca\";\n}\n.fa-list-ol:before {\n  content: \"\\f0cb\";\n}\n.fa-strikethrough:before {\n  content: \"\\f0cc\";\n}\n.fa-underline:before {\n  content: \"\\f0cd\";\n}\n.fa-table:before {\n  content: \"\\f0ce\";\n}\n.fa-magic:before {\n  content: \"\\f0d0\";\n}\n.fa-truck:before {\n  content: \"\\f0d1\";\n}\n.fa-pinterest:before {\n  content: \"\\f0d2\";\n}\n.fa-pinterest-square:before {\n  content: \"\\f0d3\";\n}\n.fa-google-plus-square:before {\n  content: \"\\f0d4\";\n}\n.fa-google-plus:before {\n  content: \"\\f0d5\";\n}\n.fa-money:before {\n  content: \"\\f0d6\";\n}\n.fa-caret-down:before {\n  content: \"\\f0d7\";\n}\n.fa-caret-up:before {\n  content: \"\\f0d8\";\n}\n.fa-caret-left:before {\n  content: \"\\f0d9\";\n}\n.fa-caret-right:before {\n  content: \"\\f0da\";\n}\n.fa-columns:before {\n  content: \"\\f0db\";\n}\n.fa-unsorted:before,\n.fa-sort:before {\n  content: \"\\f0dc\";\n}\n.fa-sort-down:before,\n.fa-sort-desc:before {\n  content: \"\\f0dd\";\n}\n.fa-sort-up:before,\n.fa-sort-asc:before {\n  content: \"\\f0de\";\n}\n.fa-envelope:before {\n  content: \"\\f0e0\";\n}\n.fa-linkedin:before {\n  content: \"\\f0e1\";\n}\n.fa-rotate-left:before,\n.fa-undo:before {\n  content: \"\\f0e2\";\n}\n.fa-legal:before,\n.fa-gavel:before {\n  content: \"\\f0e3\";\n}\n.fa-dashboard:before,\n.fa-tachometer:before {\n  content: \"\\f0e4\";\n}\n.fa-comment-o:before {\n  content: \"\\f0e5\";\n}\n.fa-comments-o:before {\n  content: \"\\f0e6\";\n}\n.fa-flash:before,\n.fa-bolt:before {\n  content: \"\\f0e7\";\n}\n.fa-sitemap:before {\n  content: \"\\f0e8\";\n}\n.fa-umbrella:before {\n  content: \"\\f0e9\";\n}\n.fa-paste:before,\n.fa-clipboard:before {\n  content: \"\\f0ea\";\n}\n.fa-lightbulb-o:before {\n  content: \"\\f0eb\";\n}\n.fa-exchange:before {\n  content: \"\\f0ec\";\n}\n.fa-cloud-download:before {\n  content: \"\\f0ed\";\n}\n.fa-cloud-upload:before {\n  content: \"\\f0ee\";\n}\n.fa-user-md:before {\n  content: \"\\f0f0\";\n}\n.fa-stethoscope:before {\n  content: \"\\f0f1\";\n}\n.fa-suitcase:before {\n  content: \"\\f0f2\";\n}\n.fa-bell-o:before {\n  content: \"\\f0a2\";\n}\n.fa-coffee:before {\n  content: \"\\f0f4\";\n}\n.fa-cutlery:before {\n  content: \"\\f0f5\";\n}\n.fa-file-text-o:before {\n  content: \"\\f0f6\";\n}\n.fa-building-o:before {\n  content: \"\\f0f7\";\n}\n.fa-hospital-o:before {\n  content: \"\\f0f8\";\n}\n.fa-ambulance:before {\n  content: \"\\f0f9\";\n}\n.fa-medkit:before {\n  content: \"\\f0fa\";\n}\n.fa-fighter-jet:before {\n  content: \"\\f0fb\";\n}\n.fa-beer:before {\n  content: \"\\f0fc\";\n}\n.fa-h-square:before {\n  content: \"\\f0fd\";\n}\n.fa-plus-square:before {\n  content: \"\\f0fe\";\n}\n.fa-angle-double-left:before {\n  content: \"\\f100\";\n}\n.fa-angle-double-right:before {\n  content: \"\\f101\";\n}\n.fa-angle-double-up:before {\n  content: \"\\f102\";\n}\n.fa-angle-double-down:before {\n  content: \"\\f103\";\n}\n.fa-angle-left:before {\n  content: \"\\f104\";\n}\n.fa-angle-right:before {\n  content: \"\\f105\";\n}\n.fa-angle-up:before {\n  content: \"\\f106\";\n}\n.fa-angle-down:before {\n  content: \"\\f107\";\n}\n.fa-desktop:before {\n  content: \"\\f108\";\n}\n.fa-laptop:before {\n  content: \"\\f109\";\n}\n.fa-tablet:before {\n  content: \"\\f10a\";\n}\n.fa-mobile-phone:before,\n.fa-mobile:before {\n  content: \"\\f10b\";\n}\n.fa-circle-o:before {\n  content: \"\\f10c\";\n}\n.fa-quote-left:before {\n  content: \"\\f10d\";\n}\n.fa-quote-right:before {\n  content: \"\\f10e\";\n}\n.fa-spinner:before {\n  content: \"\\f110\";\n}\n.fa-circle:before {\n  content: \"\\f111\";\n}\n.fa-mail-reply:before,\n.fa-reply:before {\n  content: \"\\f112\";\n}\n.fa-github-alt:before {\n  content: \"\\f113\";\n}\n.fa-folder-o:before {\n  content: \"\\f114\";\n}\n.fa-folder-open-o:before {\n  content: \"\\f115\";\n}\n.fa-smile-o:before {\n  content: \"\\f118\";\n}\n.fa-frown-o:before {\n  content: \"\\f119\";\n}\n.fa-meh-o:before {\n  content: \"\\f11a\";\n}\n.fa-gamepad:before {\n  content: \"\\f11b\";\n}\n.fa-keyboard-o:before {\n  content: \"\\f11c\";\n}\n.fa-flag-o:before {\n  content: \"\\f11d\";\n}\n.fa-flag-checkered:before {\n  content: \"\\f11e\";\n}\n.fa-terminal:before {\n  content: \"\\f120\";\n}\n.fa-code:before {\n  content: \"\\f121\";\n}\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n  content: \"\\f122\";\n}\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n  content: \"\\f123\";\n}\n.fa-location-arrow:before {\n  content: \"\\f124\";\n}\n.fa-crop:before {\n  content: \"\\f125\";\n}\n.fa-code-fork:before {\n  content: \"\\f126\";\n}\n.fa-unlink:before,\n.fa-chain-broken:before {\n  content: \"\\f127\";\n}\n.fa-question:before {\n  content: \"\\f128\";\n}\n.fa-info:before {\n  content: \"\\f129\";\n}\n.fa-exclamation:before {\n  content: \"\\f12a\";\n}\n.fa-superscript:before {\n  content: \"\\f12b\";\n}\n.fa-subscript:before {\n  content: \"\\f12c\";\n}\n.fa-eraser:before {\n  content: \"\\f12d\";\n}\n.fa-puzzle-piece:before {\n  content: \"\\f12e\";\n}\n.fa-microphone:before {\n  content: \"\\f130\";\n}\n.fa-microphone-slash:before {\n  content: \"\\f131\";\n}\n.fa-shield:before {\n  content: \"\\f132\";\n}\n.fa-calendar-o:before {\n  content: \"\\f133\";\n}\n.fa-fire-extinguisher:before {\n  content: \"\\f134\";\n}\n.fa-rocket:before {\n  content: \"\\f135\";\n}\n.fa-maxcdn:before {\n  content: \"\\f136\";\n}\n.fa-chevron-circle-left:before {\n  content: \"\\f137\";\n}\n.fa-chevron-circle-right:before {\n  content: \"\\f138\";\n}\n.fa-chevron-circle-up:before {\n  content: \"\\f139\";\n}\n.fa-chevron-circle-down:before {\n  content: \"\\f13a\";\n}\n.fa-html5:before {\n  content: \"\\f13b\";\n}\n.fa-css3:before {\n  content: \"\\f13c\";\n}\n.fa-anchor:before {\n  content: \"\\f13d\";\n}\n.fa-unlock-alt:before {\n  content: \"\\f13e\";\n}\n.fa-bullseye:before {\n  content: \"\\f140\";\n}\n.fa-ellipsis-h:before {\n  content: \"\\f141\";\n}\n.fa-ellipsis-v:before {\n  content: \"\\f142\";\n}\n.fa-rss-square:before {\n  content: \"\\f143\";\n}\n.fa-play-circle:before {\n  content: \"\\f144\";\n}\n.fa-ticket:before {\n  content: \"\\f145\";\n}\n.fa-minus-square:before {\n  content: \"\\f146\";\n}\n.fa-minus-square-o:before {\n  content: \"\\f147\";\n}\n.fa-level-up:before {\n  content: \"\\f148\";\n}\n.fa-level-down:before {\n  content: \"\\f149\";\n}\n.fa-check-square:before {\n  content: \"\\f14a\";\n}\n.fa-pencil-square:before {\n  content: \"\\f14b\";\n}\n.fa-external-link-square:before {\n  content: \"\\f14c\";\n}\n.fa-share-square:before {\n  content: \"\\f14d\";\n}\n.fa-compass:before {\n  content: \"\\f14e\";\n}\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n  content: \"\\f150\";\n}\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n  content: \"\\f151\";\n}\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n  content: \"\\f152\";\n}\n.fa-euro:before,\n.fa-eur:before {\n  content: \"\\f153\";\n}\n.fa-gbp:before {\n  content: \"\\f154\";\n}\n.fa-dollar:before,\n.fa-usd:before {\n  content: \"\\f155\";\n}\n.fa-rupee:before,\n.fa-inr:before {\n  content: \"\\f156\";\n}\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n  content: \"\\f157\";\n}\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n  content: \"\\f158\";\n}\n.fa-won:before,\n.fa-krw:before {\n  content: \"\\f159\";\n}\n.fa-bitcoin:before,\n.fa-btc:before {\n  content: \"\\f15a\";\n}\n.fa-file:before {\n  content: \"\\f15b\";\n}\n.fa-file-text:before {\n  content: \"\\f15c\";\n}\n.fa-sort-alpha-asc:before {\n  content: \"\\f15d\";\n}\n.fa-sort-alpha-desc:before {\n  content: \"\\f15e\";\n}\n.fa-sort-amount-asc:before {\n  content: \"\\f160\";\n}\n.fa-sort-amount-desc:before {\n  content: \"\\f161\";\n}\n.fa-sort-numeric-asc:before {\n  content: \"\\f162\";\n}\n.fa-sort-numeric-desc:before {\n  content: \"\\f163\";\n}\n.fa-thumbs-up:before {\n  content: \"\\f164\";\n}\n.fa-thumbs-down:before {\n  content: \"\\f165\";\n}\n.fa-youtube-square:before {\n  content: \"\\f166\";\n}\n.fa-youtube:before {\n  content: \"\\f167\";\n}\n.fa-xing:before {\n  content: \"\\f168\";\n}\n.fa-xing-square:before {\n  content: \"\\f169\";\n}\n.fa-youtube-play:before {\n  content: \"\\f16a\";\n}\n.fa-dropbox:before {\n  content: \"\\f16b\";\n}\n.fa-stack-overflow:before {\n  content: \"\\f16c\";\n}\n.fa-instagram:before {\n  content: \"\\f16d\";\n}\n.fa-flickr:before {\n  content: \"\\f16e\";\n}\n.fa-adn:before {\n  content: \"\\f170\";\n}\n.fa-bitbucket:before {\n  content: \"\\f171\";\n}\n.fa-bitbucket-square:before {\n  content: \"\\f172\";\n}\n.fa-tumblr:before {\n  content: \"\\f173\";\n}\n.fa-tumblr-square:before {\n  content: \"\\f174\";\n}\n.fa-long-arrow-down:before {\n  content: \"\\f175\";\n}\n.fa-long-arrow-up:before {\n  content: \"\\f176\";\n}\n.fa-long-arrow-left:before {\n  content: \"\\f177\";\n}\n.fa-long-arrow-right:before {\n  content: \"\\f178\";\n}\n.fa-apple:before {\n  content: \"\\f179\";\n}\n.fa-windows:before {\n  content: \"\\f17a\";\n}\n.fa-android:before {\n  content: \"\\f17b\";\n}\n.fa-linux:before {\n  content: \"\\f17c\";\n}\n.fa-dribbble:before {\n  content: \"\\f17d\";\n}\n.fa-skype:before {\n  content: \"\\f17e\";\n}\n.fa-foursquare:before {\n  content: \"\\f180\";\n}\n.fa-trello:before {\n  content: \"\\f181\";\n}\n.fa-female:before {\n  content: \"\\f182\";\n}\n.fa-male:before {\n  content: \"\\f183\";\n}\n.fa-gittip:before,\n.fa-gratipay:before {\n  content: \"\\f184\";\n}\n.fa-sun-o:before {\n  content: \"\\f185\";\n}\n.fa-moon-o:before {\n  content: \"\\f186\";\n}\n.fa-archive:before {\n  content: \"\\f187\";\n}\n.fa-bug:before {\n  content: \"\\f188\";\n}\n.fa-vk:before {\n  content: \"\\f189\";\n}\n.fa-weibo:before {\n  content: \"\\f18a\";\n}\n.fa-renren:before {\n  content: \"\\f18b\";\n}\n.fa-pagelines:before {\n  content: \"\\f18c\";\n}\n.fa-stack-exchange:before {\n  content: \"\\f18d\";\n}\n.fa-arrow-circle-o-right:before {\n  content: \"\\f18e\";\n}\n.fa-arrow-circle-o-left:before {\n  content: \"\\f190\";\n}\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n  content: \"\\f191\";\n}\n.fa-dot-circle-o:before {\n  content: \"\\f192\";\n}\n.fa-wheelchair:before {\n  content: \"\\f193\";\n}\n.fa-vimeo-square:before {\n  content: \"\\f194\";\n}\n.fa-turkish-lira:before,\n.fa-try:before {\n  content: \"\\f195\";\n}\n.fa-plus-square-o:before {\n  content: \"\\f196\";\n}\n.fa-space-shuttle:before {\n  content: \"\\f197\";\n}\n.fa-slack:before {\n  content: \"\\f198\";\n}\n.fa-envelope-square:before {\n  content: \"\\f199\";\n}\n.fa-wordpress:before {\n  content: \"\\f19a\";\n}\n.fa-openid:before {\n  content: \"\\f19b\";\n}\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n  content: \"\\f19c\";\n}\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n  content: \"\\f19d\";\n}\n.fa-yahoo:before {\n  content: \"\\f19e\";\n}\n.fa-google:before {\n  content: \"\\f1a0\";\n}\n.fa-reddit:before {\n  content: \"\\f1a1\";\n}\n.fa-reddit-square:before {\n  content: \"\\f1a2\";\n}\n.fa-stumbleupon-circle:before {\n  content: \"\\f1a3\";\n}\n.fa-stumbleupon:before {\n  content: \"\\f1a4\";\n}\n.fa-delicious:before {\n  content: \"\\f1a5\";\n}\n.fa-digg:before {\n  content: \"\\f1a6\";\n}\n.fa-pied-piper-pp:before {\n  content: \"\\f1a7\";\n}\n.fa-pied-piper-alt:before {\n  content: \"\\f1a8\";\n}\n.fa-drupal:before {\n  content: \"\\f1a9\";\n}\n.fa-joomla:before {\n  content: \"\\f1aa\";\n}\n.fa-language:before {\n  content: \"\\f1ab\";\n}\n.fa-fax:before {\n  content: \"\\f1ac\";\n}\n.fa-building:before {\n  content: \"\\f1ad\";\n}\n.fa-child:before {\n  content: \"\\f1ae\";\n}\n.fa-paw:before {\n  content: \"\\f1b0\";\n}\n.fa-spoon:before {\n  content: \"\\f1b1\";\n}\n.fa-cube:before {\n  content: \"\\f1b2\";\n}\n.fa-cubes:before {\n  content: \"\\f1b3\";\n}\n.fa-behance:before {\n  content: \"\\f1b4\";\n}\n.fa-behance-square:before {\n  content: \"\\f1b5\";\n}\n.fa-steam:before {\n  content: \"\\f1b6\";\n}\n.fa-steam-square:before {\n  content: \"\\f1b7\";\n}\n.fa-recycle:before {\n  content: \"\\f1b8\";\n}\n.fa-automobile:before,\n.fa-car:before {\n  content: \"\\f1b9\";\n}\n.fa-cab:before,\n.fa-taxi:before {\n  content: \"\\f1ba\";\n}\n.fa-tree:before {\n  content: \"\\f1bb\";\n}\n.fa-spotify:before {\n  content: \"\\f1bc\";\n}\n.fa-deviantart:before {\n  content: \"\\f1bd\";\n}\n.fa-soundcloud:before {\n  content: \"\\f1be\";\n}\n.fa-database:before {\n  content: \"\\f1c0\";\n}\n.fa-file-pdf-o:before {\n  content: \"\\f1c1\";\n}\n.fa-file-word-o:before {\n  content: \"\\f1c2\";\n}\n.fa-file-excel-o:before {\n  content: \"\\f1c3\";\n}\n.fa-file-powerpoint-o:before {\n  content: \"\\f1c4\";\n}\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n  content: \"\\f1c5\";\n}\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n  content: \"\\f1c6\";\n}\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n  content: \"\\f1c7\";\n}\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n  content: \"\\f1c8\";\n}\n.fa-file-code-o:before {\n  content: \"\\f1c9\";\n}\n.fa-vine:before {\n  content: \"\\f1ca\";\n}\n.fa-codepen:before {\n  content: \"\\f1cb\";\n}\n.fa-jsfiddle:before {\n  content: \"\\f1cc\";\n}\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n  content: \"\\f1cd\";\n}\n.fa-circle-o-notch:before {\n  content: \"\\f1ce\";\n}\n.fa-ra:before,\n.fa-resistance:before,\n.fa-rebel:before {\n  content: \"\\f1d0\";\n}\n.fa-ge:before,\n.fa-empire:before {\n  content: \"\\f1d1\";\n}\n.fa-git-square:before {\n  content: \"\\f1d2\";\n}\n.fa-git:before {\n  content: \"\\f1d3\";\n}\n.fa-y-combinator-square:before,\n.fa-yc-square:before,\n.fa-hacker-news:before {\n  content: \"\\f1d4\";\n}\n.fa-tencent-weibo:before {\n  content: \"\\f1d5\";\n}\n.fa-qq:before {\n  content: \"\\f1d6\";\n}\n.fa-wechat:before,\n.fa-weixin:before {\n  content: \"\\f1d7\";\n}\n.fa-send:before,\n.fa-paper-plane:before {\n  content: \"\\f1d8\";\n}\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n  content: \"\\f1d9\";\n}\n.fa-history:before {\n  content: \"\\f1da\";\n}\n.fa-circle-thin:before {\n  content: \"\\f1db\";\n}\n.fa-header:before {\n  content: \"\\f1dc\";\n}\n.fa-paragraph:before {\n  content: \"\\f1dd\";\n}\n.fa-sliders:before {\n  content: \"\\f1de\";\n}\n.fa-share-alt:before {\n  content: \"\\f1e0\";\n}\n.fa-share-alt-square:before {\n  content: \"\\f1e1\";\n}\n.fa-bomb:before {\n  content: \"\\f1e2\";\n}\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n  content: \"\\f1e3\";\n}\n.fa-tty:before {\n  content: \"\\f1e4\";\n}\n.fa-binoculars:before {\n  content: \"\\f1e5\";\n}\n.fa-plug:before {\n  content: \"\\f1e6\";\n}\n.fa-slideshare:before {\n  content: \"\\f1e7\";\n}\n.fa-twitch:before {\n  content: \"\\f1e8\";\n}\n.fa-yelp:before {\n  content: \"\\f1e9\";\n}\n.fa-newspaper-o:before {\n  content: \"\\f1ea\";\n}\n.fa-wifi:before {\n  content: \"\\f1eb\";\n}\n.fa-calculator:before {\n  content: \"\\f1ec\";\n}\n.fa-paypal:before {\n  content: \"\\f1ed\";\n}\n.fa-google-wallet:before {\n  content: \"\\f1ee\";\n}\n.fa-cc-visa:before {\n  content: \"\\f1f0\";\n}\n.fa-cc-mastercard:before {\n  content: \"\\f1f1\";\n}\n.fa-cc-discover:before {\n  content: \"\\f1f2\";\n}\n.fa-cc-amex:before {\n  content: \"\\f1f3\";\n}\n.fa-cc-paypal:before {\n  content: \"\\f1f4\";\n}\n.fa-cc-stripe:before {\n  content: \"\\f1f5\";\n}\n.fa-bell-slash:before {\n  content: \"\\f1f6\";\n}\n.fa-bell-slash-o:before {\n  content: \"\\f1f7\";\n}\n.fa-trash:before {\n  content: \"\\f1f8\";\n}\n.fa-copyright:before {\n  content: \"\\f1f9\";\n}\n.fa-at:before {\n  content: \"\\f1fa\";\n}\n.fa-eyedropper:before {\n  content: \"\\f1fb\";\n}\n.fa-paint-brush:before {\n  content: \"\\f1fc\";\n}\n.fa-birthday-cake:before {\n  content: \"\\f1fd\";\n}\n.fa-area-chart:before {\n  content: \"\\f1fe\";\n}\n.fa-pie-chart:before {\n  content: \"\\f200\";\n}\n.fa-line-chart:before {\n  content: \"\\f201\";\n}\n.fa-lastfm:before {\n  content: \"\\f202\";\n}\n.fa-lastfm-square:before {\n  content: \"\\f203\";\n}\n.fa-toggle-off:before {\n  content: \"\\f204\";\n}\n.fa-toggle-on:before {\n  content: \"\\f205\";\n}\n.fa-bicycle:before {\n  content: \"\\f206\";\n}\n.fa-bus:before {\n  content: \"\\f207\";\n}\n.fa-ioxhost:before {\n  content: \"\\f208\";\n}\n.fa-angellist:before {\n  content: \"\\f209\";\n}\n.fa-cc:before {\n  content: \"\\f20a\";\n}\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n  content: \"\\f20b\";\n}\n.fa-meanpath:before {\n  content: \"\\f20c\";\n}\n.fa-buysellads:before {\n  content: \"\\f20d\";\n}\n.fa-connectdevelop:before {\n  content: \"\\f20e\";\n}\n.fa-dashcube:before {\n  content: \"\\f210\";\n}\n.fa-forumbee:before {\n  content: \"\\f211\";\n}\n.fa-leanpub:before {\n  content: \"\\f212\";\n}\n.fa-sellsy:before {\n  content: \"\\f213\";\n}\n.fa-shirtsinbulk:before {\n  content: \"\\f214\";\n}\n.fa-simplybuilt:before {\n  content: \"\\f215\";\n}\n.fa-skyatlas:before {\n  content: \"\\f216\";\n}\n.fa-cart-plus:before {\n  content: \"\\f217\";\n}\n.fa-cart-arrow-down:before {\n  content: \"\\f218\";\n}\n.fa-diamond:before {\n  content: \"\\f219\";\n}\n.fa-ship:before {\n  content: \"\\f21a\";\n}\n.fa-user-secret:before {\n  content: \"\\f21b\";\n}\n.fa-motorcycle:before {\n  content: \"\\f21c\";\n}\n.fa-street-view:before {\n  content: \"\\f21d\";\n}\n.fa-heartbeat:before {\n  content: \"\\f21e\";\n}\n.fa-venus:before {\n  content: \"\\f221\";\n}\n.fa-mars:before {\n  content: \"\\f222\";\n}\n.fa-mercury:before {\n  content: \"\\f223\";\n}\n.fa-intersex:before,\n.fa-transgender:before {\n  content: \"\\f224\";\n}\n.fa-transgender-alt:before {\n  content: \"\\f225\";\n}\n.fa-venus-double:before {\n  content: \"\\f226\";\n}\n.fa-mars-double:before {\n  content: \"\\f227\";\n}\n.fa-venus-mars:before {\n  content: \"\\f228\";\n}\n.fa-mars-stroke:before {\n  content: \"\\f229\";\n}\n.fa-mars-stroke-v:before {\n  content: \"\\f22a\";\n}\n.fa-mars-stroke-h:before {\n  content: \"\\f22b\";\n}\n.fa-neuter:before {\n  content: \"\\f22c\";\n}\n.fa-genderless:before {\n  content: \"\\f22d\";\n}\n.fa-facebook-official:before {\n  content: \"\\f230\";\n}\n.fa-pinterest-p:before {\n  content: \"\\f231\";\n}\n.fa-whatsapp:before {\n  content: \"\\f232\";\n}\n.fa-server:before {\n  content: \"\\f233\";\n}\n.fa-user-plus:before {\n  content: \"\\f234\";\n}\n.fa-user-times:before {\n  content: \"\\f235\";\n}\n.fa-hotel:before,\n.fa-bed:before {\n  content: \"\\f236\";\n}\n.fa-viacoin:before {\n  content: \"\\f237\";\n}\n.fa-train:before {\n  content: \"\\f238\";\n}\n.fa-subway:before {\n  content: \"\\f239\";\n}\n.fa-medium:before {\n  content: \"\\f23a\";\n}\n.fa-yc:before,\n.fa-y-combinator:before {\n  content: \"\\f23b\";\n}\n.fa-optin-monster:before {\n  content: \"\\f23c\";\n}\n.fa-opencart:before {\n  content: \"\\f23d\";\n}\n.fa-expeditedssl:before {\n  content: \"\\f23e\";\n}\n.fa-battery-4:before,\n.fa-battery:before,\n.fa-battery-full:before {\n  content: \"\\f240\";\n}\n.fa-battery-3:before,\n.fa-battery-three-quarters:before {\n  content: \"\\f241\";\n}\n.fa-battery-2:before,\n.fa-battery-half:before {\n  content: \"\\f242\";\n}\n.fa-battery-1:before,\n.fa-battery-quarter:before {\n  content: \"\\f243\";\n}\n.fa-battery-0:before,\n.fa-battery-empty:before {\n  content: \"\\f244\";\n}\n.fa-mouse-pointer:before {\n  content: \"\\f245\";\n}\n.fa-i-cursor:before {\n  content: \"\\f246\";\n}\n.fa-object-group:before {\n  content: \"\\f247\";\n}\n.fa-object-ungroup:before {\n  content: \"\\f248\";\n}\n.fa-sticky-note:before {\n  content: \"\\f249\";\n}\n.fa-sticky-note-o:before {\n  content: \"\\f24a\";\n}\n.fa-cc-jcb:before {\n  content: \"\\f24b\";\n}\n.fa-cc-diners-club:before {\n  content: \"\\f24c\";\n}\n.fa-clone:before {\n  content: \"\\f24d\";\n}\n.fa-balance-scale:before {\n  content: \"\\f24e\";\n}\n.fa-hourglass-o:before {\n  content: \"\\f250\";\n}\n.fa-hourglass-1:before,\n.fa-hourglass-start:before {\n  content: \"\\f251\";\n}\n.fa-hourglass-2:before,\n.fa-hourglass-half:before {\n  content: \"\\f252\";\n}\n.fa-hourglass-3:before,\n.fa-hourglass-end:before {\n  content: \"\\f253\";\n}\n.fa-hourglass:before {\n  content: \"\\f254\";\n}\n.fa-hand-grab-o:before,\n.fa-hand-rock-o:before {\n  content: \"\\f255\";\n}\n.fa-hand-stop-o:before,\n.fa-hand-paper-o:before {\n  content: \"\\f256\";\n}\n.fa-hand-scissors-o:before {\n  content: \"\\f257\";\n}\n.fa-hand-lizard-o:before {\n  content: \"\\f258\";\n}\n.fa-hand-spock-o:before {\n  content: \"\\f259\";\n}\n.fa-hand-pointer-o:before {\n  content: \"\\f25a\";\n}\n.fa-hand-peace-o:before {\n  content: \"\\f25b\";\n}\n.fa-trademark:before {\n  content: \"\\f25c\";\n}\n.fa-registered:before {\n  content: \"\\f25d\";\n}\n.fa-creative-commons:before {\n  content: \"\\f25e\";\n}\n.fa-gg:before {\n  content: \"\\f260\";\n}\n.fa-gg-circle:before {\n  content: \"\\f261\";\n}\n.fa-tripadvisor:before {\n  content: \"\\f262\";\n}\n.fa-odnoklassniki:before {\n  content: \"\\f263\";\n}\n.fa-odnoklassniki-square:before {\n  content: \"\\f264\";\n}\n.fa-get-pocket:before {\n  content: \"\\f265\";\n}\n.fa-wikipedia-w:before {\n  content: \"\\f266\";\n}\n.fa-safari:before {\n  content: \"\\f267\";\n}\n.fa-chrome:before {\n  content: \"\\f268\";\n}\n.fa-firefox:before {\n  content: \"\\f269\";\n}\n.fa-opera:before {\n  content: \"\\f26a\";\n}\n.fa-internet-explorer:before {\n  content: \"\\f26b\";\n}\n.fa-tv:before,\n.fa-television:before {\n  content: \"\\f26c\";\n}\n.fa-contao:before {\n  content: \"\\f26d\";\n}\n.fa-500px:before {\n  content: \"\\f26e\";\n}\n.fa-amazon:before {\n  content: \"\\f270\";\n}\n.fa-calendar-plus-o:before {\n  content: \"\\f271\";\n}\n.fa-calendar-minus-o:before {\n  content: \"\\f272\";\n}\n.fa-calendar-times-o:before {\n  content: \"\\f273\";\n}\n.fa-calendar-check-o:before {\n  content: \"\\f274\";\n}\n.fa-industry:before {\n  content: \"\\f275\";\n}\n.fa-map-pin:before {\n  content: \"\\f276\";\n}\n.fa-map-signs:before {\n  content: \"\\f277\";\n}\n.fa-map-o:before {\n  content: \"\\f278\";\n}\n.fa-map:before {\n  content: \"\\f279\";\n}\n.fa-commenting:before {\n  content: \"\\f27a\";\n}\n.fa-commenting-o:before {\n  content: \"\\f27b\";\n}\n.fa-houzz:before {\n  content: \"\\f27c\";\n}\n.fa-vimeo:before {\n  content: \"\\f27d\";\n}\n.fa-black-tie:before {\n  content: \"\\f27e\";\n}\n.fa-fonticons:before {\n  content: \"\\f280\";\n}\n.fa-reddit-alien:before {\n  content: \"\\f281\";\n}\n.fa-edge:before {\n  content: \"\\f282\";\n}\n.fa-credit-card-alt:before {\n  content: \"\\f283\";\n}\n.fa-codiepie:before {\n  content: \"\\f284\";\n}\n.fa-modx:before {\n  content: \"\\f285\";\n}\n.fa-fort-awesome:before {\n  content: \"\\f286\";\n}\n.fa-usb:before {\n  content: \"\\f287\";\n}\n.fa-product-hunt:before {\n  content: \"\\f288\";\n}\n.fa-mixcloud:before {\n  content: \"\\f289\";\n}\n.fa-scribd:before {\n  content: \"\\f28a\";\n}\n.fa-pause-circle:before {\n  content: \"\\f28b\";\n}\n.fa-pause-circle-o:before {\n  content: \"\\f28c\";\n}\n.fa-stop-circle:before {\n  content: \"\\f28d\";\n}\n.fa-stop-circle-o:before {\n  content: \"\\f28e\";\n}\n.fa-shopping-bag:before {\n  content: \"\\f290\";\n}\n.fa-shopping-basket:before {\n  content: \"\\f291\";\n}\n.fa-hashtag:before {\n  content: \"\\f292\";\n}\n.fa-bluetooth:before {\n  content: \"\\f293\";\n}\n.fa-bluetooth-b:before {\n  content: \"\\f294\";\n}\n.fa-percent:before {\n  content: \"\\f295\";\n}\n.fa-gitlab:before {\n  content: \"\\f296\";\n}\n.fa-wpbeginner:before {\n  content: \"\\f297\";\n}\n.fa-wpforms:before {\n  content: \"\\f298\";\n}\n.fa-envira:before {\n  content: \"\\f299\";\n}\n.fa-universal-access:before {\n  content: \"\\f29a\";\n}\n.fa-wheelchair-alt:before {\n  content: \"\\f29b\";\n}\n.fa-question-circle-o:before {\n  content: \"\\f29c\";\n}\n.fa-blind:before {\n  content: \"\\f29d\";\n}\n.fa-audio-description:before {\n  content: \"\\f29e\";\n}\n.fa-volume-control-phone:before {\n  content: \"\\f2a0\";\n}\n.fa-braille:before {\n  content: \"\\f2a1\";\n}\n.fa-assistive-listening-systems:before {\n  content: \"\\f2a2\";\n}\n.fa-asl-interpreting:before,\n.fa-american-sign-language-interpreting:before {\n  content: \"\\f2a3\";\n}\n.fa-deafness:before,\n.fa-hard-of-hearing:before,\n.fa-deaf:before {\n  content: \"\\f2a4\";\n}\n.fa-glide:before {\n  content: \"\\f2a5\";\n}\n.fa-glide-g:before {\n  content: \"\\f2a6\";\n}\n.fa-signing:before,\n.fa-sign-language:before {\n  content: \"\\f2a7\";\n}\n.fa-low-vision:before {\n  content: \"\\f2a8\";\n}\n.fa-viadeo:before {\n  content: \"\\f2a9\";\n}\n.fa-viadeo-square:before {\n  content: \"\\f2aa\";\n}\n.fa-snapchat:before {\n  content: \"\\f2ab\";\n}\n.fa-snapchat-ghost:before {\n  content: \"\\f2ac\";\n}\n.fa-snapchat-square:before {\n  content: \"\\f2ad\";\n}\n.fa-pied-piper:before {\n  content: \"\\f2ae\";\n}\n.fa-first-order:before {\n  content: \"\\f2b0\";\n}\n.fa-yoast:before {\n  content: \"\\f2b1\";\n}\n.fa-themeisle:before {\n  content: \"\\f2b2\";\n}\n.fa-google-plus-circle:before,\n.fa-google-plus-official:before {\n  content: \"\\f2b3\";\n}\n.fa-fa:before,\n.fa-font-awesome:before {\n  content: \"\\f2b4\";\n}\n.fa-handshake-o:before {\n  content: \"\\f2b5\";\n}\n.fa-envelope-open:before {\n  content: \"\\f2b6\";\n}\n.fa-envelope-open-o:before {\n  content: \"\\f2b7\";\n}\n.fa-linode:before {\n  content: \"\\f2b8\";\n}\n.fa-address-book:before {\n  content: \"\\f2b9\";\n}\n.fa-address-book-o:before {\n  content: \"\\f2ba\";\n}\n.fa-vcard:before,\n.fa-address-card:before {\n  content: \"\\f2bb\";\n}\n.fa-vcard-o:before,\n.fa-address-card-o:before {\n  content: \"\\f2bc\";\n}\n.fa-user-circle:before {\n  content: \"\\f2bd\";\n}\n.fa-user-circle-o:before {\n  content: \"\\f2be\";\n}\n.fa-user-o:before {\n  content: \"\\f2c0\";\n}\n.fa-id-badge:before {\n  content: \"\\f2c1\";\n}\n.fa-drivers-license:before,\n.fa-id-card:before {\n  content: \"\\f2c2\";\n}\n.fa-drivers-license-o:before,\n.fa-id-card-o:before {\n  content: \"\\f2c3\";\n}\n.fa-quora:before {\n  content: \"\\f2c4\";\n}\n.fa-free-code-camp:before {\n  content: \"\\f2c5\";\n}\n.fa-telegram:before {\n  content: \"\\f2c6\";\n}\n.fa-thermometer-4:before,\n.fa-thermometer:before,\n.fa-thermometer-full:before {\n  content: \"\\f2c7\";\n}\n.fa-thermometer-3:before,\n.fa-thermometer-three-quarters:before {\n  content: \"\\f2c8\";\n}\n.fa-thermometer-2:before,\n.fa-thermometer-half:before {\n  content: \"\\f2c9\";\n}\n.fa-thermometer-1:before,\n.fa-thermometer-quarter:before {\n  content: \"\\f2ca\";\n}\n.fa-thermometer-0:before,\n.fa-thermometer-empty:before {\n  content: \"\\f2cb\";\n}\n.fa-shower:before {\n  content: \"\\f2cc\";\n}\n.fa-bathtub:before,\n.fa-s15:before,\n.fa-bath:before {\n  content: \"\\f2cd\";\n}\n.fa-podcast:before {\n  content: \"\\f2ce\";\n}\n.fa-window-maximize:before {\n  content: \"\\f2d0\";\n}\n.fa-window-minimize:before {\n  content: \"\\f2d1\";\n}\n.fa-window-restore:before {\n  content: \"\\f2d2\";\n}\n.fa-times-rectangle:before,\n.fa-window-close:before {\n  content: \"\\f2d3\";\n}\n.fa-times-rectangle-o:before,\n.fa-window-close-o:before {\n  content: \"\\f2d4\";\n}\n.fa-bandcamp:before {\n  content: \"\\f2d5\";\n}\n.fa-grav:before {\n  content: \"\\f2d6\";\n}\n.fa-etsy:before {\n  content: \"\\f2d7\";\n}\n.fa-imdb:before {\n  content: \"\\f2d8\";\n}\n.fa-ravelry:before {\n  content: \"\\f2d9\";\n}\n.fa-eercast:before {\n  content: \"\\f2da\";\n}\n.fa-microchip:before {\n  content: \"\\f2db\";\n}\n.fa-snowflake-o:before {\n  content: \"\\f2dc\";\n}\n.fa-superpowers:before {\n  content: \"\\f2dd\";\n}\n.fa-wpexplorer:before {\n  content: \"\\f2de\";\n}\n.fa-meetup:before {\n  content: \"\\f2e0\";\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n\/*!\n*\n* IPython base\n*\n*\/\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\ncode {\n  color: #000;\n}\npre {\n  font-size: inherit;\n  line-height: inherit;\n}\nlabel {\n  font-weight: normal;\n}\n\/* Make the page background atleast 100% the height of the view port *\/\n\/* Make the page itself atleast 70% the height of the view port *\/\n.border-box-sizing {\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n}\n.corner-all {\n  border-radius: 2px;\n}\n.no-padding {\n  padding: 0px;\n}\n\/* Flexible box model classes *\/\n\/* Taken from Alex Russell http:\/\/infrequently.org\/2009\/08\/css-3-progress\/ *\/\n\/* This file is a compatability layer.  It allows the usage of flexible box \nmodel layouts accross multiple browsers, including older browsers.  The newest,\nuniversal implementation of the flexible box model is used when available (see\n`Modern browsers` comments below).  Browsers that are known to implement this \nnew spec completely include:<\/p>\n<p>    Firefox 28.0+\n    Chrome 29.0+\n    Internet Explorer 11+ \n    Opera 17.0+<\/p>\n<p>Browsers not listed, including Safari, are supported via the styling under the\n`Old browsers` comments below.\n*\/\n.hbox {\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: horizontal;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: horizontal;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: horizontal;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: row;\n  align-items: stretch;\n}\n.hbox > * {\n  \/* Old browsers *\/\n  -webkit-box-flex: 0;\n  -moz-box-flex: 0;\n  box-flex: 0;\n  \/* Modern browsers *\/\n  flex: none;\n}\n.vbox {\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: vertical;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: vertical;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n}\n.vbox > * {\n  \/* Old browsers *\/\n  -webkit-box-flex: 0;\n  -moz-box-flex: 0;\n  box-flex: 0;\n  \/* Modern browsers *\/\n  flex: none;\n}\n.hbox.reverse,\n.vbox.reverse,\n.reverse {\n  \/* Old browsers *\/\n  -webkit-box-direction: reverse;\n  -moz-box-direction: reverse;\n  box-direction: reverse;\n  \/* Modern browsers *\/\n  flex-direction: row-reverse;\n}\n.hbox.box-flex0,\n.vbox.box-flex0,\n.box-flex0 {\n  \/* Old browsers *\/\n  -webkit-box-flex: 0;\n  -moz-box-flex: 0;\n  box-flex: 0;\n  \/* Modern browsers *\/\n  flex: none;\n  width: auto;\n}\n.hbox.box-flex1,\n.vbox.box-flex1,\n.box-flex1 {\n  \/* Old browsers *\/\n  -webkit-box-flex: 1;\n  -moz-box-flex: 1;\n  box-flex: 1;\n  \/* Modern browsers *\/\n  flex: 1;\n}\n.hbox.box-flex,\n.vbox.box-flex,\n.box-flex {\n  \/* Old browsers *\/\n  \/* Old browsers *\/\n  -webkit-box-flex: 1;\n  -moz-box-flex: 1;\n  box-flex: 1;\n  \/* Modern browsers *\/\n  flex: 1;\n}\n.hbox.box-flex2,\n.vbox.box-flex2,\n.box-flex2 {\n  \/* Old browsers *\/\n  -webkit-box-flex: 2;\n  -moz-box-flex: 2;\n  box-flex: 2;\n  \/* Modern browsers *\/\n  flex: 2;\n}\n.box-group1 {\n  \/*  Deprecated *\/\n  -webkit-box-flex-group: 1;\n  -moz-box-flex-group: 1;\n  box-flex-group: 1;\n}\n.box-group2 {\n  \/* Deprecated *\/\n  -webkit-box-flex-group: 2;\n  -moz-box-flex-group: 2;\n  box-flex-group: 2;\n}\n.hbox.start,\n.vbox.start,\n.start {\n  \/* Old browsers *\/\n  -webkit-box-pack: start;\n  -moz-box-pack: start;\n  box-pack: start;\n  \/* Modern browsers *\/\n  justify-content: flex-start;\n}\n.hbox.end,\n.vbox.end,\n.end {\n  \/* Old browsers *\/\n  -webkit-box-pack: end;\n  -moz-box-pack: end;\n  box-pack: end;\n  \/* Modern browsers *\/\n  justify-content: flex-end;\n}\n.hbox.center,\n.vbox.center,\n.center {\n  \/* Old browsers *\/\n  -webkit-box-pack: center;\n  -moz-box-pack: center;\n  box-pack: center;\n  \/* Modern browsers *\/\n  justify-content: center;\n}\n.hbox.baseline,\n.vbox.baseline,\n.baseline {\n  \/* Old browsers *\/\n  -webkit-box-pack: baseline;\n  -moz-box-pack: baseline;\n  box-pack: baseline;\n  \/* Modern browsers *\/\n  justify-content: baseline;\n}\n.hbox.stretch,\n.vbox.stretch,\n.stretch {\n  \/* Old browsers *\/\n  -webkit-box-pack: stretch;\n  -moz-box-pack: stretch;\n  box-pack: stretch;\n  \/* Modern browsers *\/\n  justify-content: stretch;\n}\n.hbox.align-start,\n.vbox.align-start,\n.align-start {\n  \/* Old browsers *\/\n  -webkit-box-align: start;\n  -moz-box-align: start;\n  box-align: start;\n  \/* Modern browsers *\/\n  align-items: flex-start;\n}\n.hbox.align-end,\n.vbox.align-end,\n.align-end {\n  \/* Old browsers *\/\n  -webkit-box-align: end;\n  -moz-box-align: end;\n  box-align: end;\n  \/* Modern browsers *\/\n  align-items: flex-end;\n}\n.hbox.align-center,\n.vbox.align-center,\n.align-center {\n  \/* Old browsers *\/\n  -webkit-box-align: center;\n  -moz-box-align: center;\n  box-align: center;\n  \/* Modern browsers *\/\n  align-items: center;\n}\n.hbox.align-baseline,\n.vbox.align-baseline,\n.align-baseline {\n  \/* Old browsers *\/\n  -webkit-box-align: baseline;\n  -moz-box-align: baseline;\n  box-align: baseline;\n  \/* Modern browsers *\/\n  align-items: baseline;\n}\n.hbox.align-stretch,\n.vbox.align-stretch,\n.align-stretch {\n  \/* Old browsers *\/\n  -webkit-box-align: stretch;\n  -moz-box-align: stretch;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  align-items: stretch;\n}\ndiv.error {\n  margin: 2em;\n  text-align: center;\n}\ndiv.error > h1 {\n  font-size: 500%;\n  line-height: normal;\n}\ndiv.error > p {\n  font-size: 200%;\n  line-height: normal;\n}\ndiv.traceback-wrapper {\n  text-align: left;\n  max-width: 800px;\n  margin: auto;\n}\ndiv.traceback-wrapper pre.traceback {\n  max-height: 600px;\n  overflow: auto;\n}\n\/**\n * Primary styles\n *\n * Author: Jupyter Development Team\n *\/\nbody {\n  background-color: #fff;\n  \/* This makes sure that the body covers the entire window and needs to\n       be in a different element than the display: box in wrapper below *\/\n  position: absolute;\n  left: 0px;\n  right: 0px;\n  top: 0px;\n  bottom: 0px;\n  overflow: visible;\n}\nbody > #header {\n  \/* Initially hidden to prevent FLOUC *\/\n  display: none;\n  background-color: #fff;\n  \/* Display over codemirror *\/\n  position: relative;\n  z-index: 100;\n}\nbody > #header #header-container {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  padding: 5px;\n  padding-bottom: 5px;\n  padding-top: 5px;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n}\nbody > #header .header-bar {\n  width: 100%;\n  height: 1px;\n  background: #e7e7e7;\n  margin-bottom: -1px;\n}\n@media print {\n  body > #header {\n    display: none !important;\n  }\n}\n#header-spacer {\n  width: 100%;\n  visibility: hidden;\n}\n@media print {\n  #header-spacer {\n    display: none;\n  }\n}\n#ipython_notebook {\n  padding-left: 0px;\n  padding-top: 1px;\n  padding-bottom: 1px;\n}\n[dir=\"rtl\"] #ipython_notebook {\n  margin-right: 10px;\n  margin-left: 0;\n}\n[dir=\"rtl\"] #ipython_notebook.pull-left {\n  float: right !important;\n  float: right;\n}\n.flex-spacer {\n  flex: 1;\n}\n#noscript {\n  width: auto;\n  padding-top: 16px;\n  padding-bottom: 16px;\n  text-align: center;\n  font-size: 22px;\n  color: red;\n  font-weight: bold;\n}\n#ipython_notebook img {\n  height: 28px;\n}\n#site {\n  width: 100%;\n  display: none;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  overflow: auto;\n}\n@media print {\n  #site {\n    height: auto !important;\n  }\n}\n\/* Smaller buttons *\/\n.ui-button .ui-button-text {\n  padding: 0.2em 0.8em;\n  font-size: 77%;\n}\ninput.ui-button {\n  padding: 0.3em 0.9em;\n}\nspan#kernel_logo_widget {\n  margin: 0 10px;\n}\nspan#login_widget {\n  float: right;\n}\n[dir=\"rtl\"] span#login_widget {\n  float: left;\n}\nspan#login_widget > .button,\n#logout {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\nspan#login_widget > .button:focus,\n#logout:focus,\nspan#login_widget > .button.focus,\n#logout.focus {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #8c8c8c;\n}\nspan#login_widget > .button:hover,\n#logout:hover {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\nspan#login_widget > .button:active,\n#logout:active,\nspan#login_widget > .button.active,\n#logout.active,\n.open > .dropdown-togglespan#login_widget > .button,\n.open > .dropdown-toggle#logout {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\nspan#login_widget > .button:active:hover,\n#logout:active:hover,\nspan#login_widget > .button.active:hover,\n#logout.active:hover,\n.open > .dropdown-togglespan#login_widget > .button:hover,\n.open > .dropdown-toggle#logout:hover,\nspan#login_widget > .button:active:focus,\n#logout:active:focus,\nspan#login_widget > .button.active:focus,\n#logout.active:focus,\n.open > .dropdown-togglespan#login_widget > .button:focus,\n.open > .dropdown-toggle#logout:focus,\nspan#login_widget > .button:active.focus,\n#logout:active.focus,\nspan#login_widget > .button.active.focus,\n#logout.active.focus,\n.open > .dropdown-togglespan#login_widget > .button.focus,\n.open > .dropdown-toggle#logout.focus {\n  color: #333;\n  background-color: #d4d4d4;\n  border-color: #8c8c8c;\n}\nspan#login_widget > .button:active,\n#logout:active,\nspan#login_widget > .button.active,\n#logout.active,\n.open > .dropdown-togglespan#login_widget > .button,\n.open > .dropdown-toggle#logout {\n  background-image: none;\n}\nspan#login_widget > .button.disabled:hover,\n#logout.disabled:hover,\nspan#login_widget > .button[disabled]:hover,\n#logout[disabled]:hover,\nfieldset[disabled] span#login_widget > .button:hover,\nfieldset[disabled] #logout:hover,\nspan#login_widget > .button.disabled:focus,\n#logout.disabled:focus,\nspan#login_widget > .button[disabled]:focus,\n#logout[disabled]:focus,\nfieldset[disabled] span#login_widget > .button:focus,\nfieldset[disabled] #logout:focus,\nspan#login_widget > .button.disabled.focus,\n#logout.disabled.focus,\nspan#login_widget > .button[disabled].focus,\n#logout[disabled].focus,\nfieldset[disabled] span#login_widget > .button.focus,\nfieldset[disabled] #logout.focus {\n  background-color: #fff;\n  border-color: #ccc;\n}\nspan#login_widget > .button .badge,\n#logout .badge {\n  color: #fff;\n  background-color: #333;\n}\n.nav-header {\n  text-transform: none;\n}\n#header > span {\n  margin-top: 10px;\n}\n.modal_stretch .modal-dialog {\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: vertical;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: vertical;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n  min-height: 80vh;\n}\n.modal_stretch .modal-dialog .modal-body {\n  max-height: calc(100vh - 200px);\n  overflow: auto;\n  flex: 1;\n}\n.modal-header {\n  cursor: move;\n}\n@media (min-width: 768px) {\n  .modal .modal-dialog {\n    width: 700px;\n  }\n}\n@media (min-width: 768px) {\n  select.form-control {\n    margin-left: 12px;\n    margin-right: 12px;\n  }\n}\n\/*!\n*\n* IPython auth\n*\n*\/\n.center-nav {\n  display: inline-block;\n  margin-bottom: -4px;\n}\n[dir=\"rtl\"] .center-nav form.pull-left {\n  float: right !important;\n  float: right;\n}\n[dir=\"rtl\"] .center-nav .navbar-text {\n  float: right;\n}\n[dir=\"rtl\"] .navbar-inner {\n  text-align: right;\n}\n[dir=\"rtl\"] div.text-left {\n  text-align: right;\n}\n\/*!\n*\n* IPython tree view\n*\n*\/\n\/* We need an invisible input field on top of the sentense*\/\n\/* \"Drag file onto the list ...\" *\/\n.alternate_upload {\n  background-color: none;\n  display: inline;\n}\n.alternate_upload.form {\n  padding: 0;\n  margin: 0;\n}\n.alternate_upload input.fileinput {\n  position: absolute;\n  display: block;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: pointer;\n  opacity: 0;\n  z-index: 2;\n}\n.alternate_upload .btn-xs > input.fileinput {\n  margin: -1px -5px;\n}\n.alternate_upload .btn-upload {\n  position: relative;\n  height: 22px;\n}\n::-webkit-file-upload-button {\n  cursor: pointer;\n}\n\/**\n * Primary styles\n *\n * Author: Jupyter Development Team\n *\/\nul#tabs {\n  margin-bottom: 4px;\n}\nul#tabs a {\n  padding-top: 6px;\n  padding-bottom: 4px;\n}\n[dir=\"rtl\"] ul#tabs.nav-tabs > li {\n  float: right;\n}\n[dir=\"rtl\"] ul#tabs.nav.nav-tabs {\n  padding-right: 0;\n}\nul.breadcrumb a:focus,\nul.breadcrumb a:hover {\n  text-decoration: none;\n}\nul.breadcrumb i.icon-home {\n  font-size: 16px;\n  margin-right: 4px;\n}\nul.breadcrumb span {\n  color: #5e5e5e;\n}\n.list_toolbar {\n  padding: 4px 0 4px 0;\n  vertical-align: middle;\n}\n.list_toolbar .tree-buttons {\n  padding-top: 1px;\n}\n[dir=\"rtl\"] .list_toolbar .tree-buttons .pull-right {\n  float: left !important;\n  float: left;\n}\n[dir=\"rtl\"] .list_toolbar .col-sm-4,\n[dir=\"rtl\"] .list_toolbar .col-sm-8 {\n  float: right;\n}\n.dynamic-buttons {\n  padding-top: 3px;\n  display: inline-block;\n}\n.list_toolbar [class*=\"span\"] {\n  min-height: 24px;\n}\n.list_header {\n  font-weight: bold;\n  background-color: #EEE;\n}\n.list_placeholder {\n  font-weight: bold;\n  padding-top: 4px;\n  padding-bottom: 4px;\n  padding-left: 7px;\n  padding-right: 7px;\n}\n.list_container {\n  margin-top: 4px;\n  margin-bottom: 20px;\n  border: 1px solid #ddd;\n  border-radius: 2px;\n}\n.list_container > div {\n  border-bottom: 1px solid #ddd;\n}\n.list_container > div:hover .list-item {\n  background-color: red;\n}\n.list_container > div:last-child {\n  border: none;\n}\n.list_item:hover .list_item {\n  background-color: #ddd;\n}\n.list_item a {\n  text-decoration: none;\n}\n.list_item:hover {\n  background-color: #fafafa;\n}\n.list_header > div,\n.list_item > div {\n  padding-top: 4px;\n  padding-bottom: 4px;\n  padding-left: 7px;\n  padding-right: 7px;\n  line-height: 22px;\n}\n.list_header > div input,\n.list_item > div input {\n  margin-right: 7px;\n  margin-left: 14px;\n  vertical-align: text-bottom;\n  line-height: 22px;\n  position: relative;\n  top: -1px;\n}\n.list_header > div .item_link,\n.list_item > div .item_link {\n  margin-left: -1px;\n  vertical-align: baseline;\n  line-height: 22px;\n}\n[dir=\"rtl\"] .list_item > div input {\n  margin-right: 0;\n}\n.new-file input[type=checkbox] {\n  visibility: hidden;\n}\n.item_name {\n  line-height: 22px;\n  height: 24px;\n}\n.item_icon {\n  font-size: 14px;\n  color: #5e5e5e;\n  margin-right: 7px;\n  margin-left: 7px;\n  line-height: 22px;\n  vertical-align: baseline;\n}\n.item_modified {\n  margin-right: 7px;\n  margin-left: 7px;\n}\n[dir=\"rtl\"] .item_modified.pull-right {\n  float: left !important;\n  float: left;\n}\n.item_buttons {\n  line-height: 1em;\n  margin-left: -5px;\n}\n.item_buttons .btn,\n.item_buttons .btn-group,\n.item_buttons .input-group {\n  float: left;\n}\n.item_buttons > .btn,\n.item_buttons > .btn-group,\n.item_buttons > .input-group {\n  margin-left: 5px;\n}\n.item_buttons .btn {\n  min-width: 13ex;\n}\n.item_buttons .running-indicator {\n  padding-top: 4px;\n  color: #5cb85c;\n}\n.item_buttons .kernel-name {\n  padding-top: 4px;\n  color: #5bc0de;\n  margin-right: 7px;\n  float: left;\n}\n[dir=\"rtl\"] .item_buttons.pull-right {\n  float: left !important;\n  float: left;\n}\n[dir=\"rtl\"] .item_buttons .kernel-name {\n  margin-left: 7px;\n  float: right;\n}\n.toolbar_info {\n  height: 24px;\n  line-height: 24px;\n}\n.list_item input:not([type=checkbox]) {\n  padding-top: 3px;\n  padding-bottom: 3px;\n  height: 22px;\n  line-height: 14px;\n  margin: 0px;\n}\n.highlight_text {\n  color: blue;\n}\n#project_name {\n  display: inline-block;\n  padding-left: 7px;\n  margin-left: -2px;\n}\n#project_name > .breadcrumb {\n  padding: 0px;\n  margin-bottom: 0px;\n  background-color: transparent;\n  font-weight: bold;\n}\n.sort_button {\n  display: inline-block;\n  padding-left: 7px;\n}\n[dir=\"rtl\"] .sort_button.pull-right {\n  float: left !important;\n  float: left;\n}\n#tree-selector {\n  padding-right: 0px;\n}\n#button-select-all {\n  min-width: 50px;\n}\n[dir=\"rtl\"] #button-select-all.btn {\n  float: right ;\n}\n#select-all {\n  margin-left: 7px;\n  margin-right: 2px;\n  margin-top: 2px;\n  height: 16px;\n}\n[dir=\"rtl\"] #select-all.pull-left {\n  float: right !important;\n  float: right;\n}\n.menu_icon {\n  margin-right: 2px;\n}\n.tab-content .row {\n  margin-left: 0px;\n  margin-right: 0px;\n}\n.folder_icon:before {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  content: \"\\f114\";\n}\n.folder_icon:before.fa-pull-left {\n  margin-right: .3em;\n}\n.folder_icon:before.fa-pull-right {\n  margin-left: .3em;\n}\n.folder_icon:before.pull-left {\n  margin-right: .3em;\n}\n.folder_icon:before.pull-right {\n  margin-left: .3em;\n}\n.notebook_icon:before {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  content: \"\\f02d\";\n  position: relative;\n  top: -1px;\n}\n.notebook_icon:before.fa-pull-left {\n  margin-right: .3em;\n}\n.notebook_icon:before.fa-pull-right {\n  margin-left: .3em;\n}\n.notebook_icon:before.pull-left {\n  margin-right: .3em;\n}\n.notebook_icon:before.pull-right {\n  margin-left: .3em;\n}\n.running_notebook_icon:before {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  content: \"\\f02d\";\n  position: relative;\n  top: -1px;\n  color: #5cb85c;\n}\n.running_notebook_icon:before.fa-pull-left {\n  margin-right: .3em;\n}\n.running_notebook_icon:before.fa-pull-right {\n  margin-left: .3em;\n}\n.running_notebook_icon:before.pull-left {\n  margin-right: .3em;\n}\n.running_notebook_icon:before.pull-right {\n  margin-left: .3em;\n}\n.file_icon:before {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  content: \"\\f016\";\n  position: relative;\n  top: -2px;\n}\n.file_icon:before.fa-pull-left {\n  margin-right: .3em;\n}\n.file_icon:before.fa-pull-right {\n  margin-left: .3em;\n}\n.file_icon:before.pull-left {\n  margin-right: .3em;\n}\n.file_icon:before.pull-right {\n  margin-left: .3em;\n}\n#notebook_toolbar .pull-right {\n  padding-top: 0px;\n  margin-right: -1px;\n}\nul#new-menu {\n  left: auto;\n  right: 0;\n}\n#new-menu .dropdown-header {\n  font-size: 10px;\n  border-bottom: 1px solid #e5e5e5;\n  padding: 0 0 3px;\n  margin: -3px 20px 0;\n}\n.kernel-menu-icon {\n  padding-right: 12px;\n  width: 24px;\n  content: \"\\f096\";\n}\n.kernel-menu-icon:before {\n  content: \"\\f096\";\n}\n.kernel-menu-icon-current:before {\n  content: \"\\f00c\";\n}\n#tab_content {\n  padding-top: 20px;\n}\n#running .panel-group .panel {\n  margin-top: 3px;\n  margin-bottom: 1em;\n}\n#running .panel-group .panel .panel-heading {\n  background-color: #EEE;\n  padding-top: 4px;\n  padding-bottom: 4px;\n  padding-left: 7px;\n  padding-right: 7px;\n  line-height: 22px;\n}\n#running .panel-group .panel .panel-heading a:focus,\n#running .panel-group .panel .panel-heading a:hover {\n  text-decoration: none;\n}\n#running .panel-group .panel .panel-body {\n  padding: 0px;\n}\n#running .panel-group .panel .panel-body .list_container {\n  margin-top: 0px;\n  margin-bottom: 0px;\n  border: 0px;\n  border-radius: 0px;\n}\n#running .panel-group .panel .panel-body .list_container .list_item {\n  border-bottom: 1px solid #ddd;\n}\n#running .panel-group .panel .panel-body .list_container .list_item:last-child {\n  border-bottom: 0px;\n}\n.delete-button {\n  display: none;\n}\n.duplicate-button {\n  display: none;\n}\n.rename-button {\n  display: none;\n}\n.move-button {\n  display: none;\n}\n.download-button {\n  display: none;\n}\n.shutdown-button {\n  display: none;\n}\n.dynamic-instructions {\n  display: inline-block;\n  padding-top: 4px;\n}\n\/*!\n*\n* IPython text editor webapp\n*\n*\/\n.selected-keymap i.fa {\n  padding: 0px 5px;\n}\n.selected-keymap i.fa:before {\n  content: \"\\f00c\";\n}\n#mode-menu {\n  overflow: auto;\n  max-height: 20em;\n}\n.edit_app #header {\n  -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);\n  box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);\n}\n.edit_app #menubar .navbar {\n  \/* Use a negative 1 bottom margin, so the border overlaps the border of the\n    header *\/\n  margin-bottom: -1px;\n}\n.dirty-indicator {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  width: 20px;\n}\n.dirty-indicator.fa-pull-left {\n  margin-right: .3em;\n}\n.dirty-indicator.fa-pull-right {\n  margin-left: .3em;\n}\n.dirty-indicator.pull-left {\n  margin-right: .3em;\n}\n.dirty-indicator.pull-right {\n  margin-left: .3em;\n}\n.dirty-indicator-dirty {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  width: 20px;\n}\n.dirty-indicator-dirty.fa-pull-left {\n  margin-right: .3em;\n}\n.dirty-indicator-dirty.fa-pull-right {\n  margin-left: .3em;\n}\n.dirty-indicator-dirty.pull-left {\n  margin-right: .3em;\n}\n.dirty-indicator-dirty.pull-right {\n  margin-left: .3em;\n}\n.dirty-indicator-clean {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  width: 20px;\n}\n.dirty-indicator-clean.fa-pull-left {\n  margin-right: .3em;\n}\n.dirty-indicator-clean.fa-pull-right {\n  margin-left: .3em;\n}\n.dirty-indicator-clean.pull-left {\n  margin-right: .3em;\n}\n.dirty-indicator-clean.pull-right {\n  margin-left: .3em;\n}\n.dirty-indicator-clean:before {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  content: \"\\f00c\";\n}\n.dirty-indicator-clean:before.fa-pull-left {\n  margin-right: .3em;\n}\n.dirty-indicator-clean:before.fa-pull-right {\n  margin-left: .3em;\n}\n.dirty-indicator-clean:before.pull-left {\n  margin-right: .3em;\n}\n.dirty-indicator-clean:before.pull-right {\n  margin-left: .3em;\n}\n#filename {\n  font-size: 16pt;\n  display: table;\n  padding: 0px 5px;\n}\n#current-mode {\n  padding-left: 5px;\n  padding-right: 5px;\n}\n#texteditor-backdrop {\n  padding-top: 20px;\n  padding-bottom: 20px;\n}\n@media not print {\n  #texteditor-backdrop {\n    background-color: #EEE;\n  }\n}\n@media print {\n  #texteditor-backdrop #texteditor-container .CodeMirror-gutter,\n  #texteditor-backdrop #texteditor-container .CodeMirror-gutters {\n    background-color: #fff;\n  }\n}\n@media not print {\n  #texteditor-backdrop #texteditor-container .CodeMirror-gutter,\n  #texteditor-backdrop #texteditor-container .CodeMirror-gutters {\n    background-color: #fff;\n  }\n}\n@media not print {\n  #texteditor-backdrop #texteditor-container {\n    padding: 0px;\n    background-color: #fff;\n    -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);\n    box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);\n  }\n}\n.CodeMirror-dialog {\n  background-color: #fff;\n}\n\/*!\n*\n* IPython notebook\n*\n*\/\n\/* CSS font colors for translated ANSI escape sequences *\/\n\/* The color values are a mix of\n   http:\/\/www.xcolors.net\/dl\/baskerville-ivorylight and\n   http:\/\/www.xcolors.net\/dl\/euphrasia *\/\n.ansi-black-fg {\n  color: #3E424D;\n}\n.ansi-black-bg {\n  background-color: #3E424D;\n}\n.ansi-black-intense-fg {\n  color: #282C36;\n}\n.ansi-black-intense-bg {\n  background-color: #282C36;\n}\n.ansi-red-fg {\n  color: #E75C58;\n}\n.ansi-red-bg {\n  background-color: #E75C58;\n}\n.ansi-red-intense-fg {\n  color: #B22B31;\n}\n.ansi-red-intense-bg {\n  background-color: #B22B31;\n}\n.ansi-green-fg {\n  color: #00A250;\n}\n.ansi-green-bg {\n  background-color: #00A250;\n}\n.ansi-green-intense-fg {\n  color: #007427;\n}\n.ansi-green-intense-bg {\n  background-color: #007427;\n}\n.ansi-yellow-fg {\n  color: #DDB62B;\n}\n.ansi-yellow-bg {\n  background-color: #DDB62B;\n}\n.ansi-yellow-intense-fg {\n  color: #B27D12;\n}\n.ansi-yellow-intense-bg {\n  background-color: #B27D12;\n}\n.ansi-blue-fg {\n  color: #208FFB;\n}\n.ansi-blue-bg {\n  background-color: #208FFB;\n}\n.ansi-blue-intense-fg {\n  color: #0065CA;\n}\n.ansi-blue-intense-bg {\n  background-color: #0065CA;\n}\n.ansi-magenta-fg {\n  color: #D160C4;\n}\n.ansi-magenta-bg {\n  background-color: #D160C4;\n}\n.ansi-magenta-intense-fg {\n  color: #A03196;\n}\n.ansi-magenta-intense-bg {\n  background-color: #A03196;\n}\n.ansi-cyan-fg {\n  color: #60C6C8;\n}\n.ansi-cyan-bg {\n  background-color: #60C6C8;\n}\n.ansi-cyan-intense-fg {\n  color: #258F8F;\n}\n.ansi-cyan-intense-bg {\n  background-color: #258F8F;\n}\n.ansi-white-fg {\n  color: #C5C1B4;\n}\n.ansi-white-bg {\n  background-color: #C5C1B4;\n}\n.ansi-white-intense-fg {\n  color: #A1A6B2;\n}\n.ansi-white-intense-bg {\n  background-color: #A1A6B2;\n}\n.ansi-default-inverse-fg {\n  color: #FFFFFF;\n}\n.ansi-default-inverse-bg {\n  background-color: #000000;\n}\n.ansi-bold {\n  font-weight: bold;\n}\n.ansi-underline {\n  text-decoration: underline;\n}\n\/* The following styles are deprecated an will be removed in a future version *\/\n.ansibold {\n  font-weight: bold;\n}\n.ansi-inverse {\n  outline: 0.5px dotted;\n}\n\/* use dark versions for foreground, to improve visibility *\/\n.ansiblack {\n  color: black;\n}\n.ansired {\n  color: darkred;\n}\n.ansigreen {\n  color: darkgreen;\n}\n.ansiyellow {\n  color: #c4a000;\n}\n.ansiblue {\n  color: darkblue;\n}\n.ansipurple {\n  color: darkviolet;\n}\n.ansicyan {\n  color: steelblue;\n}\n.ansigray {\n  color: gray;\n}\n\/* and light for background, for the same reason *\/\n.ansibgblack {\n  background-color: black;\n}\n.ansibgred {\n  background-color: red;\n}\n.ansibggreen {\n  background-color: green;\n}\n.ansibgyellow {\n  background-color: yellow;\n}\n.ansibgblue {\n  background-color: blue;\n}\n.ansibgpurple {\n  background-color: magenta;\n}\n.ansibgcyan {\n  background-color: cyan;\n}\n.ansibggray {\n  background-color: gray;\n}\ndiv.cell {\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: vertical;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: vertical;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n  border-radius: 2px;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  border-width: 1px;\n  border-style: solid;\n  border-color: transparent;\n  width: 100%;\n  padding: 5px;\n  \/* This acts as a spacer between cells, that is outside the border *\/\n  margin: 0px;\n  outline: none;\n  position: relative;\n  overflow: visible;\n}\ndiv.cell:before {\n  position: absolute;\n  display: block;\n  top: -1px;\n  left: -1px;\n  width: 5px;\n  height: calc(100% +  2px);\n  content: '';\n  background: transparent;\n}\ndiv.cell.jupyter-soft-selected {\n  border-left-color: #E3F2FD;\n  border-left-width: 1px;\n  padding-left: 5px;\n  border-right-color: #E3F2FD;\n  border-right-width: 1px;\n  background: #E3F2FD;\n}\n@media print {\n  div.cell.jupyter-soft-selected {\n    border-color: transparent;\n  }\n}\ndiv.cell.selected,\ndiv.cell.selected.jupyter-soft-selected {\n  border-color: #ababab;\n}\ndiv.cell.selected:before,\ndiv.cell.selected.jupyter-soft-selected:before {\n  position: absolute;\n  display: block;\n  top: -1px;\n  left: -1px;\n  width: 5px;\n  height: calc(100% +  2px);\n  content: '';\n  background: #42A5F5;\n}\n@media print {\n  div.cell.selected,\n  div.cell.selected.jupyter-soft-selected {\n    border-color: transparent;\n  }\n}\n.edit_mode div.cell.selected {\n  border-color: #66BB6A;\n}\n.edit_mode div.cell.selected:before {\n  position: absolute;\n  display: block;\n  top: -1px;\n  left: -1px;\n  width: 5px;\n  height: calc(100% +  2px);\n  content: '';\n  background: #66BB6A;\n}\n@media print {\n  .edit_mode div.cell.selected {\n    border-color: transparent;\n  }\n}\n.prompt {\n  \/* This needs to be wide enough for 3 digit prompt numbers: In[100]: *\/\n  min-width: 14ex;\n  \/* This padding is tuned to match the padding on the CodeMirror editor. *\/\n  padding: 0.4em;\n  margin: 0px;\n  font-family: monospace;\n  text-align: right;\n  \/* This has to match that of the the CodeMirror class line-height below *\/\n  line-height: 1.21429em;\n  \/* Don't highlight prompt number selection *\/\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  \/* Use default cursor *\/\n  cursor: default;\n}\n@media (max-width: 540px) {\n  .prompt {\n    text-align: left;\n  }\n}\ndiv.inner_cell {\n  min-width: 0;\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: vertical;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: vertical;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n  \/* Old browsers *\/\n  -webkit-box-flex: 1;\n  -moz-box-flex: 1;\n  box-flex: 1;\n  \/* Modern browsers *\/\n  flex: 1;\n}\n\/* input_area and input_prompt must match in top border and margin for alignment *\/\ndiv.input_area {\n  border: 1px solid #cfcfcf;\n  border-radius: 2px;\n  background: #f7f7f7;\n  line-height: 1.21429em;\n}\n\/* This is needed so that empty prompt areas can collapse to zero height when there\n   is no content in the output_subarea and the prompt. The main purpose of this is\n   to make sure that empty JavaScript output_subareas have no height. *\/\ndiv.prompt:empty {\n  padding-top: 0;\n  padding-bottom: 0;\n}\ndiv.unrecognized_cell {\n  padding: 5px 5px 5px 0px;\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: horizontal;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: horizontal;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: horizontal;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: row;\n  align-items: stretch;\n}\ndiv.unrecognized_cell .inner_cell {\n  border-radius: 2px;\n  padding: 5px;\n  font-weight: bold;\n  color: red;\n  border: 1px solid #cfcfcf;\n  background: #eaeaea;\n}\ndiv.unrecognized_cell .inner_cell a {\n  color: inherit;\n  text-decoration: none;\n}\ndiv.unrecognized_cell .inner_cell a:hover {\n  color: inherit;\n  text-decoration: none;\n}\n@media (max-width: 540px) {\n  div.unrecognized_cell > div.prompt {\n    display: none;\n  }\n}\ndiv.code_cell {\n  \/* avoid page breaking on code cells when printing *\/\n}\n@media print {\n  div.code_cell {\n    page-break-inside: avoid;\n  }\n}\n\/* any special styling for code cells that are currently running goes here *\/\ndiv.input {\n  page-break-inside: avoid;\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: horizontal;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: horizontal;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: horizontal;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: row;\n  align-items: stretch;\n}\n@media (max-width: 540px) {\n  div.input {\n    \/* Old browsers *\/\n    display: -webkit-box;\n    -webkit-box-orient: vertical;\n    -webkit-box-align: stretch;\n    display: -moz-box;\n    -moz-box-orient: vertical;\n    -moz-box-align: stretch;\n    display: box;\n    box-orient: vertical;\n    box-align: stretch;\n    \/* Modern browsers *\/\n    display: flex;\n    flex-direction: column;\n    align-items: stretch;\n  }\n}\n\/* input_area and input_prompt must match in top border and margin for alignment *\/\ndiv.input_prompt {\n  color: #303F9F;\n  border-top: 1px solid transparent;\n}\ndiv.input_area > div.highlight {\n  margin: 0.4em;\n  border: none;\n  padding: 0px;\n  background-color: transparent;\n}\ndiv.input_area > div.highlight > pre {\n  margin: 0px;\n  border: none;\n  padding: 0px;\n  background-color: transparent;\n}\n\/* The following gets added to the <head> if it is detected that the user has a\n * monospace font with inconsistent normal\/bold\/italic height.  See\n * notebookmain.js.  Such fonts will have keywords vertically offset with\n * respect to the rest of the text.  The user should select a better font.\n * See: https:\/\/github.com\/ipython\/ipython\/issues\/1503\n *\n * .CodeMirror span {\n *      vertical-align: bottom;\n * }\n *\/\n.CodeMirror {\n  line-height: 1.21429em;\n  \/* Changed from 1em to our global default *\/\n  font-size: 14px;\n  height: auto;\n  \/* Changed to auto to autogrow *\/\n  background: none;\n  \/* Changed from white to allow our bg to show through *\/\n}\n.CodeMirror-scroll {\n  \/*  The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*\/\n  \/*  We have found that if it is visible, vertical scrollbars appear with font size changes.*\/\n  overflow-y: hidden;\n  overflow-x: auto;\n}\n.CodeMirror-lines {\n  \/* In CM2, this used to be 0.4em, but in CM3 it went to 4px. We need the em value because *\/\n  \/* we have set a different line-height and want this to scale with that. *\/\n  \/* Note that this should set vertical padding only, since CodeMirror assumes\n       that horizontal padding will be set on CodeMirror pre *\/\n  padding: 0.4em 0;\n}\n.CodeMirror-linenumber {\n  padding: 0 8px 0 4px;\n}\n.CodeMirror-gutters {\n  border-bottom-left-radius: 2px;\n  border-top-left-radius: 2px;\n}\n.CodeMirror pre {\n  \/* In CM3 this went to 4px from 0 in CM2. This sets horizontal padding only,\n    use .CodeMirror-lines for vertical *\/\n  padding: 0 0.4em;\n  border: 0;\n  border-radius: 0;\n}\n.CodeMirror-cursor {\n  border-left: 1.4px solid black;\n}\n@media screen and (min-width: 2138px) and (max-width: 4319px) {\n  .CodeMirror-cursor {\n    border-left: 2px solid black;\n  }\n}\n@media screen and (min-width: 4320px) {\n  .CodeMirror-cursor {\n    border-left: 4px solid black;\n  }\n}\n\/*<\/p>\n<p>Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\nAdapted from GitHub theme<\/p>\n<p>*\/\n.highlight-base {\n  color: #000;\n}\n.highlight-variable {\n  color: #000;\n}\n.highlight-variable-2 {\n  color: #1a1a1a;\n}\n.highlight-variable-3 {\n  color: #333333;\n}\n.highlight-string {\n  color: #BA2121;\n}\n.highlight-comment {\n  color: #408080;\n  font-style: italic;\n}\n.highlight-number {\n  color: #080;\n}\n.highlight-atom {\n  color: #88F;\n}\n.highlight-keyword {\n  color: #008000;\n  font-weight: bold;\n}\n.highlight-builtin {\n  color: #008000;\n}\n.highlight-error {\n  color: #f00;\n}\n.highlight-operator {\n  color: #AA22FF;\n  font-weight: bold;\n}\n.highlight-meta {\n  color: #AA22FF;\n}\n\/* previously not defined, copying from default codemirror *\/\n.highlight-def {\n  color: #00f;\n}\n.highlight-string-2 {\n  color: #f50;\n}\n.highlight-qualifier {\n  color: #555;\n}\n.highlight-bracket {\n  color: #997;\n}\n.highlight-tag {\n  color: #170;\n}\n.highlight-attribute {\n  color: #00c;\n}\n.highlight-header {\n  color: blue;\n}\n.highlight-quote {\n  color: #090;\n}\n.highlight-link {\n  color: #00c;\n}\n\/* apply the same style to codemirror *\/\n.cm-s-ipython span.cm-keyword {\n  color: #008000;\n  font-weight: bold;\n}\n.cm-s-ipython span.cm-atom {\n  color: #88F;\n}\n.cm-s-ipython span.cm-number {\n  color: #080;\n}\n.cm-s-ipython span.cm-def {\n  color: #00f;\n}\n.cm-s-ipython span.cm-variable {\n  color: #000;\n}\n.cm-s-ipython span.cm-operator {\n  color: #AA22FF;\n  font-weight: bold;\n}\n.cm-s-ipython span.cm-variable-2 {\n  color: #1a1a1a;\n}\n.cm-s-ipython span.cm-variable-3 {\n  color: #333333;\n}\n.cm-s-ipython span.cm-comment {\n  color: #408080;\n  font-style: italic;\n}\n.cm-s-ipython span.cm-string {\n  color: #BA2121;\n}\n.cm-s-ipython span.cm-string-2 {\n  color: #f50;\n}\n.cm-s-ipython span.cm-meta {\n  color: #AA22FF;\n}\n.cm-s-ipython span.cm-qualifier {\n  color: #555;\n}\n.cm-s-ipython span.cm-builtin {\n  color: #008000;\n}\n.cm-s-ipython span.cm-bracket {\n  color: #997;\n}\n.cm-s-ipython span.cm-tag {\n  color: #170;\n}\n.cm-s-ipython span.cm-attribute {\n  color: #00c;\n}\n.cm-s-ipython span.cm-header {\n  color: blue;\n}\n.cm-s-ipython span.cm-quote {\n  color: #090;\n}\n.cm-s-ipython span.cm-link {\n  color: #00c;\n}\n.cm-s-ipython span.cm-error {\n  color: #f00;\n}\n.cm-s-ipython span.cm-tab {\n  background: url(data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH\/ZOdnZOcM\/sgk\/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j\/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);\n  background-position: right;\n  background-repeat: no-repeat;\n}\ndiv.output_wrapper {\n  \/* this position must be relative to enable descendents to be absolute within it *\/\n  position: relative;\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: vertical;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: vertical;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n  z-index: 1;\n}\n\/* class for the output area when it should be height-limited *\/\ndiv.output_scroll {\n  \/* ideally, this would be max-height, but FF barfs all over that *\/\n  height: 24em;\n  \/* FF needs this *and the wrapper* to specify full width, or it will shrinkwrap *\/\n  width: 100%;\n  overflow: auto;\n  border-radius: 2px;\n  -webkit-box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);\n  box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);\n  display: block;\n}\n\/* output div while it is collapsed *\/\ndiv.output_collapsed {\n  margin: 0px;\n  padding: 0px;\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: vertical;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: vertical;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n}\ndiv.out_prompt_overlay {\n  height: 100%;\n  padding: 0px 0.4em;\n  position: absolute;\n  border-radius: 2px;\n}\ndiv.out_prompt_overlay:hover {\n  \/* use inner shadow to get border that is computed the same on WebKit\/FF *\/\n  -webkit-box-shadow: inset 0 0 1px #000;\n  box-shadow: inset 0 0 1px #000;\n  background: rgba(240, 240, 240, 0.5);\n}\ndiv.output_prompt {\n  color: #D84315;\n}\n\/* This class is the outer container of all output sections. *\/\ndiv.output_area {\n  padding: 0px;\n  page-break-inside: avoid;\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: horizontal;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: horizontal;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: horizontal;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: row;\n  align-items: stretch;\n}\ndiv.output_area .MathJax_Display {\n  text-align: left !important;\n}\ndiv.output_area .rendered_html table {\n  margin-left: 0;\n  margin-right: 0;\n}\ndiv.output_area .rendered_html img {\n  margin-left: 0;\n  margin-right: 0;\n}\ndiv.output_area img,\ndiv.output_area svg {\n  max-width: 100%;\n  height: auto;\n}\ndiv.output_area img.unconfined,\ndiv.output_area svg.unconfined {\n  max-width: none;\n}\ndiv.output_area .mglyph > img {\n  max-width: none;\n}\n\/* This is needed to protect the pre formating from global settings such\n   as that of bootstrap *\/\n.output {\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: vertical;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: vertical;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n}\n@media (max-width: 540px) {\n  div.output_area {\n    \/* Old browsers *\/\n    display: -webkit-box;\n    -webkit-box-orient: vertical;\n    -webkit-box-align: stretch;\n    display: -moz-box;\n    -moz-box-orient: vertical;\n    -moz-box-align: stretch;\n    display: box;\n    box-orient: vertical;\n    box-align: stretch;\n    \/* Modern browsers *\/\n    display: flex;\n    flex-direction: column;\n    align-items: stretch;\n  }\n}\ndiv.output_area pre {\n  margin: 0;\n  padding: 1px 0 1px 0;\n  border: 0;\n  vertical-align: baseline;\n  color: black;\n  background-color: transparent;\n  border-radius: 0;\n}\n\/* This class is for the output subarea inside the output_area and after\n   the prompt div. *\/\ndiv.output_subarea {\n  overflow-x: auto;\n  padding: 0.4em;\n  \/* Old browsers *\/\n  -webkit-box-flex: 1;\n  -moz-box-flex: 1;\n  box-flex: 1;\n  \/* Modern browsers *\/\n  flex: 1;\n  max-width: calc(100% - 14ex);\n}\ndiv.output_scroll div.output_subarea {\n  overflow-x: visible;\n}\n\/* The rest of the output_* classes are for special styling of the different\n   output types *\/\n\/* all text output has this class: *\/\ndiv.output_text {\n  text-align: left;\n  color: #000;\n  \/* This has to match that of the the CodeMirror class line-height below *\/\n  line-height: 1.21429em;\n}\n\/* stdout\/stderr are 'text' as well as 'stream', but execute_result\/error are *not* streams *\/\ndiv.output_stderr {\n  background: #fdd;\n  \/* very light red background for stderr *\/\n}\ndiv.output_latex {\n  text-align: left;\n}\n\/* Empty output_javascript divs should have no height *\/\ndiv.output_javascript:empty {\n  padding: 0;\n}\n.js-error {\n  color: darkred;\n}\n\/* raw_input styles *\/\ndiv.raw_input_container {\n  line-height: 1.21429em;\n  padding-top: 5px;\n}\npre.raw_input_prompt {\n  \/* nothing needed here. *\/\n}\ninput.raw_input {\n  font-family: monospace;\n  font-size: inherit;\n  color: inherit;\n  width: auto;\n  \/* make sure input baseline aligns with prompt *\/\n  vertical-align: baseline;\n  \/* padding + margin = 0.5em between prompt and cursor *\/\n  padding: 0em 0.25em;\n  margin: 0em 0.25em;\n}\ninput.raw_input:focus {\n  box-shadow: none;\n}\np.p-space {\n  margin-bottom: 10px;\n}\ndiv.output_unrecognized {\n  padding: 5px;\n  font-weight: bold;\n  color: red;\n}\ndiv.output_unrecognized a {\n  color: inherit;\n  text-decoration: none;\n}\ndiv.output_unrecognized a:hover {\n  color: inherit;\n  text-decoration: none;\n}\n.rendered_html {\n  color: #000;\n  \/* any extras will just be numbers: *\/\n}\n.rendered_html em {\n  font-style: italic;\n}\n.rendered_html strong {\n  font-weight: bold;\n}\n.rendered_html u {\n  text-decoration: underline;\n}\n.rendered_html :link {\n  text-decoration: underline;\n}\n.rendered_html :visited {\n  text-decoration: underline;\n}\n.rendered_html h1 {\n  font-size: 185.7%;\n  margin: 1.08em 0 0 0;\n  font-weight: bold;\n  line-height: 1.0;\n}\n.rendered_html h2 {\n  font-size: 157.1%;\n  margin: 1.27em 0 0 0;\n  font-weight: bold;\n  line-height: 1.0;\n}\n.rendered_html h3 {\n  font-size: 128.6%;\n  margin: 1.55em 0 0 0;\n  font-weight: bold;\n  line-height: 1.0;\n}\n.rendered_html h4 {\n  font-size: 100%;\n  margin: 2em 0 0 0;\n  font-weight: bold;\n  line-height: 1.0;\n}\n.rendered_html h5 {\n  font-size: 100%;\n  margin: 2em 0 0 0;\n  font-weight: bold;\n  line-height: 1.0;\n  font-style: italic;\n}\n.rendered_html h6 {\n  font-size: 100%;\n  margin: 2em 0 0 0;\n  font-weight: bold;\n  line-height: 1.0;\n  font-style: italic;\n}\n.rendered_html h1:first-child {\n  margin-top: 0.538em;\n}\n.rendered_html h2:first-child {\n  margin-top: 0.636em;\n}\n.rendered_html h3:first-child {\n  margin-top: 0.777em;\n}\n.rendered_html h4:first-child {\n  margin-top: 1em;\n}\n.rendered_html h5:first-child {\n  margin-top: 1em;\n}\n.rendered_html h6:first-child {\n  margin-top: 1em;\n}\n.rendered_html ul:not(.list-inline),\n.rendered_html ol:not(.list-inline) {\n  padding-left: 2em;\n}\n.rendered_html ul {\n  list-style: disc;\n}\n.rendered_html ul ul {\n  list-style: square;\n  margin-top: 0;\n}\n.rendered_html ul ul ul {\n  list-style: circle;\n}\n.rendered_html ol {\n  list-style: decimal;\n}\n.rendered_html ol ol {\n  list-style: upper-alpha;\n  margin-top: 0;\n}\n.rendered_html ol ol ol {\n  list-style: lower-alpha;\n}\n.rendered_html ol ol ol ol {\n  list-style: lower-roman;\n}\n.rendered_html ol ol ol ol ol {\n  list-style: decimal;\n}\n.rendered_html * + ul {\n  margin-top: 1em;\n}\n.rendered_html * + ol {\n  margin-top: 1em;\n}\n.rendered_html hr {\n  color: black;\n  background-color: black;\n}\n.rendered_html pre {\n  margin: 1em 2em;\n  padding: 0px;\n  background-color: #fff;\n}\n.rendered_html code {\n  background-color: #eff0f1;\n}\n.rendered_html p code {\n  padding: 1px 5px;\n}\n.rendered_html pre code {\n  background-color: #fff;\n}\n.rendered_html pre,\n.rendered_html code {\n  border: 0;\n  color: #000;\n  font-size: 100%;\n}\n.rendered_html blockquote {\n  margin: 1em 2em;\n}\n.rendered_html table {\n  margin-left: auto;\n  margin-right: auto;\n  border: none;\n  border-collapse: collapse;\n  border-spacing: 0;\n  color: black;\n  font-size: 12px;\n  table-layout: fixed;\n}\n.rendered_html thead {\n  border-bottom: 1px solid black;\n  vertical-align: bottom;\n}\n.rendered_html tr,\n.rendered_html th,\n.rendered_html td {\n  text-align: right;\n  vertical-align: middle;\n  padding: 0.5em 0.5em;\n  line-height: normal;\n  white-space: normal;\n  max-width: none;\n  border: none;\n}\n.rendered_html th {\n  font-weight: bold;\n}\n.rendered_html tbody tr:nth-child(odd) {\n  background: #f5f5f5;\n}\n.rendered_html tbody tr:hover {\n  background: rgba(66, 165, 245, 0.2);\n}\n.rendered_html * + table {\n  margin-top: 1em;\n}\n.rendered_html p {\n  text-align: left;\n}\n.rendered_html * + p {\n  margin-top: 1em;\n}\n.rendered_html img {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.rendered_html * + img {\n  margin-top: 1em;\n}\n.rendered_html img,\n.rendered_html svg {\n  max-width: 100%;\n  height: auto;\n}\n.rendered_html img.unconfined,\n.rendered_html svg.unconfined {\n  max-width: none;\n}\n.rendered_html .alert {\n  margin-bottom: initial;\n}\n.rendered_html * + .alert {\n  margin-top: 1em;\n}\n[dir=\"rtl\"] .rendered_html p {\n  text-align: right;\n}\ndiv.text_cell {\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: horizontal;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: horizontal;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: horizontal;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: row;\n  align-items: stretch;\n}\n@media (max-width: 540px) {\n  div.text_cell > div.prompt {\n    display: none;\n  }\n}\ndiv.text_cell_render {\n  \/*font-family: \"Helvetica Neue\", Arial, Helvetica, Geneva, sans-serif;*\/\n  outline: none;\n  resize: none;\n  width: inherit;\n  border-style: none;\n  padding: 0.5em 0.5em 0.5em 0.4em;\n  color: #000;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n}\na.anchor-link:link {\n  text-decoration: none;\n  padding: 0px 20px;\n  visibility: hidden;\n}\nh1:hover .anchor-link,\nh2:hover .anchor-link,\nh3:hover .anchor-link,\nh4:hover .anchor-link,\nh5:hover .anchor-link,\nh6:hover .anchor-link {\n  visibility: visible;\n}\n.text_cell.rendered .input_area {\n  display: none;\n}\n.text_cell.rendered .rendered_html {\n  overflow-x: auto;\n  overflow-y: hidden;\n}\n.text_cell.rendered .rendered_html tr,\n.text_cell.rendered .rendered_html th,\n.text_cell.rendered .rendered_html td {\n  max-width: none;\n}\n.text_cell.unrendered .text_cell_render {\n  display: none;\n}\n.text_cell .dropzone .input_area {\n  border: 2px dashed #bababa;\n  margin: -1px;\n}\n.cm-header-1,\n.cm-header-2,\n.cm-header-3,\n.cm-header-4,\n.cm-header-5,\n.cm-header-6 {\n  font-weight: bold;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n.cm-header-1 {\n  font-size: 185.7%;\n}\n.cm-header-2 {\n  font-size: 157.1%;\n}\n.cm-header-3 {\n  font-size: 128.6%;\n}\n.cm-header-4 {\n  font-size: 110%;\n}\n.cm-header-5 {\n  font-size: 100%;\n  font-style: italic;\n}\n.cm-header-6 {\n  font-size: 100%;\n  font-style: italic;\n}\n\/*!\n*\n* IPython notebook webapp\n*\n*\/\n@media (max-width: 767px) {\n  .notebook_app {\n    padding-left: 0px;\n    padding-right: 0px;\n  }\n}\n#ipython-main-app {\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  height: 100%;\n}\ndiv#notebook_panel {\n  margin: 0px;\n  padding: 0px;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  height: 100%;\n}\ndiv#notebook {\n  font-size: 14px;\n  line-height: 20px;\n  overflow-y: hidden;\n  overflow-x: auto;\n  width: 100%;\n  \/* This spaces the page away from the edge of the notebook area *\/\n  padding-top: 20px;\n  margin: 0px;\n  outline: none;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  min-height: 100%;\n}\n@media not print {\n  #notebook-container {\n    padding: 15px;\n    background-color: #fff;\n    min-height: 0;\n    -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);\n    box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);\n  }\n}\n@media print {\n  #notebook-container {\n    width: 100%;\n  }\n}\ndiv.ui-widget-content {\n  border: 1px solid #ababab;\n  outline: none;\n}\npre.dialog {\n  background-color: #f7f7f7;\n  border: 1px solid #ddd;\n  border-radius: 2px;\n  padding: 0.4em;\n  padding-left: 2em;\n}\np.dialog {\n  padding: 0.2em;\n}\n\/* Word-wrap output correctly.  This is the CSS3 spelling, though Firefox seems\n   to not honor it correctly.  Webkit browsers (Chrome, rekonq, Safari) do.\n *\/\npre,\ncode,\nkbd,\nsamp {\n  white-space: pre-wrap;\n}\n#fonttest {\n  font-family: monospace;\n}\np {\n  margin-bottom: 0;\n}\n.end_space {\n  min-height: 100px;\n  transition: height .2s ease;\n}\n.notebook_app > #header {\n  -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);\n  box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);\n}\n@media not print {\n  .notebook_app {\n    background-color: #EEE;\n  }\n}\nkbd {\n  border-style: solid;\n  border-width: 1px;\n  box-shadow: none;\n  margin: 2px;\n  padding-left: 2px;\n  padding-right: 2px;\n  padding-top: 1px;\n  padding-bottom: 1px;\n}\n.jupyter-keybindings {\n  padding: 1px;\n  line-height: 24px;\n  border-bottom: 1px solid gray;\n}\n.jupyter-keybindings input {\n  margin: 0;\n  padding: 0;\n  border: none;\n}\n.jupyter-keybindings i {\n  padding: 6px;\n}\n.well code {\n  background-color: #ffffff;\n  border-color: #ababab;\n  border-width: 1px;\n  border-style: solid;\n  padding: 2px;\n  padding-top: 1px;\n  padding-bottom: 1px;\n}\n\/* CSS for the cell toolbar *\/\n.celltoolbar {\n  border: thin solid #CFCFCF;\n  border-bottom: none;\n  background: #EEE;\n  border-radius: 2px 2px 0px 0px;\n  width: 100%;\n  height: 29px;\n  padding-right: 4px;\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: horizontal;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: horizontal;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: horizontal;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: row;\n  align-items: stretch;\n  \/* Old browsers *\/\n  -webkit-box-pack: end;\n  -moz-box-pack: end;\n  box-pack: end;\n  \/* Modern browsers *\/\n  justify-content: flex-end;\n  display: -webkit-flex;\n}\n@media print {\n  .celltoolbar {\n    display: none;\n  }\n}\n.ctb_hideshow {\n  display: none;\n  vertical-align: bottom;\n}\n\/* ctb_show is added to the ctb_hideshow div to show the cell toolbar.\n   Cell toolbars are only shown when the ctb_global_show class is also set.\n*\/\n.ctb_global_show .ctb_show.ctb_hideshow {\n  display: block;\n}\n.ctb_global_show .ctb_show + .input_area,\n.ctb_global_show .ctb_show + div.text_cell_input,\n.ctb_global_show .ctb_show ~ div.text_cell_render {\n  border-top-right-radius: 0px;\n  border-top-left-radius: 0px;\n}\n.ctb_global_show .ctb_show ~ div.text_cell_render {\n  border: 1px solid #cfcfcf;\n}\n.celltoolbar {\n  font-size: 87%;\n  padding-top: 3px;\n}\n.celltoolbar select {\n  display: block;\n  width: 100%;\n  height: 32px;\n  padding: 6px 12px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #555555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 2px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 1px;\n  width: inherit;\n  font-size: inherit;\n  height: 22px;\n  padding: 0px;\n  display: inline-block;\n}\n.celltoolbar select:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.celltoolbar select::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.celltoolbar select:-ms-input-placeholder {\n  color: #999;\n}\n.celltoolbar select::-webkit-input-placeholder {\n  color: #999;\n}\n.celltoolbar select::-ms-expand {\n  border: 0;\n  background-color: transparent;\n}\n.celltoolbar select[disabled],\n.celltoolbar select[readonly],\nfieldset[disabled] .celltoolbar select {\n  background-color: #eeeeee;\n  opacity: 1;\n}\n.celltoolbar select[disabled],\nfieldset[disabled] .celltoolbar select {\n  cursor: not-allowed;\n}\ntextarea.celltoolbar select {\n  height: auto;\n}\nselect.celltoolbar select {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.celltoolbar select,\nselect[multiple].celltoolbar select {\n  height: auto;\n}\n.celltoolbar label {\n  margin-left: 5px;\n  margin-right: 5px;\n}\n.tags_button_container {\n  width: 100%;\n  display: flex;\n}\n.tag-container {\n  display: flex;\n  flex-direction: row;\n  flex-grow: 1;\n  overflow: hidden;\n  position: relative;\n}\n.tag-container > * {\n  margin: 0 4px;\n}\n.remove-tag-btn {\n  margin-left: 4px;\n}\n.tags-input {\n  display: flex;\n}\n.cell-tag:last-child:after {\n  content: \"\";\n  position: absolute;\n  right: 0;\n  width: 40px;\n  height: 100%;\n  \/* Fade to background color of cell toolbar *\/\n  background: linear-gradient(to right, rgba(0, 0, 0, 0), #EEE);\n}\n.tags-input > * {\n  margin-left: 4px;\n}\n.cell-tag,\n.tags-input input,\n.tags-input button {\n  display: block;\n  width: 100%;\n  height: 32px;\n  padding: 6px 12px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #555555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 2px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 1px;\n  box-shadow: none;\n  width: inherit;\n  font-size: inherit;\n  height: 22px;\n  line-height: 22px;\n  padding: 0px 4px;\n  display: inline-block;\n}\n.cell-tag:focus,\n.tags-input input:focus,\n.tags-input button:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.cell-tag::-moz-placeholder,\n.tags-input input::-moz-placeholder,\n.tags-input button::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.cell-tag:-ms-input-placeholder,\n.tags-input input:-ms-input-placeholder,\n.tags-input button:-ms-input-placeholder {\n  color: #999;\n}\n.cell-tag::-webkit-input-placeholder,\n.tags-input input::-webkit-input-placeholder,\n.tags-input button::-webkit-input-placeholder {\n  color: #999;\n}\n.cell-tag::-ms-expand,\n.tags-input input::-ms-expand,\n.tags-input button::-ms-expand {\n  border: 0;\n  background-color: transparent;\n}\n.cell-tag[disabled],\n.tags-input input[disabled],\n.tags-input button[disabled],\n.cell-tag[readonly],\n.tags-input input[readonly],\n.tags-input button[readonly],\nfieldset[disabled] .cell-tag,\nfieldset[disabled] .tags-input input,\nfieldset[disabled] .tags-input button {\n  background-color: #eeeeee;\n  opacity: 1;\n}\n.cell-tag[disabled],\n.tags-input input[disabled],\n.tags-input button[disabled],\nfieldset[disabled] .cell-tag,\nfieldset[disabled] .tags-input input,\nfieldset[disabled] .tags-input button {\n  cursor: not-allowed;\n}\ntextarea.cell-tag,\ntextarea.tags-input input,\ntextarea.tags-input button {\n  height: auto;\n}\nselect.cell-tag,\nselect.tags-input input,\nselect.tags-input button {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.cell-tag,\ntextarea.tags-input input,\ntextarea.tags-input button,\nselect[multiple].cell-tag,\nselect[multiple].tags-input input,\nselect[multiple].tags-input button {\n  height: auto;\n}\n.cell-tag,\n.tags-input button {\n  padding: 0px 4px;\n}\n.cell-tag {\n  background-color: #fff;\n  white-space: nowrap;\n}\n.tags-input input[type=text]:focus {\n  outline: none;\n  box-shadow: none;\n  border-color: #ccc;\n}\n.completions {\n  position: absolute;\n  z-index: 110;\n  overflow: hidden;\n  border: 1px solid #ababab;\n  border-radius: 2px;\n  -webkit-box-shadow: 0px 6px 10px -1px #adadad;\n  box-shadow: 0px 6px 10px -1px #adadad;\n  line-height: 1;\n}\n.completions select {\n  background: white;\n  outline: none;\n  border: none;\n  padding: 0px;\n  margin: 0px;\n  overflow: auto;\n  font-family: monospace;\n  font-size: 110%;\n  color: #000;\n  width: auto;\n}\n.completions select option.context {\n  color: #286090;\n}\n#kernel_logo_widget .current_kernel_logo {\n  display: none;\n  margin-top: -1px;\n  margin-bottom: -1px;\n  width: 32px;\n  height: 32px;\n}\n[dir=\"rtl\"] #kernel_logo_widget {\n  float: left !important;\n  float: left;\n}\n.modal .modal-body .move-path {\n  display: flex;\n  flex-direction: row;\n  justify-content: space;\n  align-items: center;\n}\n.modal .modal-body .move-path .server-root {\n  padding-right: 20px;\n}\n.modal .modal-body .move-path .path-input {\n  flex: 1;\n}\n#menubar {\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  margin-top: 1px;\n}\n#menubar .navbar {\n  border-top: 1px;\n  border-radius: 0px 0px 2px 2px;\n  margin-bottom: 0px;\n}\n#menubar .navbar-toggle {\n  float: left;\n  padding-top: 7px;\n  padding-bottom: 7px;\n  border: none;\n}\n#menubar .navbar-collapse {\n  clear: left;\n}\n[dir=\"rtl\"] #menubar .navbar-toggle {\n  float: right;\n}\n[dir=\"rtl\"] #menubar .navbar-collapse {\n  clear: right;\n}\n[dir=\"rtl\"] #menubar .navbar-nav {\n  float: right;\n}\n[dir=\"rtl\"] #menubar .nav {\n  padding-right: 0px;\n}\n[dir=\"rtl\"] #menubar .navbar-nav > li {\n  float: right;\n}\n[dir=\"rtl\"] #menubar .navbar-right {\n  float: left !important;\n}\n[dir=\"rtl\"] ul.dropdown-menu {\n  text-align: right;\n  left: auto;\n}\n[dir=\"rtl\"] ul#new-menu.dropdown-menu {\n  right: auto;\n  left: 0;\n}\n.nav-wrapper {\n  border-bottom: 1px solid #e7e7e7;\n}\ni.menu-icon {\n  padding-top: 4px;\n}\n[dir=\"rtl\"] i.menu-icon.pull-right {\n  float: left !important;\n  float: left;\n}\nul#help_menu li a {\n  overflow: hidden;\n  padding-right: 2.2em;\n}\nul#help_menu li a i {\n  margin-right: -1.2em;\n}\n[dir=\"rtl\"] ul#help_menu li a {\n  padding-left: 2.2em;\n}\n[dir=\"rtl\"] ul#help_menu li a i {\n  margin-right: 0;\n  margin-left: -1.2em;\n}\n[dir=\"rtl\"] ul#help_menu li a i.pull-right {\n  float: left !important;\n  float: left;\n}\n.dropdown-submenu {\n  position: relative;\n}\n.dropdown-submenu > .dropdown-menu {\n  top: 0;\n  left: 100%;\n  margin-top: -6px;\n  margin-left: -1px;\n}\n[dir=\"rtl\"] .dropdown-submenu > .dropdown-menu {\n  right: 100%;\n  margin-right: -1px;\n}\n.dropdown-submenu:hover > .dropdown-menu {\n  display: block;\n}\n.dropdown-submenu > a:after {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  display: block;\n  content: \"\\f0da\";\n  float: right;\n  color: #333333;\n  margin-top: 2px;\n  margin-right: -10px;\n}\n.dropdown-submenu > a:after.fa-pull-left {\n  margin-right: .3em;\n}\n.dropdown-submenu > a:after.fa-pull-right {\n  margin-left: .3em;\n}\n.dropdown-submenu > a:after.pull-left {\n  margin-right: .3em;\n}\n.dropdown-submenu > a:after.pull-right {\n  margin-left: .3em;\n}\n[dir=\"rtl\"] .dropdown-submenu > a:after {\n  float: left;\n  content: \"\\f0d9\";\n  margin-right: 0;\n  margin-left: -10px;\n}\n.dropdown-submenu:hover > a:after {\n  color: #262626;\n}\n.dropdown-submenu.pull-left {\n  float: none;\n}\n.dropdown-submenu.pull-left > .dropdown-menu {\n  left: -100%;\n  margin-left: 10px;\n}\n#notification_area {\n  float: right !important;\n  float: right;\n  z-index: 10;\n}\n[dir=\"rtl\"] #notification_area {\n  float: left !important;\n  float: left;\n}\n.indicator_area {\n  float: right !important;\n  float: right;\n  color: #777;\n  margin-left: 5px;\n  margin-right: 5px;\n  width: 11px;\n  z-index: 10;\n  text-align: center;\n  width: auto;\n}\n[dir=\"rtl\"] .indicator_area {\n  float: left !important;\n  float: left;\n}\n#kernel_indicator {\n  float: right !important;\n  float: right;\n  color: #777;\n  margin-left: 5px;\n  margin-right: 5px;\n  width: 11px;\n  z-index: 10;\n  text-align: center;\n  width: auto;\n  border-left: 1px solid;\n}\n#kernel_indicator .kernel_indicator_name {\n  padding-left: 5px;\n  padding-right: 5px;\n}\n[dir=\"rtl\"] #kernel_indicator {\n  float: left !important;\n  float: left;\n  border-left: 0;\n  border-right: 1px solid;\n}\n#modal_indicator {\n  float: right !important;\n  float: right;\n  color: #777;\n  margin-left: 5px;\n  margin-right: 5px;\n  width: 11px;\n  z-index: 10;\n  text-align: center;\n  width: auto;\n}\n[dir=\"rtl\"] #modal_indicator {\n  float: left !important;\n  float: left;\n}\n#readonly-indicator {\n  float: right !important;\n  float: right;\n  color: #777;\n  margin-left: 5px;\n  margin-right: 5px;\n  width: 11px;\n  z-index: 10;\n  text-align: center;\n  width: auto;\n  margin-top: 2px;\n  margin-bottom: 0px;\n  margin-left: 0px;\n  margin-right: 0px;\n  display: none;\n}\n.modal_indicator:before {\n  width: 1.28571429em;\n  text-align: center;\n}\n.edit_mode .modal_indicator:before {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  content: \"\\f040\";\n}\n.edit_mode .modal_indicator:before.fa-pull-left {\n  margin-right: .3em;\n}\n.edit_mode .modal_indicator:before.fa-pull-right {\n  margin-left: .3em;\n}\n.edit_mode .modal_indicator:before.pull-left {\n  margin-right: .3em;\n}\n.edit_mode .modal_indicator:before.pull-right {\n  margin-left: .3em;\n}\n.command_mode .modal_indicator:before {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  content: ' ';\n}\n.command_mode .modal_indicator:before.fa-pull-left {\n  margin-right: .3em;\n}\n.command_mode .modal_indicator:before.fa-pull-right {\n  margin-left: .3em;\n}\n.command_mode .modal_indicator:before.pull-left {\n  margin-right: .3em;\n}\n.command_mode .modal_indicator:before.pull-right {\n  margin-left: .3em;\n}\n.kernel_idle_icon:before {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  content: \"\\f10c\";\n}\n.kernel_idle_icon:before.fa-pull-left {\n  margin-right: .3em;\n}\n.kernel_idle_icon:before.fa-pull-right {\n  margin-left: .3em;\n}\n.kernel_idle_icon:before.pull-left {\n  margin-right: .3em;\n}\n.kernel_idle_icon:before.pull-right {\n  margin-left: .3em;\n}\n.kernel_busy_icon:before {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  content: \"\\f111\";\n}\n.kernel_busy_icon:before.fa-pull-left {\n  margin-right: .3em;\n}\n.kernel_busy_icon:before.fa-pull-right {\n  margin-left: .3em;\n}\n.kernel_busy_icon:before.pull-left {\n  margin-right: .3em;\n}\n.kernel_busy_icon:before.pull-right {\n  margin-left: .3em;\n}\n.kernel_dead_icon:before {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  content: \"\\f1e2\";\n}\n.kernel_dead_icon:before.fa-pull-left {\n  margin-right: .3em;\n}\n.kernel_dead_icon:before.fa-pull-right {\n  margin-left: .3em;\n}\n.kernel_dead_icon:before.pull-left {\n  margin-right: .3em;\n}\n.kernel_dead_icon:before.pull-right {\n  margin-left: .3em;\n}\n.kernel_disconnected_icon:before {\n  display: inline-block;\n  font: normal normal normal 14px\/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  content: \"\\f127\";\n}\n.kernel_disconnected_icon:before.fa-pull-left {\n  margin-right: .3em;\n}\n.kernel_disconnected_icon:before.fa-pull-right {\n  margin-left: .3em;\n}\n.kernel_disconnected_icon:before.pull-left {\n  margin-right: .3em;\n}\n.kernel_disconnected_icon:before.pull-right {\n  margin-left: .3em;\n}\n.notification_widget {\n  color: #777;\n  z-index: 10;\n  background: rgba(240, 240, 240, 0.5);\n  margin-right: 4px;\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.notification_widget:focus,\n.notification_widget.focus {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #8c8c8c;\n}\n.notification_widget:hover {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.notification_widget:active,\n.notification_widget.active,\n.open > .dropdown-toggle.notification_widget {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.notification_widget:active:hover,\n.notification_widget.active:hover,\n.open > .dropdown-toggle.notification_widget:hover,\n.notification_widget:active:focus,\n.notification_widget.active:focus,\n.open > .dropdown-toggle.notification_widget:focus,\n.notification_widget:active.focus,\n.notification_widget.active.focus,\n.open > .dropdown-toggle.notification_widget.focus {\n  color: #333;\n  background-color: #d4d4d4;\n  border-color: #8c8c8c;\n}\n.notification_widget:active,\n.notification_widget.active,\n.open > .dropdown-toggle.notification_widget {\n  background-image: none;\n}\n.notification_widget.disabled:hover,\n.notification_widget[disabled]:hover,\nfieldset[disabled] .notification_widget:hover,\n.notification_widget.disabled:focus,\n.notification_widget[disabled]:focus,\nfieldset[disabled] .notification_widget:focus,\n.notification_widget.disabled.focus,\n.notification_widget[disabled].focus,\nfieldset[disabled] .notification_widget.focus {\n  background-color: #fff;\n  border-color: #ccc;\n}\n.notification_widget .badge {\n  color: #fff;\n  background-color: #333;\n}\n.notification_widget.warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.notification_widget.warning:focus,\n.notification_widget.warning.focus {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #985f0d;\n}\n.notification_widget.warning:hover {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.notification_widget.warning:active,\n.notification_widget.warning.active,\n.open > .dropdown-toggle.notification_widget.warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.notification_widget.warning:active:hover,\n.notification_widget.warning.active:hover,\n.open > .dropdown-toggle.notification_widget.warning:hover,\n.notification_widget.warning:active:focus,\n.notification_widget.warning.active:focus,\n.open > .dropdown-toggle.notification_widget.warning:focus,\n.notification_widget.warning:active.focus,\n.notification_widget.warning.active.focus,\n.open > .dropdown-toggle.notification_widget.warning.focus {\n  color: #fff;\n  background-color: #d58512;\n  border-color: #985f0d;\n}\n.notification_widget.warning:active,\n.notification_widget.warning.active,\n.open > .dropdown-toggle.notification_widget.warning {\n  background-image: none;\n}\n.notification_widget.warning.disabled:hover,\n.notification_widget.warning[disabled]:hover,\nfieldset[disabled] .notification_widget.warning:hover,\n.notification_widget.warning.disabled:focus,\n.notification_widget.warning[disabled]:focus,\nfieldset[disabled] .notification_widget.warning:focus,\n.notification_widget.warning.disabled.focus,\n.notification_widget.warning[disabled].focus,\nfieldset[disabled] .notification_widget.warning.focus {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.notification_widget.warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.notification_widget.success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.notification_widget.success:focus,\n.notification_widget.success.focus {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #255625;\n}\n.notification_widget.success:hover {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.notification_widget.success:active,\n.notification_widget.success.active,\n.open > .dropdown-toggle.notification_widget.success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.notification_widget.success:active:hover,\n.notification_widget.success.active:hover,\n.open > .dropdown-toggle.notification_widget.success:hover,\n.notification_widget.success:active:focus,\n.notification_widget.success.active:focus,\n.open > .dropdown-toggle.notification_widget.success:focus,\n.notification_widget.success:active.focus,\n.notification_widget.success.active.focus,\n.open > .dropdown-toggle.notification_widget.success.focus {\n  color: #fff;\n  background-color: #398439;\n  border-color: #255625;\n}\n.notification_widget.success:active,\n.notification_widget.success.active,\n.open > .dropdown-toggle.notification_widget.success {\n  background-image: none;\n}\n.notification_widget.success.disabled:hover,\n.notification_widget.success[disabled]:hover,\nfieldset[disabled] .notification_widget.success:hover,\n.notification_widget.success.disabled:focus,\n.notification_widget.success[disabled]:focus,\nfieldset[disabled] .notification_widget.success:focus,\n.notification_widget.success.disabled.focus,\n.notification_widget.success[disabled].focus,\nfieldset[disabled] .notification_widget.success.focus {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.notification_widget.success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.notification_widget.info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.notification_widget.info:focus,\n.notification_widget.info.focus {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #1b6d85;\n}\n.notification_widget.info:hover {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.notification_widget.info:active,\n.notification_widget.info.active,\n.open > .dropdown-toggle.notification_widget.info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.notification_widget.info:active:hover,\n.notification_widget.info.active:hover,\n.open > .dropdown-toggle.notification_widget.info:hover,\n.notification_widget.info:active:focus,\n.notification_widget.info.active:focus,\n.open > .dropdown-toggle.notification_widget.info:focus,\n.notification_widget.info:active.focus,\n.notification_widget.info.active.focus,\n.open > .dropdown-toggle.notification_widget.info.focus {\n  color: #fff;\n  background-color: #269abc;\n  border-color: #1b6d85;\n}\n.notification_widget.info:active,\n.notification_widget.info.active,\n.open > .dropdown-toggle.notification_widget.info {\n  background-image: none;\n}\n.notification_widget.info.disabled:hover,\n.notification_widget.info[disabled]:hover,\nfieldset[disabled] .notification_widget.info:hover,\n.notification_widget.info.disabled:focus,\n.notification_widget.info[disabled]:focus,\nfieldset[disabled] .notification_widget.info:focus,\n.notification_widget.info.disabled.focus,\n.notification_widget.info[disabled].focus,\nfieldset[disabled] .notification_widget.info.focus {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.notification_widget.info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.notification_widget.danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.notification_widget.danger:focus,\n.notification_widget.danger.focus {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #761c19;\n}\n.notification_widget.danger:hover {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.notification_widget.danger:active,\n.notification_widget.danger.active,\n.open > .dropdown-toggle.notification_widget.danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.notification_widget.danger:active:hover,\n.notification_widget.danger.active:hover,\n.open > .dropdown-toggle.notification_widget.danger:hover,\n.notification_widget.danger:active:focus,\n.notification_widget.danger.active:focus,\n.open > .dropdown-toggle.notification_widget.danger:focus,\n.notification_widget.danger:active.focus,\n.notification_widget.danger.active.focus,\n.open > .dropdown-toggle.notification_widget.danger.focus {\n  color: #fff;\n  background-color: #ac2925;\n  border-color: #761c19;\n}\n.notification_widget.danger:active,\n.notification_widget.danger.active,\n.open > .dropdown-toggle.notification_widget.danger {\n  background-image: none;\n}\n.notification_widget.danger.disabled:hover,\n.notification_widget.danger[disabled]:hover,\nfieldset[disabled] .notification_widget.danger:hover,\n.notification_widget.danger.disabled:focus,\n.notification_widget.danger[disabled]:focus,\nfieldset[disabled] .notification_widget.danger:focus,\n.notification_widget.danger.disabled.focus,\n.notification_widget.danger[disabled].focus,\nfieldset[disabled] .notification_widget.danger.focus {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.notification_widget.danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\ndiv#pager {\n  background-color: #fff;\n  font-size: 14px;\n  line-height: 20px;\n  overflow: hidden;\n  display: none;\n  position: fixed;\n  bottom: 0px;\n  width: 100%;\n  max-height: 50%;\n  padding-top: 8px;\n  -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);\n  box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);\n  \/* Display over codemirror *\/\n  z-index: 100;\n  \/* Hack which prevents jquery ui resizable from changing top. *\/\n  top: auto !important;\n}\ndiv#pager pre {\n  line-height: 1.21429em;\n  color: #000;\n  background-color: #f7f7f7;\n  padding: 0.4em;\n}\ndiv#pager #pager-button-area {\n  position: absolute;\n  top: 8px;\n  right: 20px;\n}\ndiv#pager #pager-contents {\n  position: relative;\n  overflow: auto;\n  width: 100%;\n  height: 100%;\n}\ndiv#pager #pager-contents #pager-container {\n  position: relative;\n  padding: 15px 0px;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n}\ndiv#pager .ui-resizable-handle {\n  top: 0px;\n  height: 8px;\n  background: #f7f7f7;\n  border-top: 1px solid #cfcfcf;\n  border-bottom: 1px solid #cfcfcf;\n  \/* This injects handle bars (a short, wide = symbol) for \n        the resize handle. *\/\n}\ndiv#pager .ui-resizable-handle::after {\n  content: '';\n  top: 2px;\n  left: 50%;\n  height: 3px;\n  width: 30px;\n  margin-left: -15px;\n  position: absolute;\n  border-top: 1px solid #cfcfcf;\n}\n.quickhelp {\n  \/* Old browsers *\/\n  display: -webkit-box;\n  -webkit-box-orient: horizontal;\n  -webkit-box-align: stretch;\n  display: -moz-box;\n  -moz-box-orient: horizontal;\n  -moz-box-align: stretch;\n  display: box;\n  box-orient: horizontal;\n  box-align: stretch;\n  \/* Modern browsers *\/\n  display: flex;\n  flex-direction: row;\n  align-items: stretch;\n  line-height: 1.8em;\n}\n.shortcut_key {\n  display: inline-block;\n  width: 21ex;\n  text-align: right;\n  font-family: monospace;\n}\n.shortcut_descr {\n  display: inline-block;\n  \/* Old browsers *\/\n  -webkit-box-flex: 1;\n  -moz-box-flex: 1;\n  box-flex: 1;\n  \/* Modern browsers *\/\n  flex: 1;\n}\nspan.save_widget {\n  height: 30px;\n  margin-top: 4px;\n  display: flex;\n  justify-content: flex-start;\n  align-items: baseline;\n  width: 50%;\n  flex: 1;\n}\nspan.save_widget span.filename {\n  height: 100%;\n  line-height: 1em;\n  margin-left: 16px;\n  border: none;\n  font-size: 146.5%;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  white-space: nowrap;\n  border-radius: 2px;\n}\nspan.save_widget span.filename:hover {\n  background-color: #e6e6e6;\n}\n[dir=\"rtl\"] span.save_widget.pull-left {\n  float: right !important;\n  float: right;\n}\n[dir=\"rtl\"] span.save_widget span.filename {\n  margin-left: 0;\n  margin-right: 16px;\n}\nspan.checkpoint_status,\nspan.autosave_status {\n  font-size: small;\n  white-space: nowrap;\n  padding: 0 5px;\n}\n@media (max-width: 767px) {\n  span.save_widget {\n    font-size: small;\n    padding: 0 0 0 5px;\n  }\n  span.checkpoint_status,\n  span.autosave_status {\n    display: none;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  span.checkpoint_status {\n    display: none;\n  }\n  span.autosave_status {\n    font-size: x-small;\n  }\n}\n.toolbar {\n  padding: 0px;\n  margin-left: -5px;\n  margin-top: 2px;\n  margin-bottom: 5px;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n}\n.toolbar select,\n.toolbar label {\n  width: auto;\n  vertical-align: middle;\n  margin-right: 2px;\n  margin-bottom: 0px;\n  display: inline;\n  font-size: 92%;\n  margin-left: 0.3em;\n  margin-right: 0.3em;\n  padding: 0px;\n  padding-top: 3px;\n}\n.toolbar .btn {\n  padding: 2px 8px;\n}\n.toolbar .btn-group {\n  margin-top: 0px;\n  margin-left: 5px;\n}\n.toolbar-btn-label {\n  margin-left: 6px;\n}\n#maintoolbar {\n  margin-bottom: -3px;\n  margin-top: -8px;\n  border: 0px;\n  min-height: 27px;\n  margin-left: 0px;\n  padding-top: 11px;\n  padding-bottom: 3px;\n}\n#maintoolbar .navbar-text {\n  float: none;\n  vertical-align: middle;\n  text-align: right;\n  margin-left: 5px;\n  margin-right: 0px;\n  margin-top: 0px;\n}\n.select-xs {\n  height: 24px;\n}\n[dir=\"rtl\"] .btn-group > .btn,\n.btn-group-vertical > .btn {\n  float: right;\n}\n.pulse,\n.dropdown-menu > li > a.pulse,\nli.pulse > a.dropdown-toggle,\nli.pulse.open > a.dropdown-toggle {\n  background-color: #F37626;\n  color: white;\n}\n\/**\n * Primary styles\n *\n * Author: Jupyter Development Team\n *\/\n\/** WARNING IF YOU ARE EDITTING THIS FILE, if this is a .css file, It has a lot\n * of chance of beeing generated from the ..\/less\/[samename].less file, you can\n * try to get back the less file by reverting somme commit in history\n **\/\n\/*\n * We'll try to get something pretty, so we\n * have some strange css to have the scroll bar on\n * the left with fix button on the top right of the tooltip\n *\/\n@-moz-keyframes fadeOut {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n@-webkit-keyframes fadeOut {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n@-moz-keyframes fadeIn {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\n@-webkit-keyframes fadeIn {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\n\/*properties of tooltip after \"expand\"*\/\n.bigtooltip {\n  overflow: auto;\n  height: 200px;\n  -webkit-transition-property: height;\n  -webkit-transition-duration: 500ms;\n  -moz-transition-property: height;\n  -moz-transition-duration: 500ms;\n  transition-property: height;\n  transition-duration: 500ms;\n}\n\/*properties of tooltip before \"expand\"*\/\n.smalltooltip {\n  -webkit-transition-property: height;\n  -webkit-transition-duration: 500ms;\n  -moz-transition-property: height;\n  -moz-transition-duration: 500ms;\n  transition-property: height;\n  transition-duration: 500ms;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  height: 80px;\n}\n.tooltipbuttons {\n  position: absolute;\n  padding-right: 15px;\n  top: 0px;\n  right: 0px;\n}\n.tooltiptext {\n  \/*avoid the button to overlap on some docstring*\/\n  padding-right: 30px;\n}\n.ipython_tooltip {\n  max-width: 700px;\n  \/*fade-in animation when inserted*\/\n  -webkit-animation: fadeOut 400ms;\n  -moz-animation: fadeOut 400ms;\n  animation: fadeOut 400ms;\n  -webkit-animation: fadeIn 400ms;\n  -moz-animation: fadeIn 400ms;\n  animation: fadeIn 400ms;\n  vertical-align: middle;\n  background-color: #f7f7f7;\n  overflow: visible;\n  border: #ababab 1px solid;\n  outline: none;\n  padding: 3px;\n  margin: 0px;\n  padding-left: 7px;\n  font-family: monospace;\n  min-height: 50px;\n  -moz-box-shadow: 0px 6px 10px -1px #adadad;\n  -webkit-box-shadow: 0px 6px 10px -1px #adadad;\n  box-shadow: 0px 6px 10px -1px #adadad;\n  border-radius: 2px;\n  position: absolute;\n  z-index: 1000;\n}\n.ipython_tooltip a {\n  float: right;\n}\n.ipython_tooltip .tooltiptext pre {\n  border: 0;\n  border-radius: 0;\n  font-size: 100%;\n  background-color: #f7f7f7;\n}\n.pretooltiparrow {\n  left: 0px;\n  margin: 0px;\n  top: -16px;\n  width: 40px;\n  height: 16px;\n  overflow: hidden;\n  position: absolute;\n}\n.pretooltiparrow:before {\n  background-color: #f7f7f7;\n  border: 1px #ababab solid;\n  z-index: 11;\n  content: \"\";\n  position: absolute;\n  left: 15px;\n  top: 10px;\n  width: 25px;\n  height: 25px;\n  -webkit-transform: rotate(45deg);\n  -moz-transform: rotate(45deg);\n  -ms-transform: rotate(45deg);\n  -o-transform: rotate(45deg);\n}\nul.typeahead-list i {\n  margin-left: -10px;\n  width: 18px;\n}\n[dir=\"rtl\"] ul.typeahead-list i {\n  margin-left: 0;\n  margin-right: -10px;\n}\nul.typeahead-list {\n  max-height: 80vh;\n  overflow: auto;\n}\nul.typeahead-list > li > a {\n  \/** Firefox bug **\/\n  \/* see https:\/\/github.com\/jupyter\/notebook\/issues\/559 *\/\n  white-space: normal;\n}\nul.typeahead-list  > li > a.pull-right {\n  float: left !important;\n  float: left;\n}\n[dir=\"rtl\"] .typeahead-list {\n  text-align: right;\n}\n.cmd-palette .modal-body {\n  padding: 7px;\n}\n.cmd-palette form {\n  background: white;\n}\n.cmd-palette input {\n  outline: none;\n}\n.no-shortcut {\n  min-width: 20px;\n  color: transparent;\n}\n[dir=\"rtl\"] .no-shortcut.pull-right {\n  float: left !important;\n  float: left;\n}\n[dir=\"rtl\"] .command-shortcut.pull-right {\n  float: left !important;\n  float: left;\n}\n.command-shortcut:before {\n  content: \"(command mode)\";\n  padding-right: 3px;\n  color: #777777;\n}\n.edit-shortcut:before {\n  content: \"(edit)\";\n  padding-right: 3px;\n  color: #777777;\n}\n[dir=\"rtl\"] .edit-shortcut.pull-right {\n  float: left !important;\n  float: left;\n}\n#find-and-replace #replace-preview .match,\n#find-and-replace #replace-preview .insert {\n  background-color: #BBDEFB;\n  border-color: #90CAF9;\n  border-style: solid;\n  border-width: 1px;\n  border-radius: 0px;\n}\n[dir=\"ltr\"] #find-and-replace .input-group-btn + .form-control {\n  border-left: none;\n}\n[dir=\"rtl\"] #find-and-replace .input-group-btn + .form-control {\n  border-right: none;\n}\n#find-and-replace #replace-preview .replace .match {\n  background-color: #FFCDD2;\n  border-color: #EF9A9A;\n  border-radius: 0px;\n}\n#find-and-replace #replace-preview .replace .insert {\n  background-color: #C8E6C9;\n  border-color: #A5D6A7;\n  border-radius: 0px;\n}\n#find-and-replace #replace-preview {\n  max-height: 60vh;\n  overflow: auto;\n}\n#find-and-replace #replace-preview pre {\n  padding: 5px 10px;\n}\n.terminal-app {\n  background: #EEE;\n}\n.terminal-app #header {\n  background: #fff;\n  -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);\n  box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);\n}\n.terminal-app .terminal {\n  width: 100%;\n  float: left;\n  font-family: monospace;\n  color: white;\n  background: black;\n  padding: 0.4em;\n  border-radius: 2px;\n  -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.4);\n  box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.4);\n}\n.terminal-app .terminal,\n.terminal-app .terminal dummy-screen {\n  line-height: 1em;\n  font-size: 14px;\n}\n.terminal-app .terminal .xterm-rows {\n  padding: 10px;\n}\n.terminal-app .terminal-cursor {\n  color: black;\n  background: white;\n}\n.terminal-app #terminado-container {\n  margin-top: 20px;\n}\n\/*# sourceMappingURL=style.min.css.map *\/\n    <\/style>\n<style type=\"text\/css\">\n    .highlight .hll { background-color: #ffffcc }\n.highlight  { background: #f8f8f8; }\n.highlight .c { color: #408080; font-style: italic } \/* Comment *\/\n.highlight .err { border: 1px solid #FF0000 } \/* Error *\/\n.highlight .k { color: #008000; font-weight: bold } \/* Keyword *\/\n.highlight .o { color: #666666 } \/* Operator *\/\n.highlight .ch { color: #408080; font-style: italic } \/* Comment.Hashbang *\/\n.highlight .cm { color: #408080; font-style: italic } \/* Comment.Multiline *\/\n.highlight .cp { color: #BC7A00 } \/* Comment.Preproc *\/\n.highlight .cpf { color: #408080; font-style: italic } \/* Comment.PreprocFile *\/\n.highlight .c1 { color: #408080; font-style: italic } \/* Comment.Single *\/\n.highlight .cs { color: #408080; font-style: italic } \/* Comment.Special *\/\n.highlight .gd { color: #A00000 } \/* Generic.Deleted *\/\n.highlight .ge { font-style: italic } \/* Generic.Emph *\/\n.highlight .gr { color: #FF0000 } \/* Generic.Error *\/\n.highlight .gh { color: #000080; font-weight: bold } \/* Generic.Heading *\/\n.highlight .gi { color: #00A000 } \/* Generic.Inserted *\/\n.highlight .go { color: #888888 } \/* Generic.Output *\/\n.highlight .gp { color: #000080; font-weight: bold } \/* Generic.Prompt *\/\n.highlight .gs { font-weight: bold } \/* Generic.Strong *\/\n.highlight .gu { color: #800080; font-weight: bold } \/* Generic.Subheading *\/\n.highlight .gt { color: #0044DD } \/* Generic.Traceback *\/\n.highlight .kc { color: #008000; font-weight: bold } \/* Keyword.Constant *\/\n.highlight .kd { color: #008000; font-weight: bold } \/* Keyword.Declaration *\/\n.highlight .kn { color: #008000; font-weight: bold } \/* Keyword.Namespace *\/\n.highlight .kp { color: #008000 } \/* Keyword.Pseudo *\/\n.highlight .kr { color: #008000; font-weight: bold } \/* Keyword.Reserved *\/\n.highlight .kt { color: #B00040 } \/* Keyword.Type *\/\n.highlight .m { color: #666666 } \/* Literal.Number *\/\n.highlight .s { color: #BA2121 } \/* Literal.String *\/\n.highlight .na { color: #7D9029 } \/* Name.Attribute *\/\n.highlight .nb { color: #008000 } \/* Name.Builtin *\/\n.highlight .nc { color: #0000FF; font-weight: bold } \/* Name.Class *\/\n.highlight .no { color: #880000 } \/* Name.Constant *\/\n.highlight .nd { color: #AA22FF } \/* Name.Decorator *\/\n.highlight .ni { color: #999999; font-weight: bold } \/* Name.Entity *\/\n.highlight .ne { color: #D2413A; font-weight: bold } \/* Name.Exception *\/\n.highlight .nf { color: #0000FF } \/* Name.Function *\/\n.highlight .nl { color: #A0A000 } \/* Name.Label *\/\n.highlight .nn { color: #0000FF; font-weight: bold } \/* Name.Namespace *\/\n.highlight .nt { color: #008000; font-weight: bold } \/* Name.Tag *\/\n.highlight .nv { color: #19177C } \/* Name.Variable *\/\n.highlight .ow { color: #AA22FF; font-weight: bold } \/* Operator.Word *\/\n.highlight .w { color: #bbbbbb } \/* Text.Whitespace *\/\n.highlight .mb { color: #666666 } \/* Literal.Number.Bin *\/\n.highlight .mf { color: #666666 } \/* Literal.Number.Float *\/\n.highlight .mh { color: #666666 } \/* Literal.Number.Hex *\/\n.highlight .mi { color: #666666 } \/* Literal.Number.Integer *\/\n.highlight .mo { color: #666666 } \/* Literal.Number.Oct *\/\n.highlight .sa { color: #BA2121 } \/* Literal.String.Affix *\/\n.highlight .sb { color: #BA2121 } \/* Literal.String.Backtick *\/\n.highlight .sc { color: #BA2121 } \/* Literal.String.Char *\/\n.highlight .dl { color: #BA2121 } \/* Literal.String.Delimiter *\/\n.highlight .sd { color: #BA2121; font-style: italic } \/* Literal.String.Doc *\/\n.highlight .s2 { color: #BA2121 } \/* Literal.String.Double *\/\n.highlight .se { color: #BB6622; font-weight: bold } \/* Literal.String.Escape *\/\n.highlight .sh { color: #BA2121 } \/* Literal.String.Heredoc *\/\n.highlight .si { color: #BB6688; font-weight: bold } \/* Literal.String.Interpol *\/\n.highlight .sx { color: #008000 } \/* Literal.String.Other *\/\n.highlight .sr { color: #BB6688 } \/* Literal.String.Regex *\/\n.highlight .s1 { color: #BA2121 } \/* Literal.String.Single *\/\n.highlight .ss { color: #19177C } \/* Literal.String.Symbol *\/\n.highlight .bp { color: #008000 } \/* Name.Builtin.Pseudo *\/\n.highlight .fm { color: #0000FF } \/* Name.Function.Magic *\/\n.highlight .vc { color: #19177C } \/* Name.Variable.Class *\/\n.highlight .vg { color: #19177C } \/* Name.Variable.Global *\/\n.highlight .vi { color: #19177C } \/* Name.Variable.Instance *\/\n.highlight .vm { color: #19177C } \/* Name.Variable.Magic *\/\n.highlight .il { color: #666666 } \/* Literal.Number.Integer.Long *\/\n    <\/style>\n<style type=\"text\/css\">\n<p>\/* Temporary definitions which will become obsolete with Notebook release 5.0 *\/\n.ansi-black-fg { color: #3E424D; }\n.ansi-black-bg { background-color: #3E424D; }\n.ansi-black-intense-fg { color: #282C36; }\n.ansi-black-intense-bg { background-color: #282C36; }\n.ansi-red-fg { color: #E75C58; }\n.ansi-red-bg { background-color: #E75C58; }\n.ansi-red-intense-fg { color: #B22B31; }\n.ansi-red-intense-bg { background-color: #B22B31; }\n.ansi-green-fg { color: #00A250; }\n.ansi-green-bg { background-color: #00A250; }\n.ansi-green-intense-fg { color: #007427; }\n.ansi-green-intense-bg { background-color: #007427; }\n.ansi-yellow-fg { color: #DDB62B; }\n.ansi-yellow-bg { background-color: #DDB62B; }\n.ansi-yellow-intense-fg { color: #B27D12; }\n.ansi-yellow-intense-bg { background-color: #B27D12; }\n.ansi-blue-fg { color: #208FFB; }\n.ansi-blue-bg { background-color: #208FFB; }\n.ansi-blue-intense-fg { color: #0065CA; }\n.ansi-blue-intense-bg { background-color: #0065CA; }\n.ansi-magenta-fg { color: #D160C4; }\n.ansi-magenta-bg { background-color: #D160C4; }\n.ansi-magenta-intense-fg { color: #A03196; }\n.ansi-magenta-intense-bg { background-color: #A03196; }\n.ansi-cyan-fg { color: #60C6C8; }\n.ansi-cyan-bg { background-color: #60C6C8; }\n.ansi-cyan-intense-fg { color: #258F8F; }\n.ansi-cyan-intense-bg { background-color: #258F8F; }\n.ansi-white-fg { color: #C5C1B4; }\n.ansi-white-bg { background-color: #C5C1B4; }\n.ansi-white-intense-fg { color: #A1A6B2; }\n.ansi-white-intense-bg { background-color: #A1A6B2; }<\/p>\n<p>.ansi-bold { font-weight: bold; }<\/p>\n<\/style>\n<style type=\"text\/css\">\n\/* Overrides of notebook CSS for static HTML export *\/\nbody {\n  overflow: visible;\n  padding: 8px;\n}<\/p>\n<p>div#notebook {\n  overflow: visible;\n  border-top: none;\n}@media print {\n  div.cell {\n    display: block;\n    page-break-inside: avoid;\n  } \n  div.output_wrapper { \n    display: block;\n    page-break-inside: avoid; \n  }\n  div.output { \n    display: block;\n    page-break-inside: avoid; \n  }\n}\n<\/style>\n<p><!-- Custom stylesheet, it must be in the same directory as the html file -->\n \t<link rel=\"stylesheet\" href=\"custom.css\">\n<p><!-- Loading mathjax macro --><br \/>\n<!-- Load mathjax --><br \/>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/mathjax\/2.7.5\/latest.js?config=TeX-AMS_HTML\"><\/script><br \/>\n    <!-- MathJax configuration --><br \/>\n    <script type=\"text\/x-mathjax-config\">\n    MathJax.Hub.Config({\n        tex2jax: {\n            inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n            displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ],\n            processEscapes: true,\n            processEnvironments: true\n        },\n        \/\/ Center justify equations in code and markdown cells. Elsewhere\n        \/\/ we use CSS to left justify single line equations in code cells.\n        displayAlign: 'center',\n        \"HTML-CSS\": {\n            styles: {'.MathJax_Display': {\"margin\": 0}},\n            linebreaks: { automatic: true }\n        }\n    });\n    <\/script><br \/>\n    <!-- End of mathjax configuration --><\/head><br \/>\n<body><\/p>\n<div tabindex=\"-1\" id=\"notebook\" class=\"border-box-sizing\">\n<div class=\"container\" id=\"notebook-container\">\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">import<\/span> <span class=\"nn\">warnings<\/span>\n<span class=\"n\">warnings<\/span><span class=\"o\">.<\/span><span class=\"n\">filterwarnings<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;ignore&#39;<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h1 id=\"Chapter-7:-Unsupervised-learning\">Chapter 7: Unsupervised learning<a class=\"anchor-link\" href=\"#Chapter-7:-Unsupervised-learning\">&#182;<\/a><\/h1>\n<p>In this notebook, we will discuss different techniques for unsupervised learning and will focus on several clustering techniques. After considering basic concepts like distance and similarity, taxonomy of clustering techniques and goodness of clustering quality, we will explore three basic clustering techniques, namely, K-means, spectral clustering and hierarchical clustering. At the end, we will illustrate the use of clustering techniques on a real problem: defining groups of countries according to their economic expenditure on education.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2 id=\"1.-Introduction-to-unsupervised-learning\">1. Introduction to unsupervised learning<a class=\"anchor-link\" href=\"#1.-Introduction-to-unsupervised-learning\">&#182;<\/a><\/h2>\n<p>In machine learning, the problem of unsupervised learning is that of trying to <strong>find hidden structure in unlabeled data<\/strong>. Since the examples given to the learner are unlabeled, there is <strong>no error or reward signal<\/strong> to evaluate a potential solution. This distinguishes unsupervised learning from supervised learning.<\/p>\n<p>Unsupervised learning is defined as the set of algorithms which learns from a <strong>training set of unlableled or unannotated<\/strong> examples, using the features of the inputs to categorize them together according to some <strong>geometric<\/strong> or <strong>statistical<\/strong> criteria.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Unsupervised learning encompasses many techniques that seek to <strong>summarize and explain key features<\/strong> of the data. Many methods employed in unsupervised learning are based on <em>data mining<\/em> methods used to preprocess data.<\/p>\n<p>Different <em>kinds<\/em> of unsupervised learning problems:<\/p>\n<ul>\n<li><em>Clustering:<\/em> partition examples into groups when no pre-defined categories\/classes are available.<\/li>\n<li><em>Dimensionality reduction:<\/em> principal component analysis, independent component analysis, non-negative matrix factorization.<\/li>\n<li><em>Outlier detection:<\/em> find unusual events (e.g. malfunction).<\/li>\n<li><em>Novelty detection:<\/em> find changes in data.<\/li>\n<\/ul>\n<p>The most common unsupervised task is <strong>clustering<\/strong>. In this notebook, we will focus on the clustering and dimensionality reduction (in brief) tasks.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2 id=\"2.-Clustering\">2. Clustering<a class=\"anchor-link\" href=\"#2.-Clustering\">&#182;<\/a><\/h2>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><strong>Partition<\/strong> unlabeled examples into <em>disjoint subsets of clusters<\/em>, such that:<\/p>\n<ul>\n<li>Examples within a cluster are similar (<em>high intra-class<\/em> similarity).<\/li>\n<li>Examples in different clusters are different (<em>low inter-class<\/em> similarity).<\/li>\n<\/ul>\n<p>It can help in discovering new categories in an unsupervised manner (no sample category labels provided).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3 id=\"Important-questions-in-clustering\">Important questions in clustering<a class=\"anchor-link\" href=\"#Important-questions-in-clustering\">&#182;<\/a><\/h3>\n<ul>\n<li>What is a <em>natural grouping<\/em> among these objects?\n<ul>\n<li>Definition of &#8220;groupness&#8221;<\/li>\n<li>Definition of &#8220;similarity\/distance&#8221;<\/li>\n<\/ul>\n<\/li>\n<li><em>How to group<\/em> samples?<\/li>\n<li><em>How many<\/em> clusters?\n<ul>\n<li>Fixed a priori?<\/li>\n<li>Completely data driven?<\/li>\n<li>Avoid \u201ctrivial\u201d clusters &#8211; too large or small&#8230;<\/li>\n<li>Which methods do work when the number of samples is huge?<\/li>\n<li>Which methods do work when the number of classes is huge?, etc.<\/li>\n<\/ul>\n<\/li>\n<li><em>What<\/em> is a <em>good grouping<\/em>?\n<ul>\n<li>What objective measures can be defined to evaluate the quality of the clusters?<\/li>\n<\/ul>\n<\/li>\n<li>In which space to <em>group<\/em>?\n<ul>\n<li>What to do in high-dimensional feature spaces?<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<div class=\"alert alert-info\"> **IMPORTANT IDEA: ** Clustering is subjective issue.<\/div>\n<p>Clustering will help us to analyze and get insight of the data, but the quality of the partition <strong>depends on the application and the analyst<\/strong>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2 id=\"2.1-Similarity-and-distance\">2.1 Similarity and distance<a class=\"anchor-link\" href=\"#2.1-Similarity-and-distance\">&#182;<\/a><\/h2>\n<p>The notion of similarity is a tough one, however we can use the notion of distance as a surrogate.<\/p>\n<p>The most wide spread distance metric is the Minkowski distance:<\/p>\n<p>$$d(a,b) = \\big(\\sum\\limits_{i=1}^d |a_i-b_i|^p \\big)^{1\/p}$$The most well-known instantiations of this metric are:<\/p>\n<ul>\n<li>$p = 2$ we have Euclidean distance,<\/li>\n<li>$p=1$ Manhattan distance, and<\/li>\n<li>$p=\\infty$ max-distance.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2 id=\"2.2-What-is-a-good-clustering?-Defining-metrics-to-measure-clustering-quality\">2.2 What is a good clustering? Defining metrics to measure clustering quality<a class=\"anchor-link\" href=\"#2.2-What-is-a-good-clustering?-Defining-metrics-to-measure-clustering-quality\">&#182;<\/a><\/h2>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>The <strong>Rand index<\/strong> or <strong>Rand measure<\/strong> (named after William M. Rand) in statistics, and in particular in data clustering, is a measure of the similarity between two data clusterings. A form of the Rand index may be defined that is adjusted for the chance grouping of elements, this is the <strong>adjusted Rand index<\/strong>. From a mathematical standpoint, Rand index is related to the accuracy, but is applicable even when class labels are not used.<\/p>\n<p>Given a set of n elements $S = \\{o_1, \\ldots, o_n\\}$ and two partitions of S to compare, $X = \\{X_1, \\ldots, X_r\\}$, a partition of $S$ into $r$ subsets, and $Y = \\{Y_1, \\ldots, Y_s\\}$, a partition of $S$ into $s$ subsets, define the following:<\/p>\n<ul>\n<li>a, the number of pairs of elements in S that are in the same set in X and in the same set in Y<\/li>\n<li>b, the number of pairs of elements in S that are in different sets in X and in different sets in Y<\/li>\n<li>c, the number of pairs of elements in S that are in the same set in X and in different sets in Y<\/li>\n<li>d, the number of pairs of elements in S that are in different sets in X and in the same set in Y.<\/li>\n<\/ul>\n<p>The Rand index, R, is:<br \/>\n$ R = \\frac{a+b}{a+b+c+d} = \\frac{a+b}{{n \\choose 2 }}$<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>A clustering result satisfies <strong>homogeneity<\/strong> if all of its clusters contain only data points which are members of the same original (a single) class.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>A clustering result satisfies <strong>completeness<\/strong> if all the data points that are members of a given class are elements of the same automatic cluster.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Both scores have positive values between 0.0 and 1.0, larger values being desirable.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">import<\/span> <span class=\"nn\">matplotlib.pylab<\/span> <span class=\"k\">as<\/span> <span class=\"nn\">plt<\/span>\n\n<span class=\"c1\">#%matplotlib inline <\/span>\n<span class=\"c1\">#plt.style.use(&#39;seaborn-whitegrid&#39;)<\/span>\n<span class=\"c1\">#plt.rc(&#39;text&#39;, usetex=True)<\/span>\n<span class=\"c1\">#plt.rc(&#39;font&#39;, family=&#39;times&#39;)<\/span>\n<span class=\"c1\">#plt.rc(&#39;xtick&#39;, labelsize=10) <\/span>\n<span class=\"c1\">#plt.rc(&#39;ytick&#39;, labelsize=10) <\/span>\n<span class=\"c1\">#plt.rc(&#39;font&#39;, size=12) <\/span>\n<span class=\"c1\">#plt.rc(&#39;figure&#39;, figsize = (12, 5))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">from<\/span> <span class=\"nn\">sklearn<\/span> <span class=\"k\">import<\/span> <span class=\"n\">metrics<\/span>\n<span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">homogeneity_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">])<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">homogeneity_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">homogeneity_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">homogeneity_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">homogeneity_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">completeness_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">completeness_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">completeness_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">completeness_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">completeness_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><strong>V-measure<\/strong> cluster labeling given a ground truth:<br \/>\nThe V-measure is the harmonic mean between homogeneity and completeness:<\/p>\n<p>$v = 2 * (homogeneity * completeness) \/ (homogeneity + completeness)$<\/p>\n<p>Is the  metric dependent of the absolute values of the labels?: will a permutation of the class or cluster label values change the score value in any way?<\/p>\n<p>Is the metric symmetric wrt the switching label_true with label_pred?<\/p>\n<p>This can be useful to measure the agreement of two independent label assignments strategies on the same dataset when the real ground truth is not known.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Perfect labelings are both homogeneous and complete, hence have score 1.0:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">v_measure_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">]))<\/span>\n\n<span class=\"nb\">print<\/span>  <span class=\"p\">(<\/span><span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">v_measure_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><strong>Question:<\/strong> Labelings that <strong>assign all classes members to the same clusters<\/strong> are: <strong><strong><strong>__<\/strong><\/strong><\/strong>, but not <strong><strong>__<\/strong><\/strong>:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">completeness_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">]))<\/span>\n\n<span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">homogeneity_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">]))<\/span>\n\n<span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">v_measure_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">]))<\/span>\n\n<span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">v_measure_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">]))<\/span>\n\n<span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">v_measure_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Labelings that have pure clusters with members coming from the same classes are _ but un-necessary splits harm __ and thus penalize V-measure as well:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">v_measure_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">]))<\/span>\n\n<span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">v_measure_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>If classes members are <strong>completely split across different clusters<\/strong>, the assignment is totally incomplete, hence the V-Measure is null:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">v_measure_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Clusters that include samples from <strong>totally different classes<\/strong> totally destroy the <strong><strong><em>__<\/em><\/strong><\/strong> of the labeling, hence:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%.3f<\/span><span class=\"s2\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">v_measure_score<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">]))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><strong>Advantages<\/strong><\/p>\n<ul>\n<li><strong>Bounded scores<\/strong>: 0.0 is as bad as it can be, 1.0 is a perfect score.<\/li>\n<li><strong>Intuitive interpretation<\/strong>: clustering with bad V-measure can be qualitatively analyzed in terms of homogeneity and completeness to better feel what \u2018kind\u2019 of mistakes is done by the assignment.<\/li>\n<li><strong>No assumption<\/strong> is made on the cluster structure: can be used to compare clustering algorithms such as K-means which assumes isotropic blob shapes with results of spectral clustering algorithms which can find cluster with \u201cfolded\u201d shapes.<\/li>\n<\/ul>\n<p><strong>Drawbacks<\/strong><\/p>\n<ul>\n<li>The previously introduced metrics are <strong>not normalized with regards to random labeling<\/strong>: this means that depending on the number of samples, clusters and ground truth classes, a completely random labeling will not always yield the same values for homogeneity, completeness and hence V-measure. In particular random labeling won\u2019t yield zero scores especially when the number of clusters is large.<\/li>\n<li>This problem can safely be ignored when <strong>the number of samples<\/strong> is high i.e. more than a thousand and the number of clusters is less than 10.<\/li>\n<li>These metrics require the <strong>knowledge of the ground truth classes<\/strong> while almost never available in practice or require manual assignment by human annotators (as in the supervised learning setting).<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>And if we do not have ground truth?<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>The <strong>Silhouette Coefficient<\/strong> is calculated using the <em>mean intra-cluster distance<\/em> (a) and the <em>mean nearest-cluster distance<\/em> (b) for each sample. The Silhouette Coefficient for a sample is:<\/p>\n<pre><code>                       (b - a) \/ max(a, b).\n\n<\/code><\/pre>\n<p>where b is the distance between a sample and the nearest cluster that the sample is not part of. Note that Silhouette Coefficent is only defined if number of labels is: $ 2 &amp;lt;= n_{labels} &amp;lt;= n_{samples} &#8211; 1$ (WHY?).<\/p>\n<p><strong>Test:<\/strong><\/p>\n<ul>\n<li>The best value is <strong>_<\/strong>.<\/li>\n<li>The worst value is <strong>_<\/strong>.<\/li>\n<li>Pixel values near 0 indicate <strong><em>__<\/em><\/strong>.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>*Advantages**<\/p>\n<p>The score is bounded between -1 and +1. Scores around zero indicate <strong><strong>___<\/strong><\/strong> clusters (WHY?).<\/p>\n<p>The score is higher when clusters are dense and well separated, which relates to a standard concept of a cluster.<\/p>\n<p><strong>Drawbacks<\/strong><\/p>\n<p>The Silhouette Coefficient is generally higher for convex clusters. WHY?<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2 id=\"2.3-Clustering-techniques:-how-to-group-samples?\">2.3 Clustering techniques: how to group samples?<a class=\"anchor-link\" href=\"#2.3-Clustering-techniques:-how-to-group-samples?\">&#182;<\/a><\/h2>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>There are two big families of clustering techniques:<\/p>\n<ul>\n<li><strong>Partitional algorithms:<\/strong> Start with a random partititon and refine it iteratively.<\/li>\n<li><strong>Hierarchical algorithms:<\/strong> Agglomerative (bottom-up), top-down.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3 id=\"Partitional-algorithms\">Partitional algorithms<a class=\"anchor-link\" href=\"#Partitional-algorithms\">&#182;<\/a><\/h3>\n<p>Partitional algorithms can be divided in two branches:<\/p>\n<ul>\n<li>Hard partition algorithms, such as <em>K-means<\/em>, assign a unique cluster value to each element in the feature space.<\/li>\n<li>Soft partition algorithms, such as <em>Mixture of Gaussians<\/em>, can be viewed as density estimators and assign a confidence or probability to each point in the space.<\/li>\n<\/ul>\n<p>In order to build our intuition about clustering, we will start with the simplest, but one of the famest methods: K-means.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3 id=\"2.3.1-K-means-algorithm\">2.3.1 K-means algorithm<a class=\"anchor-link\" href=\"#2.3.1-K-means-algorithm\">&#182;<\/a><\/h3>\n<p><strong>Algorithm:<\/strong><\/p>\n<ol>\n<li>Initialize the value  $K$ of desirable clusters.<\/li>\n<li>Initialize the $K$ cluster centers, e.g. randomly.<\/li>\n<li>Decide the class memberships of the N data samples by assigning them to the nearest cluster centroids (e.g. the center of gravity or mean).<\/li>\n<li>Re-estimate the $K$ cluster centers, by assuming the memberships found above are correct.<\/li>\n<li>If none of the N objects changed membership in the last iteration, exit. Otherwise go to 3.<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Let us see this in action:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">import<\/span> <span class=\"nn\">numpy<\/span> <span class=\"k\">as<\/span> <span class=\"nn\">np<\/span>\n\n\n<span class=\"c1\">#Create some data<\/span>\n<span class=\"n\">MAXN<\/span><span class=\"o\">=<\/span><span class=\"mi\">40<\/span>\n<span class=\"n\">X<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">concatenate<\/span><span class=\"p\">([<\/span><span class=\"mf\">1.25<\/span><span class=\"o\">*<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">randn<\/span><span class=\"p\">(<\/span><span class=\"n\">MAXN<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">),<\/span> <span class=\"mi\">5<\/span><span class=\"o\">+<\/span><span class=\"mf\">1.5<\/span><span class=\"o\">*<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">randn<\/span><span class=\"p\">(<\/span><span class=\"n\">MAXN<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">)])<\/span> \n<span class=\"n\">X<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">concatenate<\/span><span class=\"p\">([<\/span><span class=\"n\">X<\/span><span class=\"p\">,[<\/span><span class=\"mi\">8<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span><span class=\"o\">+<\/span><span class=\"mf\">1.2<\/span><span class=\"o\">*<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">randn<\/span><span class=\"p\">(<\/span><span class=\"n\">MAXN<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">)])<\/span>\n<span class=\"n\">X<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"c1\">#Just for visualization purposes, create the labels of the 3 distributions<\/span>\n<span class=\"n\">y<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">concatenate<\/span><span class=\"p\">([<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">ones<\/span><span class=\"p\">((<\/span><span class=\"n\">MAXN<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">)),<\/span><span class=\"mi\">2<\/span><span class=\"o\">*<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">ones<\/span><span class=\"p\">((<\/span><span class=\"n\">MAXN<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">))])<\/span>\n<span class=\"n\">y<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">concatenate<\/span><span class=\"p\">([<\/span><span class=\"n\">y<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"o\">*<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">ones<\/span><span class=\"p\">((<\/span><span class=\"n\">MAXN<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">))])<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;b&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;g&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Data as were generated&#39;<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[:,<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[:,<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Data as the algorithm sees them&#39;<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">savefig<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;files\/ch07\/sample.png&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">dpi<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">bbox_inches<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;tight&#39;<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">from<\/span> <span class=\"nn\">sklearn<\/span> <span class=\"k\">import<\/span> <span class=\"n\">cluster<\/span>\n\n<span class=\"n\">K<\/span><span class=\"o\">=<\/span><span class=\"mi\">3<\/span> <span class=\"c1\"># Assuming to be 3 clusters!<\/span>\n\n<span class=\"n\">clf<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">init<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;random&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">K<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><strong>Note<\/strong>: Each clustering algorithm comes in two variants: a class, that implements the <em>fit<\/em> method to learn the clusters on train data, and a <em>predict<\/em> function, that, given test data, returns an array of integer labels corresponding to the different clusters. For the class, the labels over the training data can be found in the <em>labels_<\/em> attribute.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">)<\/span>    <span class=\"c1\"># or<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">predict<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">))<\/span> <span class=\"c1\"># equivalent<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">])<\/span> <span class=\"c1\">#numpy.ravel() returns a flattened array<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">])<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;b&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;g&#39;<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">6<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">linspace<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span><span class=\"mi\">15<\/span><span class=\"p\">,<\/span><span class=\"mi\">200<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">XX<\/span><span class=\"p\">,<\/span><span class=\"n\">YY<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">meshgrid<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">,<\/span><span class=\"n\">x<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">sz<\/span><span class=\"o\">=<\/span><span class=\"n\">XX<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span>\n<span class=\"n\">data<\/span><span class=\"o\">=<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">c_<\/span><span class=\"p\">[<\/span><span class=\"n\">XX<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"n\">YY<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">()]<\/span> \n    <span class=\"c1\"># c_ translates slice objects to concatenation along the second axis.<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">Z<\/span><span class=\"o\">=<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">predict<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># returns the labels of the data<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"n\">Z<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><strong>How many &#8220;misclusterings&#8221; do we have?<\/strong><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"c1\"># Visualize space partition<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">imshow<\/span><span class=\"p\">(<\/span><span class=\"n\">Z<\/span><span class=\"o\">.<\/span><span class=\"n\">reshape<\/span><span class=\"p\">(<\/span><span class=\"n\">sz<\/span><span class=\"p\">),<\/span> <span class=\"n\">interpolation<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;bilinear&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">origin<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;lower&#39;<\/span><span class=\"p\">,<\/span> \n           <span class=\"n\">extent<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span><span class=\"mi\">15<\/span><span class=\"p\">,<\/span><span class=\"o\">-<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span><span class=\"mi\">15<\/span><span class=\"p\">),<\/span><span class=\"n\">alpha<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.3<\/span><span class=\"p\">,<\/span> <span class=\"n\">vmin<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">vmax<\/span><span class=\"o\">=<\/span><span class=\"n\">K<\/span><span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Space partitions&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">14<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;b&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;g&#39;<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">6<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">))<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">savefig<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;files\/ch07\/samples3.png&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">dpi<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">bbox_inches<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;tight&#39;<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">clf<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">K<\/span><span class=\"p\">,<\/span> <span class=\"n\">random_state<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span> \n    <span class=\"c1\">#initialize the k-means clustering<\/span>\n<span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span> <span class=\"c1\">#run the k-means clustering<\/span>\n\n<span class=\"n\">data<\/span><span class=\"o\">=<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">c_<\/span><span class=\"p\">[<\/span><span class=\"n\">XX<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"n\">YY<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">()]<\/span> \n<span class=\"n\">Z<\/span><span class=\"o\">=<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">predict<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># returns the clustering labels of the data<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><strong>Visualizing true labels by colored points and space tesselation:<\/strong><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Final result of K-means&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">14<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;b&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;g&#39;<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">imshow<\/span><span class=\"p\">(<\/span><span class=\"n\">Z<\/span><span class=\"o\">.<\/span><span class=\"n\">reshape<\/span><span class=\"p\">(<\/span><span class=\"n\">sz<\/span><span class=\"p\">),<\/span> <span class=\"n\">interpolation<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;bilinear&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">origin<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;lower&#39;<\/span><span class=\"p\">,<\/span> \n           <span class=\"n\">extent<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span><span class=\"mi\">15<\/span><span class=\"p\">,<\/span><span class=\"o\">-<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span><span class=\"mi\">15<\/span><span class=\"p\">),<\/span><span class=\"n\">alpha<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.3<\/span><span class=\"p\">,<\/span> <span class=\"n\">vmin<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">vmax<\/span><span class=\"o\">=<\/span><span class=\"n\">K<\/span><span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">linspace<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span><span class=\"mi\">15<\/span><span class=\"p\">,<\/span><span class=\"mi\">200<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">XX<\/span><span class=\"p\">,<\/span><span class=\"n\">YY<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">meshgrid<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">,<\/span><span class=\"n\">x<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">6<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">))<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">savefig<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;files\/ch07\/randscore.png&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">dpi<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">bbox_inches<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;tight&#39;<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">clf<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">init<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;random&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">K<\/span><span class=\"p\">,<\/span> <span class=\"n\">random_state<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span> \n    <span class=\"c1\">#initialize the k-means clustering<\/span>\n<span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span> <span class=\"c1\">#run the k-means clustering<\/span>\n<span class=\"n\">Zx<\/span><span class=\"o\">=<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">predict<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Original labels&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">14<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;b&#39;<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># b<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;g&#39;<\/span><span class=\"p\">)<\/span>  <span class=\"c1\"># g<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">))<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Data without labels&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">14<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># b<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">y<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">)<\/span>  <span class=\"c1\"># g<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">))<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Clustering labels&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">14<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">Zx<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">Zx<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">Zx<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">Zx<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;b&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">Zx<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X<\/span><span class=\"p\">[(<\/span><span class=\"n\">Zx<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;g&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>The K-means algorithm clusters data by trying to separate samples in $n$ groups of equal variance. In other words, the K-means algorithm divides a set of N samples X into K disjoint clusters C, each described by the mean of the samples in the cluster. The means are commonly called the cluster <strong>\u201ccentroids\u201d<\/strong>.<\/p>\n<pre><code>  Shell the centroids belong to the original set of points?\n\n<\/code><\/pre>\n<p>The K-means algorithm aims to choose centroids minimizing a criterion known as the <strong>inertia<\/strong> &lt;inertia&gt; or <strong>within-cluster<\/strong> sum-of-squares:&lt;\/inertia&gt;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Inertia=$\\displaystyle\\sum_{i=0}^{n}\\min_{\\mu_j \\in C}(||x_i &#8211; \\mu_j||^2)$<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><strong>Inertia<\/strong>, or the within-cluster sum of squares criterion, can be recognized as a measure of how internally coherent clusters are.<\/p>\n<p>Several issues should be taken into account:<\/p>\n<ul>\n<li>Inertia makes the <strong>assumption<\/strong> that clusters are <strong>convex and isotropic<\/strong> (WHY?), which is not always the case. It responds poorly to elongated clusters, or manifolds with irregular shapes.<\/li>\n<li>Can the algorithm assures <strong>converging<\/strong> to the global minimum? &#8211; Given enough time, K-means will always converge.<\/li>\n<li>This algorithm requires the <strong>number of clusters to be specified<\/strong>.<\/li>\n<li>It scales well to <strong>large number of samples<\/strong> and has been used across a large range of application areas in many different fields.<\/li>\n<\/ul>\n<p>The computation is often done several times, with different initializations of the centroids. One method to help address this issue is the k-means++ initialization scheme, which has been implemented in scikit-learn (use the init=&#8217;kmeans++&#8217; parameter). This initializes the centroids to be (generally) distant from each other, leading to provably better results than random initialization.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><strong>Notes:<\/strong> Some seeds can result in poor convergence rate, or convergence to sub-optimal clusterings:<\/p>\n<p><strong>Summary:<\/strong><\/p>\n<ul>\n<li>(+) Select good seeds using a heuristic (e.g. seeds with large distance among them).<\/li>\n<li>(+) Try out multiple starting points.<\/li>\n<li>(+) Initialize with the results of another method.<\/li>\n<\/ul>\n<ul>\n<li>(-) Tends to look for spherical clusters.<\/li>\n<li>(-) Prone to local minima stabilization.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">from<\/span> <span class=\"nn\">sklearn<\/span> <span class=\"k\">import<\/span> <span class=\"n\">metrics<\/span>\n\n<span class=\"n\">clf<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">K<\/span><span class=\"p\">,<\/span> <span class=\"n\">init<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;k-means++&#39;<\/span><span class=\"p\">,<\/span>  <span class=\"n\">random_state<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> \n                     <span class=\"n\">max_iter<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_init<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span> \n                                        <span class=\"c1\">#initialize the k-means clustering<\/span>\n<span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>                              <span class=\"c1\">#run the k-means clustering<\/span>\n\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Final evaluation of the clustering:&#39;<\/span><span class=\"p\">)<\/span>\n\n<span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Inertia: <\/span><span class=\"si\">%.2f<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">%<\/span>  <span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">inertia_<\/span><span class=\"p\">)<\/span>\n\n<span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Adjusted_rand_score <\/span><span class=\"si\">%.2f<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">adjusted_rand_score<\/span><span class=\"p\">(<\/span><span class=\"n\">y<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span> \n                                                               <span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">))<\/span>\n\n<span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Homogeneity <\/span><span class=\"si\">%.2f<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">%<\/span>  <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">homogeneity_score<\/span><span class=\"p\">(<\/span><span class=\"n\">y<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span> \n                                                      <span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">))<\/span>\n\n<span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Completeness <\/span><span class=\"si\">%.2f<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">%<\/span>  <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">completeness_score<\/span><span class=\"p\">(<\/span><span class=\"n\">y<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span> \n                                                        <span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">))<\/span>\n             \n<span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;V_measure <\/span><span class=\"si\">%.2f<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">%<\/span>  <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">v_measure_score<\/span><span class=\"p\">(<\/span><span class=\"n\">y<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span> <span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">))<\/span>\n\n<span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Silhouette <\/span><span class=\"si\">%.2f<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">%<\/span>  <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">silhouette_score<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">,<\/span>  \n                                                    <span class=\"n\">metric<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;euclidean&#39;<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">clf1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">K<\/span><span class=\"p\">,<\/span>  <span class=\"n\">init<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;random&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">random_state<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> \n                      <span class=\"n\">max_iter<\/span><span class=\"o\">=<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_init<\/span><span class=\"o\">=<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span> \n                                    <span class=\"c1\">#initialize the k-means clustering<\/span>\n<span class=\"n\">clf1<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>                         <span class=\"c1\">#run the k-means clustering<\/span>\n\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Final evaluation of the clustering:&#39;<\/span><span class=\"p\">)<\/span>\n\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Inertia: <\/span><span class=\"si\">%.2f<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">clf1<\/span><span class=\"o\">.<\/span><span class=\"n\">inertia_<\/span><span class=\"p\">)<\/span>\n\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Adjusted_rand_score <\/span><span class=\"si\">%.2f<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">adjusted_rand_score<\/span><span class=\"p\">(<\/span><span class=\"n\">y<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span> \n                                                            <span class=\"n\">clf1<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">))<\/span>\n\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Homogeneity <\/span><span class=\"si\">%.2f<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">homogeneity_score<\/span><span class=\"p\">(<\/span><span class=\"n\">y<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span> \n                                                      <span class=\"n\">clf1<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">))<\/span>\n\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Completeness <\/span><span class=\"si\">%.2f<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">completeness_score<\/span><span class=\"p\">(<\/span><span class=\"n\">y<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span> \n                                                        <span class=\"n\">clf1<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">))<\/span>\n             \n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;V_measure <\/span><span class=\"si\">%.2f<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">v_measure_score<\/span><span class=\"p\">(<\/span><span class=\"n\">y<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">(),<\/span> \n                                                  <span class=\"n\">clf1<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">))<\/span>\n\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Silhouette <\/span><span class=\"si\">%.2f<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">metrics<\/span><span class=\"o\">.<\/span><span class=\"n\">silhouette_score<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">clf1<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">,<\/span> \n                                                    <span class=\"n\">metric<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;euclidean&#39;<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3 id=\"2.3.2-Spectral-clustering\">2.3.2 Spectral clustering<a class=\"anchor-link\" href=\"#2.3.2-Spectral-clustering\">&#182;<\/a><\/h3>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Our next method in this notebook will be spectral clustering.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Up to this point, we have considered clustering as finding data groups following a notion of compactness. Another way of looking at what a cluster is, is given by the connectivity (or similiarity).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><strong>Spectral clustering<\/strong> refers to a family of methods that use spectral techniques. Specifically, these techniques are related to the eigen-decomposition of an affinity or similarity matrix and attempt to solve the problem of clustering according to connectivity.<br \/>\nLet us consider an ideal similarity matrix of two clear sets.<\/p>\n<p>Let us denote the similarity matrix, S, as the matrix Sij = s(xi; xj) gives the similarity between observations xi and xj. The simplest similarity measure is the Euclidean distance.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>We expect that when two points are from different clusters, they are far away. However, it might also happen that two points from the same cluster are also far away, but still belong to the same cluster as soon as there is a sequence of points from the same cluster that form a path between them. Then, we compute an affinity matrix $A$. $A_{ij} &amp;gt;= 0$ represents a measure of the similarity between data points with indexes $i$ and $j$, hence $A$ is made of positive values and is symmetric.   An easy way to do it is by applying a k-nearest neighbour to build a graph connecting just the k closest dataset points.  Using the affinity matrix, clustering is considered as a graph-partition problem, where connected graph components are interpreted as clusters. The graph constructed by the spectral clustering must be partitioned such that edges connecting different clusters should have low weighs, and edges within the same cluster must have high values. Additionally to the affinity matrix, we need a degree matrix D so that each diagonal value is the degree of the respective graph node and all other positions are zero. Finally, we compute the unnormalized graph Laplacian ($U = D A$).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>If we assume that there are k clusters, the next step is to find the k smallest eigenvectors, without considering the trivial constant eigenvector. Each row of the matrix formed by the k smallest eigenvectors of the Laplacian matrix defines a transformation for data xi. Thus, in this transformed space, we can apply the K-means clustering in order to find the final clusters. If we do not know in advance the number of clusters k, we can look for sudden change in the sorted eigenvalues of the matrix, U and keep the smallest ones.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Let us illustrate it on some eamples with non Gaussian distribution. Scikit-learn has a library to generate  datasets with different shapes like moons, blobs, etc.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">from<\/span> <span class=\"nn\">sklearn.datasets.samples_generator<\/span> <span class=\"k\">import<\/span> <span class=\"n\">make_blobs<\/span><span class=\"p\">,<\/span><span class=\"n\">make_moons<\/span>\n\n<span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">labels_true<\/span> <span class=\"o\">=<\/span> <span class=\"n\">make_blobs<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"o\">=<\/span><span class=\"mi\">1000<\/span><span class=\"p\">,<\/span> <span class=\"n\">centers<\/span><span class=\"o\">=<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"n\">cluster_std<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"mf\">1.7<\/span><span class=\"p\">,<\/span><span class=\"mf\">1.7<\/span><span class=\"p\">,<\/span><span class=\"mf\">1.7<\/span><span class=\"p\">])<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">c<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">marker<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;o&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">)<\/span> \n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">axis<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;equal&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Compact clusters&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">14<\/span><span class=\"p\">)<\/span>\n\n<span class=\"p\">[<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">,<\/span> <span class=\"n\">ymoons<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">make_moons<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">noise<\/span><span class=\"o\">=.<\/span><span class=\"mi\">05<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">Xmoons<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">c<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">marker<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;o&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">)<\/span> \n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">axis<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;equal&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Connectivity-base clusters&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">14<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">11<\/span><span class=\"p\">,<\/span><span class=\"mi\">6<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Let us apply the Spectral clustering to the two moons toy problem.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">from<\/span> <span class=\"nn\">sklearn.preprocessing<\/span> <span class=\"k\">import<\/span> <span class=\"n\">StandardScaler<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">sklearn.neighbors<\/span> <span class=\"k\">import<\/span> <span class=\"n\">kneighbors_graph<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">sklearn.metrics<\/span> <span class=\"k\">import<\/span> <span class=\"n\">euclidean_distances<\/span>\n \n<span class=\"n\">colors<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">array<\/span><span class=\"p\">([<\/span><span class=\"n\">x<\/span> <span class=\"k\">for<\/span> <span class=\"n\">x<\/span> <span class=\"ow\">in<\/span> <span class=\"s1\">&#39;bgrcmykbgrcmykbgrcmykbgrcmyk&#39;<\/span><span class=\"p\">])<\/span>\n<span class=\"n\">colors<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">hstack<\/span><span class=\"p\">([<\/span><span class=\"n\">colors<\/span><span class=\"p\">]<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">20<\/span><span class=\"p\">)<\/span>\n \n<span class=\"c1\"># normalize dataset for easier parameter selection<\/span>\n<span class=\"n\">X<\/span> <span class=\"o\">=<\/span> <span class=\"n\">StandardScaler<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"n\">fit_transform<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">)<\/span>\n \n<span class=\"c1\"># Compute distances<\/span>\n<span class=\"n\">distances<\/span> <span class=\"o\">=<\/span> <span class=\"n\">euclidean_distances<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">)<\/span>\n    \n<span class=\"n\">spectral<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">SpectralClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> \n                                      <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;nearest_neighbors&quot;<\/span><span class=\"p\">)<\/span>\n \n<span class=\"n\">spectral<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">y_pred<\/span> <span class=\"o\">=<\/span> <span class=\"n\">spectral<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"o\">.<\/span><span class=\"n\">astype<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">int<\/span><span class=\"p\">)<\/span>\n            \n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Following, we visualize the spectral clustering results:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">Xmoons<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">c<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">marker<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;o&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">)<\/span> \n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">axis<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;equal&#39;<\/span><span class=\"p\">)<\/span>\n \n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">Xmoons<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">c<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;b&#39;<\/span><span class=\"p\">,<\/span> \n            <span class=\"n\">marker<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;o&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">)<\/span> \n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">Xmoons<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">c<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;y&#39;<\/span><span class=\"p\">,<\/span> \n            <span class=\"n\">marker<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;o&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">)<\/span> \n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">axis<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;equal&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">=<\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">11<\/span><span class=\"p\">,<\/span><span class=\"mi\">6<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">Xmoons<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"n\">colors<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">tolist<\/span><span class=\"p\">(),<\/span> \n            <span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Let us compare the result to the K-means:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">Xmoons<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">c<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">marker<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;o&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">)<\/span> \n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">axis<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;equal&#39;<\/span><span class=\"p\">)<\/span>\n \n<span class=\"c1\"># Cluster using k-means<\/span>\n<span class=\"n\">clf<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"n\">init<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;k-means++&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">y_pred<\/span><span class=\"o\">=<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">predict<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">)<\/span>\n \n<span class=\"c1\"># Visualize k-means result<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">Xmoons<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">c<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;b&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">marker<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;o&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">)<\/span> \n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">Xmoons<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">Xmoons<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">c<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;y&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">marker<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;o&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">)<\/span> \n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">axis<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;equal&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">=<\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">11<\/span><span class=\"p\">,<\/span><span class=\"mi\">6<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Note that since K-means looks for spheric clusters, it is unable to separate the two moon data, in contrast to the spectral clustering.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><strong>Observations:<\/strong><\/p>\n<ul>\n<li>In most of the cases, the clustering is performed on the <strong>graph Laplacian matrix<\/strong> ($L = D &#8211; A$), where $D$ is the <strong>degree matrix<\/strong> (a diagonal matrix where each element $d_{i,j}$ counts the number of edges the node has) and the role of the similarity matrix is now given by the <strong>affinity matrix<\/strong> ($A$).<\/li>\n<li>Because the Laplacian is related to $-A$, instead of computing the second larger eigenvector,  the second smaller eigenvector is checked.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3 id=\"2.3.3-Hierarchical-clustering\">2.3.3 Hierarchical clustering<a class=\"anchor-link\" href=\"#2.3.3-Hierarchical-clustering\">&#182;<\/a><\/h3>\n<p>Another interesting clustering technique is hierarchical clustering. Hierarchical clustering is a general family of clustering algorithms that build nested clusters by <em>merging or splitting<\/em> them successively. This hierarchy of clusters is represented as a tree (or dendrogram). The root of the tree is the unique cluster that gathers all the samples, the <em>leaves<\/em> being the clusters with only one sample. This is a nice tool, because of its interpretability. The result of the technique is a <em>tree<\/em> showing the similarity among the samples. <em>Partitioning<\/em> is computed by selecting a cut on that tree at a certain level. The tree is usually called <strong>dendrogram<\/strong>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><strong>Bottom-Up agglomerative clustering sketch of algorithm<\/strong><\/p>\n<ul>\n<li>Starts with each sample data in a separate cluster.<\/li>\n<li>Then, repeatedly joins the closest pair of clusters.<\/li>\n<li>Until there is only one cluster.<\/li>\n<\/ul>\n<p>The history of merging forms a binary tree or hierarchy.<\/p>\n<p><strong>Top-Down divisive clustering sketch of algorithm<\/strong><\/p>\n<ul>\n<li>Starting with all the data in a single cluster.<\/li>\n<li>Consider every possible way to divide the cluster into two. Choose the best division.<\/li>\n<li>Recursively operate on both sides.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>The <strong>Agglomerative Clustering<\/strong> performs a hierarchical clustering using a bottom up approach: each observation starts in its own cluster, and clusters are successively merged together.<\/p>\n<p><strong>Defining the similarity of two clusters:<\/strong><\/p>\n<p>The linkage criterion determines the metric used for the merge strategy:<\/p>\n<ul>\n<li><em>Maximum<\/em> or <em>complete<\/em> linkage minimizes the maximum distance between observations of pairs of clusters. Based on the similarity of the two least similar members, it will give tight spherical clusters.<\/li>\n<li><em>Average<\/em> linkage averages similarity between members i.e. minimizes the average of the distances between all observations of pairs of clusters.<\/li>\n<li><em>Single<\/em> linkage works on the similarity of two most similar members. It can create chain effects, such as follow the nearest neighbor.<\/li>\n<li><em>Ward<\/em> minimizes the sum of squared differences within all clusters. It is a variance-minimizing approach and in this sense is similar to the k-means objective function but tackled with an agglomerative hierarchical approach.<\/li>\n<\/ul>\n<p>AgglomerativeClustering can also <em>scale to large number<\/em> of samples when it is used jointly with a <em>connectivity matrix<\/em>, but is computationally expensive when no connectivity constraints are added between samples: it considers at each step all the possible merges.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Let us illustrate how the different linkages work with an example. Let us generate three clusters as follows:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">MAXN1<\/span> <span class=\"o\">=<\/span><span class=\"mi\">500<\/span>\n<span class=\"n\">MAXN2<\/span> <span class=\"o\">=<\/span><span class=\"mi\">400<\/span>\n<span class=\"n\">MAXN3<\/span> <span class=\"o\">=<\/span><span class=\"mi\">300<\/span>\n<span class=\"n\">X1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">concatenate<\/span> <span class=\"p\">([<\/span><span class=\"mf\">2.25<\/span><span class=\"o\">*<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">randn<\/span><span class=\"p\">(<\/span><span class=\"n\">MAXN1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">),<\/span><span class=\"mi\">4<\/span><span class=\"o\">+<\/span><span class=\"mf\">1.7<\/span><span class=\"o\">*<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">randn<\/span> <span class=\"p\">(<\/span><span class=\"n\">MAXN2<\/span> <span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">)])<\/span>\n<span class=\"n\">X1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">concatenate<\/span> <span class=\"p\">([<\/span><span class=\"n\">X1<\/span><span class=\"p\">,[<\/span><span class=\"mi\">8<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span><span class=\"o\">+<\/span><span class=\"mf\">1.9<\/span><span class=\"o\">*<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">randn<\/span><span class=\"p\">(<\/span><span class=\"n\">MAXN3<\/span> <span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">)])<\/span>\n<span class=\"n\">y1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">concatenate<\/span> <span class=\"p\">([<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">ones<\/span> <span class=\"p\">((<\/span><span class=\"n\">MAXN1<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">)),<\/span><span class=\"mi\">2<\/span><span class=\"o\">*<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">ones<\/span><span class=\"p\">((<\/span><span class=\"n\">MAXN2<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">))])<\/span>\n<span class=\"n\">y1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">concatenate<\/span> <span class=\"p\">([<\/span><span class=\"n\">y1<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"o\">*<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">ones<\/span><span class=\"p\">((<\/span><span class=\"n\">MAXN3<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">))])<\/span><span class=\"o\">.<\/span><span class=\"n\">ravel<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">y1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">int_<\/span><span class=\"p\">(<\/span><span class=\"n\">y1<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">labels_y1<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"s1\">&#39;+&#39;<\/span><span class=\"p\">,<\/span><span class=\"s1\">&#39;*&#39;<\/span><span class=\"p\">,<\/span><span class=\"s1\">&#39;o&#39;<\/span><span class=\"p\">]<\/span>\n<span class=\"n\">colors<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">,<\/span><span class=\"s1\">&#39;g&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;b&#39;<\/span><span class=\"p\">]<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Let us apply agglomerative clustering using the different linkages:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">import<\/span> <span class=\"nn\">time<\/span>\n\n<span class=\"kn\">from<\/span> <span class=\"nn\">sklearn.cluster<\/span> <span class=\"k\">import<\/span> <span class=\"n\">AgglomerativeClustering<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">linkage<\/span> <span class=\"ow\">in<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;ward&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;complete&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;average&#39;<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">clustering<\/span> <span class=\"o\">=<\/span> <span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"n\">linkage<\/span><span class=\"p\">,<\/span><span class=\"n\">n_clusters<\/span> <span class=\"o\">=<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">clustering<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X1<\/span><span class=\"p\">)<\/span>\n    \n    <span class=\"n\">x_min<\/span> <span class=\"p\">,<\/span> <span class=\"n\">x_max<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">min<\/span> <span class=\"p\">(<\/span><span class=\"n\">X1<\/span><span class=\"p\">,<\/span> <span class=\"n\">axis<\/span> <span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <span class=\"p\">,<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">max<\/span> <span class=\"p\">(<\/span><span class=\"n\">X1<\/span><span class=\"p\">,<\/span><span class=\"n\">axis<\/span> <span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">X1<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">X1<\/span> <span class=\"o\">-<\/span> <span class=\"n\">x_min<\/span> <span class=\"p\">)<\/span> <span class=\"o\">\/<\/span> <span class=\"p\">(<\/span> <span class=\"n\">x_max<\/span> <span class=\"o\">-<\/span> <span class=\"n\">x_min<\/span> <span class=\"p\">)<\/span>\n    <span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">figure<\/span> <span class=\"p\">()<\/span>\n    <span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">))<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">range<\/span> <span class=\"p\">(<\/span><span class=\"n\">X1<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">])<\/span> <span class=\"p\">:<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">text<\/span><span class=\"p\">(<\/span><span class=\"n\">X1<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">X1<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">labels_y1<\/span><span class=\"p\">[<\/span><span class=\"n\">y1<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span><span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"n\">colors<\/span><span class=\"p\">[<\/span><span class=\"n\">y1<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span><span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">])<\/span>\n    <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span> <span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">%s<\/span><span class=\"s2\"> linkage&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">linkage<\/span><span class=\"p\">,<\/span><span class=\"n\">size<\/span> <span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">tight_layout<\/span><span class=\"p\">()<\/span>\n    <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">savefig<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;files\/ch07\/<\/span><span class=\"si\">%s<\/span><span class=\"s2\">linkage.png&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">linkage<\/span><span class=\"p\">,<\/span><span class=\"n\">dpi<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">bbox_inches<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;tight&#39;<\/span><span class=\"p\">)<\/span>\n\n    \n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">show<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Agglomerative clustering has a \u201crich get richer\u201d behavior that leads to <em>uneven cluster sizes<\/em>. In this regard, complete linkage is the worst strategy, and <em>Ward<\/em> gives the most regular sizes. However, the affinity cannot be varied with Ward, thus for non Euclidean metrics, <em>average linkage<\/em> is a good alternative. Let us illustrate the performance on some other datasets with more complex distributions:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">from<\/span> <span class=\"nn\">sklearn<\/span> <span class=\"k\">import<\/span> <span class=\"n\">cluster<\/span><span class=\"p\">,<\/span> <span class=\"n\">datasets<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">sklearn.cluster<\/span> <span class=\"k\">import<\/span> <span class=\"n\">AgglomerativeClustering<\/span>\n\n<span class=\"p\">[<\/span><span class=\"n\">X1<\/span><span class=\"p\">,<\/span> <span class=\"n\">y1<\/span><span class=\"p\">]<\/span>  <span class=\"o\">=<\/span> <span class=\"n\">datasets<\/span><span class=\"o\">.<\/span><span class=\"n\">make_circles<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"o\">=<\/span><span class=\"mi\">600<\/span><span class=\"p\">,<\/span> <span class=\"n\">factor<\/span><span class=\"o\">=.<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"n\">noise<\/span><span class=\"o\">=.<\/span><span class=\"mi\">05<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">[<\/span><span class=\"n\">X2<\/span><span class=\"p\">,<\/span> <span class=\"n\">y2<\/span><span class=\"p\">]<\/span>  <span class=\"o\">=<\/span> <span class=\"n\">datasets<\/span><span class=\"o\">.<\/span><span class=\"n\">make_circles<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"o\">=<\/span><span class=\"mi\">600<\/span><span class=\"p\">,<\/span> <span class=\"n\">factor<\/span><span class=\"o\">=.<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"n\">noise<\/span><span class=\"o\">=.<\/span><span class=\"mi\">15<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">4<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">X<\/span> <span class=\"ow\">in<\/span> <span class=\"p\">[<\/span><span class=\"n\">X1<\/span><span class=\"p\">,<\/span><span class=\"n\">X2<\/span><span class=\"p\">]:<\/span>\n    <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">figure<\/span><span class=\"p\">(<\/span><span class=\"n\">figsize<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">))<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">index<\/span><span class=\"p\">,<\/span> <span class=\"n\">linkage<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">((<\/span><span class=\"s1\">&#39;average&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;complete&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;ward&#39;<\/span><span class=\"p\">)):<\/span>\n\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"n\">index<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">model<\/span> <span class=\"o\">=<\/span> <span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"n\">linkage<\/span><span class=\"p\">,<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clusters<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">c<\/span><span class=\"o\">=<\/span><span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">,<\/span> <span class=\"n\">cmap<\/span><span class=\"o\">=<\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">cm<\/span><span class=\"o\">.<\/span><span class=\"n\">nipy_spectral<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;<\/span><span class=\"si\">%s<\/span><span class=\"s1\"> linkage&#39;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">linkage<\/span><span class=\"p\">,<\/span><span class=\"n\">fontdict<\/span><span class=\"o\">=<\/span><span class=\"nb\">dict<\/span><span class=\"p\">(<\/span><span class=\"n\">verticalalignment<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;top&#39;<\/span><span class=\"p\">))<\/span>\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">axis<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;equal&#39;<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">axis<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;off&#39;<\/span><span class=\"p\">)<\/span>\n    \n    <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">show<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3 id=\"2.3.4-Adding-connectivity-constraints\">2.3.4 Adding connectivity constraints<a class=\"anchor-link\" href=\"#2.3.4-Adding-connectivity-constraints\">&#182;<\/a><\/h3>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>An interesting aspect of Agglomerative Clustering is that connectivity constraints can be added to this algorithm (only adjacent clusters can be merged together), through a connectivity matrix that defines for each sample the neighboring samples following a given structure of the data. For instance, in the swiss-roll example below, the connectivity constraints forbid the merging of points that are not adjacent on the swiss roll, and thus avoid forming clusters that extend across overlapping folds of the roll.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>These constraints are useful to <em>impose a certain local structure<\/em>, but they also make the algorithm <strong>faster<\/strong>, especially when the number of the samples is high.<br \/>\nThe connectivity constraints are imposed via a <strong>connectivity matrix<\/strong>: a scipy sparse matrix that has elements only at the intersection of a row and a column with indices of the dataset that should be connected.<\/p>\n<p>This matrix can be constructed from <em>a-priori information<\/em>: for instance, you may wish to cluster web pages by only merging pages with a <em>link pointing from one to another<\/em>.<\/p>\n<p>It can also be learned from the data, for instance using sklearn.neighbors.kneighbors_graph to restrict merging to nearest neighbors as in this example, or using sklearn.feature_extraction.image.grid_to_graph to enable only merging of neighboring pixels on an image.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>This example shows the effect of imposing a connectivity graph to capture local structure in the data. The graph is simply the graph of 20 nearest neighbors.<br \/>\nTwo consequences of imposing a connectivity can be seen. First clustering with a connectivity matrix is much faster.<br \/>\nSecond, when using a connectivity matrix, average and complete linkage are unstable and tend to create a few clusters that grow very quickly. Indeed, average and complete linkage fight this percolation behavior by considering all the distances between two clusters when merging them. The connectivity graph breaks this mechanism. This effect is more pronounced for very sparse graphs (try decreasing the number of neighbors in kneighbors_graph) and with complete linkage. In particular, having a very small number of neighbors in the graph, imposes a geometry that is close to that of single linkage, which is well known to have this percolation instability.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"p\">[<\/span><span class=\"n\">X1<\/span><span class=\"p\">,<\/span> <span class=\"n\">y1<\/span><span class=\"p\">]<\/span>  <span class=\"o\">=<\/span> <span class=\"n\">datasets<\/span><span class=\"o\">.<\/span><span class=\"n\">make_circles<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"o\">=<\/span><span class=\"mi\">600<\/span><span class=\"p\">,<\/span> <span class=\"n\">factor<\/span><span class=\"o\">=.<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"n\">noise<\/span><span class=\"o\">=.<\/span><span class=\"mi\">07<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">[<\/span><span class=\"n\">X2<\/span><span class=\"p\">,<\/span> <span class=\"n\">y2<\/span><span class=\"p\">]<\/span>  <span class=\"o\">=<\/span> <span class=\"n\">datasets<\/span><span class=\"o\">.<\/span><span class=\"n\">make_circles<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"o\">=<\/span><span class=\"mi\">600<\/span><span class=\"p\">,<\/span> <span class=\"n\">factor<\/span><span class=\"o\">=.<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"n\">noise<\/span><span class=\"o\">=.<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">X<\/span> <span class=\"ow\">in<\/span> <span class=\"p\">[<\/span><span class=\"n\">X1<\/span><span class=\"p\">,<\/span><span class=\"n\">X2<\/span><span class=\"p\">]:<\/span>\n  <span class=\"n\">knn_graph<\/span> <span class=\"o\">=<\/span> <span class=\"n\">kneighbors_graph<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">)<\/span>\n  <span class=\"k\">for<\/span> <span class=\"n\">connectivity<\/span> <span class=\"ow\">in<\/span> <span class=\"p\">(<\/span><span class=\"kc\">None<\/span><span class=\"p\">,<\/span> <span class=\"n\">knn_graph<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">figure<\/span><span class=\"p\">(<\/span><span class=\"n\">figsize<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">))<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">index<\/span><span class=\"p\">,<\/span> <span class=\"n\">linkage<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">((<\/span><span class=\"s1\">&#39;average&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;complete&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;ward&#39;<\/span><span class=\"p\">)):<\/span>\n\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"n\">index<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">model<\/span> <span class=\"o\">=<\/span> <span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"n\">linkage<\/span><span class=\"p\">,<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clusters<\/span><span class=\"p\">,<\/span> \n                                            <span class=\"n\">connectivity<\/span><span class=\"o\">=<\/span><span class=\"n\">connectivity<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">c<\/span><span class=\"o\">=<\/span><span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"p\">,<\/span> <span class=\"n\">cmap<\/span><span class=\"o\">=<\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">cm<\/span><span class=\"o\">.<\/span><span class=\"n\">nipy_spectral<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;<\/span><span class=\"si\">%s<\/span><span class=\"s1\"> linkage&#39;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">linkage<\/span><span class=\"p\">,<\/span><span class=\"n\">fontdict<\/span><span class=\"o\">=<\/span><span class=\"nb\">dict<\/span><span class=\"p\">(<\/span><span class=\"n\">verticalalignment<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;top&#39;<\/span><span class=\"p\">))<\/span>\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">axis<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;equal&#39;<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">axis<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;off&#39;<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">connectivity<\/span> <span class=\"ow\">is<\/span> <span class=\"kc\">None<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">suptitle<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Without connectivity&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">else<\/span><span class=\"p\">:<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">suptitle<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;With connectivity&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">)<\/span>\n    <span class=\"c1\"># plt.suptitle(&#39;Without connectivity: %r&#39; % connectivity is None, size=20)<\/span>\n    <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">show<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3 id=\"2.3.5-Comparing-different-clustering-algorithms-on-toy-datasets\">2.3.5 Comparing different clustering algorithms on toy datasets<a class=\"anchor-link\" href=\"#2.3.5-Comparing-different-clustering-algorithms-on-toy-datasets\">&#182;<\/a><\/h3>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Following, we compare the diffeerent clustering algorithms, discussed so far.<br \/>\nLet us generate 4 cases of diffeerent samples configurations:<\/p>\n<ul>\n<li>a) of separated circular groups of data,<\/li>\n<li>b) uniform data distribution,<\/li>\n<li>c) embedded circles and<\/li>\n<li>d) non-flat configurations of data.<\/li>\n<\/ul>\n<p>To this purpose, scikit-learn has predefined functions like: datasets.make_blobs(), datasets.make_circles(), datasets.make_moons(), etc.<br \/>\nThe code provided by scikit-learn for generating the testing samples<br \/>\ndistributions is as follows:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">from<\/span> <span class=\"nn\">sklearn<\/span> <span class=\"k\">import<\/span> <span class=\"n\">cluster<\/span><span class=\"p\">,<\/span> <span class=\"n\">datasets<\/span>\n\n<span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">seed<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\n\n<span class=\"c1\"># Generate datasets. <\/span>\n<span class=\"n\">n_samples<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1500<\/span>\n<span class=\"n\">no_structure<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">rand<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">),<\/span> <span class=\"kc\">None<\/span>\n<span class=\"n\">blobs<\/span> <span class=\"o\">=<\/span> <span class=\"n\">datasets<\/span><span class=\"o\">.<\/span><span class=\"n\">make_blobs<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"o\">=<\/span><span class=\"n\">n_samples<\/span><span class=\"p\">,<\/span> <span class=\"n\">random_state<\/span><span class=\"o\">=<\/span><span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"n\">centers<\/span><span class=\"o\">=<\/span><span class=\"mi\">4<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">noisy_circles<\/span> <span class=\"o\">=<\/span> <span class=\"n\">datasets<\/span><span class=\"o\">.<\/span><span class=\"n\">make_circles<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"o\">=<\/span><span class=\"n\">n_samples<\/span><span class=\"p\">,<\/span> <span class=\"n\">factor<\/span><span class=\"o\">=.<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span>\n                                      <span class=\"n\">noise<\/span><span class=\"o\">=.<\/span><span class=\"mi\">05<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">noisy_moons<\/span> <span class=\"o\">=<\/span> <span class=\"n\">datasets<\/span><span class=\"o\">.<\/span><span class=\"n\">make_moons<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"o\">=<\/span><span class=\"n\">n_samples<\/span><span class=\"p\">,<\/span> <span class=\"n\">noise<\/span><span class=\"o\">=.<\/span><span class=\"mi\">05<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">colors<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">array<\/span><span class=\"p\">([<\/span><span class=\"n\">x<\/span> <span class=\"k\">for<\/span> <span class=\"n\">x<\/span> <span class=\"ow\">in<\/span> <span class=\"s1\">&#39;cmykbgrcmykbgrcmykbgrcmykbgr&#39;<\/span><span class=\"p\">])<\/span>\n<span class=\"n\">colors<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">hstack<\/span><span class=\"p\">([<\/span><span class=\"n\">colors<\/span><span class=\"p\">]<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">20<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">uniform<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">rand<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">),<\/span> <span class=\"kc\">None<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">figure<\/span><span class=\"p\">(<\/span><span class=\"n\">figsize<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplots_adjust<\/span><span class=\"p\">(<\/span><span class=\"n\">left<\/span><span class=\"o\">=.<\/span><span class=\"mi\">001<\/span><span class=\"p\">,<\/span> <span class=\"n\">right<\/span><span class=\"o\">=.<\/span><span class=\"mi\">999<\/span><span class=\"p\">,<\/span> <span class=\"n\">bottom<\/span><span class=\"o\">=.<\/span><span class=\"mi\">01<\/span><span class=\"p\">,<\/span> <span class=\"n\">top<\/span><span class=\"o\">=.<\/span><span class=\"mi\">99<\/span><span class=\"p\">,<\/span> <span class=\"n\">wspace<\/span><span class=\"o\">=.<\/span><span class=\"mi\">05<\/span><span class=\"p\">,<\/span> <span class=\"n\">hspace<\/span><span class=\"o\">=.<\/span><span class=\"mi\">01<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plot_num<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clrs<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">([<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">4<\/span><span class=\"p\">]):<\/span>\n    <span class=\"n\">dataset<\/span><span class=\"o\">=<\/span><span class=\"n\">uniform<\/span>\n    <span class=\"n\">i_dataset<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span>\n    <span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span> <span class=\"o\">=<\/span> <span class=\"n\">dataset<\/span>\n    <span class=\"n\">X<\/span> <span class=\"o\">=<\/span> <span class=\"n\">StandardScaler<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"n\">fit_transform<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">connectivity<\/span> <span class=\"o\">=<\/span> <span class=\"n\">kneighbors_graph<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_neighbors<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">connectivity<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">0.5<\/span> <span class=\"o\">*<\/span> <span class=\"p\">(<\/span><span class=\"n\">connectivity<\/span> <span class=\"o\">+<\/span> <span class=\"n\">connectivity<\/span><span class=\"o\">.<\/span><span class=\"n\">T<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">distances<\/span> <span class=\"o\">=<\/span> <span class=\"n\">euclidean_distances<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">kmeans<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clrs<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">spectral_clustering<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">SpectralClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clrs<\/span><span class=\"p\">,<\/span> \n                                          <span class=\"c1\">#eigen_solver=&#39;arpack&#39;,<\/span>\n                                          <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;nearest_neighbors&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">average_agglomerative<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;average&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">connectivity<\/span><span class=\"o\">=<\/span><span class=\"n\">connectivity<\/span><span class=\"p\">,<\/span>\n                            <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;cityblock&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clrs<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">ward_agglomerative<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clrs<\/span><span class=\"p\">,<\/span>\n                    <span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;ward&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">connectivity<\/span><span class=\"o\">=<\/span><span class=\"n\">connectivity<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">for<\/span> <span class=\"n\">method<\/span><span class=\"p\">,<\/span> <span class=\"n\">algr<\/span> <span class=\"ow\">in<\/span> <span class=\"p\">[(<\/span><span class=\"s1\">&#39;KMeans&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">kmeans<\/span><span class=\"p\">),(<\/span><span class=\"s1\">&#39;Spectral Clst.&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">spectral_clustering<\/span><span class=\"p\">),<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;Average Aggl. Clst.&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">average_agglomerative<\/span><span class=\"p\">),<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;Ward Aggl. Clst.&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">ward_agglomerative<\/span><span class=\"p\">)]:<\/span>\n        <span class=\"n\">algr<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">y_pred<\/span> <span class=\"o\">=<\/span> <span class=\"n\">algr<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"o\">.<\/span><span class=\"n\">astype<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">int<\/span><span class=\"p\">)<\/span>\n        \n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"n\">plot_num<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">i<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"n\">method<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">15<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"n\">colors<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">tolist<\/span><span class=\"p\">(),<\/span> <span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n            \n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xlim<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">ylim<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(())<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">yticks<\/span><span class=\"p\">(())<\/span>\n        <span class=\"n\">plot_num<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">savefig<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;files\/ch07\/uniform.png&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">dpi<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">bbox_inches<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;tight&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">show<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">spheres<\/span> <span class=\"o\">=<\/span> <span class=\"n\">datasets<\/span><span class=\"o\">.<\/span><span class=\"n\">make_blobs<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"o\">=<\/span><span class=\"n\">n_samples<\/span><span class=\"p\">,<\/span> <span class=\"n\">random_state<\/span><span class=\"o\">=<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"n\">centers<\/span><span class=\"o\">=<\/span><span class=\"mi\">4<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">figure<\/span><span class=\"p\">(<\/span><span class=\"n\">figsize<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplots_adjust<\/span><span class=\"p\">(<\/span><span class=\"n\">left<\/span><span class=\"o\">=.<\/span><span class=\"mi\">001<\/span><span class=\"p\">,<\/span> <span class=\"n\">right<\/span><span class=\"o\">=.<\/span><span class=\"mi\">999<\/span><span class=\"p\">,<\/span> <span class=\"n\">bottom<\/span><span class=\"o\">=.<\/span><span class=\"mi\">01<\/span><span class=\"p\">,<\/span> <span class=\"n\">top<\/span><span class=\"o\">=.<\/span><span class=\"mi\">99<\/span><span class=\"p\">,<\/span> <span class=\"n\">wspace<\/span><span class=\"o\">=.<\/span><span class=\"mi\">05<\/span><span class=\"p\">,<\/span> <span class=\"n\">hspace<\/span><span class=\"o\">=.<\/span><span class=\"mi\">01<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plot_num<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clrs<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">([<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">]):<\/span>\n    <span class=\"n\">dataset<\/span><span class=\"o\">=<\/span><span class=\"n\">spheres<\/span>\n    <span class=\"n\">i_dataset<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span>\n    <span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span> <span class=\"o\">=<\/span> <span class=\"n\">dataset<\/span>\n    <span class=\"n\">X<\/span> <span class=\"o\">=<\/span> <span class=\"n\">StandardScaler<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"n\">fit_transform<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">connectivity<\/span> <span class=\"o\">=<\/span> <span class=\"n\">kneighbors_graph<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_neighbors<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">connectivity<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">0.5<\/span> <span class=\"o\">*<\/span> <span class=\"p\">(<\/span><span class=\"n\">connectivity<\/span> <span class=\"o\">+<\/span> <span class=\"n\">connectivity<\/span><span class=\"o\">.<\/span><span class=\"n\">T<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">distances<\/span> <span class=\"o\">=<\/span> <span class=\"n\">euclidean_distances<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">kmeans<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clrs<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">spectral_clustering<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">SpectralClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clrs<\/span><span class=\"p\">,<\/span> \n                                          <span class=\"c1\">#eigen_solver=&#39;arpack&#39;,<\/span>\n                                          <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;nearest_neighbors&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">average_agglomerative<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;average&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">connectivity<\/span><span class=\"o\">=<\/span><span class=\"n\">connectivity<\/span><span class=\"p\">,<\/span>\n                            <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;cityblock&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clrs<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">ward_agglomerative<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clrs<\/span><span class=\"p\">,<\/span>\n                    <span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;ward&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">connectivity<\/span><span class=\"o\">=<\/span><span class=\"n\">connectivity<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">for<\/span> <span class=\"n\">method<\/span><span class=\"p\">,<\/span> <span class=\"n\">algr<\/span> <span class=\"ow\">in<\/span> <span class=\"p\">[(<\/span><span class=\"s1\">&#39;KMeans&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">kmeans<\/span><span class=\"p\">),(<\/span><span class=\"s1\">&#39;Spectral Clst.&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">spectral_clustering<\/span><span class=\"p\">),<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;Average Aggl. Clst.&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">average_agglomerative<\/span><span class=\"p\">),<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;Ward Aggl. Clst.&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">ward_agglomerative<\/span><span class=\"p\">)]:<\/span>\n        <span class=\"n\">algr<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">y_pred<\/span> <span class=\"o\">=<\/span> <span class=\"n\">algr<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"o\">.<\/span><span class=\"n\">astype<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">int<\/span><span class=\"p\">)<\/span>\n        \n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"n\">plot_num<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">i<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"n\">method<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">15<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"n\">colors<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">tolist<\/span><span class=\"p\">(),<\/span> <span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n            \n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xlim<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">ylim<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(())<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">yticks<\/span><span class=\"p\">(())<\/span>\n        <span class=\"n\">plot_num<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">savefig<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;files\/ch07\/blobs.png&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">dpi<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">bbox_inches<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;tight&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">show<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">moons<\/span> <span class=\"o\">=<\/span> <span class=\"n\">datasets<\/span><span class=\"o\">.<\/span><span class=\"n\">make_moons<\/span><span class=\"p\">(<\/span><span class=\"n\">n_samples<\/span><span class=\"o\">=<\/span><span class=\"n\">n_samples<\/span><span class=\"p\">,<\/span> <span class=\"n\">noise<\/span><span class=\"o\">=.<\/span><span class=\"mi\">08<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">figure<\/span><span class=\"p\">(<\/span><span class=\"n\">figsize<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplots_adjust<\/span><span class=\"p\">(<\/span><span class=\"n\">left<\/span><span class=\"o\">=.<\/span><span class=\"mi\">001<\/span><span class=\"p\">,<\/span> <span class=\"n\">right<\/span><span class=\"o\">=.<\/span><span class=\"mi\">999<\/span><span class=\"p\">,<\/span> <span class=\"n\">bottom<\/span><span class=\"o\">=.<\/span><span class=\"mi\">01<\/span><span class=\"p\">,<\/span> <span class=\"n\">top<\/span><span class=\"o\">=.<\/span><span class=\"mi\">99<\/span><span class=\"p\">,<\/span> <span class=\"n\">wspace<\/span><span class=\"o\">=.<\/span><span class=\"mi\">05<\/span><span class=\"p\">,<\/span> <span class=\"n\">hspace<\/span><span class=\"o\">=.<\/span><span class=\"mi\">01<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plot_num<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clrs<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">([<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">4<\/span><span class=\"p\">]):<\/span>\n    <span class=\"n\">dataset<\/span><span class=\"o\">=<\/span><span class=\"n\">moons<\/span>\n    <span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span> <span class=\"o\">=<\/span> <span class=\"n\">dataset<\/span>\n    <span class=\"n\">X<\/span> <span class=\"o\">=<\/span> <span class=\"n\">StandardScaler<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"n\">fit_transform<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">connectivity<\/span> <span class=\"o\">=<\/span> <span class=\"n\">kneighbors_graph<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_neighbors<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">connectivity<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">0.5<\/span> <span class=\"o\">*<\/span> <span class=\"p\">(<\/span><span class=\"n\">connectivity<\/span> <span class=\"o\">+<\/span> <span class=\"n\">connectivity<\/span><span class=\"o\">.<\/span><span class=\"n\">T<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">distances<\/span> <span class=\"o\">=<\/span> <span class=\"n\">euclidean_distances<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">kmeans<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clrs<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">spectral_clustering<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">SpectralClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clrs<\/span><span class=\"p\">,<\/span> <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;nearest_neighbors&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">average_agglomerative<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;average&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">connectivity<\/span><span class=\"o\">=<\/span><span class=\"n\">connectivity<\/span><span class=\"p\">,<\/span>\n                            <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;cityblock&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clrs<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">ward_agglomerative<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"n\">n_clrs<\/span><span class=\"p\">,<\/span>\n                    <span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;ward&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">connectivity<\/span><span class=\"o\">=<\/span><span class=\"n\">connectivity<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">for<\/span> <span class=\"n\">method<\/span><span class=\"p\">,<\/span> <span class=\"n\">algr<\/span> <span class=\"ow\">in<\/span> <span class=\"p\">[(<\/span><span class=\"s1\">&#39;KMeans&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">kmeans<\/span><span class=\"p\">),(<\/span><span class=\"s1\">&#39;Spectral Clst.&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">spectral_clustering<\/span><span class=\"p\">),<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;Average Aggl. Clst.&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">average_agglomerative<\/span><span class=\"p\">),<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;Ward Aggl. Clst.&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">ward_agglomerative<\/span><span class=\"p\">)]:<\/span>\n        <span class=\"n\">algr<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">y_pred<\/span> <span class=\"o\">=<\/span> <span class=\"n\">algr<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"o\">.<\/span><span class=\"n\">astype<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">int<\/span><span class=\"p\">)<\/span>\n        \n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"n\">plot_num<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">i<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"n\">method<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">15<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"n\">colors<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">tolist<\/span><span class=\"p\">(),<\/span> <span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n            \n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xlim<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">ylim<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(())<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">yticks<\/span><span class=\"p\">(())<\/span>\n        <span class=\"n\">plot_num<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">savefig<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;files\/ch07\/moons.png&quot;<\/span> <span class=\"p\">,<\/span> <span class=\"n\">bbox_inches<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;tight&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">show<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>The code provided by scikit-learn for comparing the different clustering techniques when  $k=4$  is as follows:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">figure<\/span><span class=\"p\">(<\/span><span class=\"n\">figsize<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"mi\">11<\/span><span class=\"p\">,<\/span> <span class=\"mf\">9.5<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplots_adjust<\/span><span class=\"p\">(<\/span><span class=\"n\">left<\/span><span class=\"o\">=.<\/span><span class=\"mi\">001<\/span><span class=\"p\">,<\/span> <span class=\"n\">right<\/span><span class=\"o\">=.<\/span><span class=\"mi\">999<\/span><span class=\"p\">,<\/span> <span class=\"n\">bottom<\/span><span class=\"o\">=.<\/span><span class=\"mi\">001<\/span><span class=\"p\">,<\/span> <span class=\"n\">top<\/span><span class=\"o\">=.<\/span><span class=\"mi\">96<\/span><span class=\"p\">,<\/span> <span class=\"n\">wspace<\/span><span class=\"o\">=.<\/span><span class=\"mi\">05<\/span><span class=\"p\">,<\/span> <span class=\"n\">hspace<\/span><span class=\"o\">=.<\/span><span class=\"mi\">01<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plot_num<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">i_dataset<\/span><span class=\"p\">,<\/span> <span class=\"n\">dataset<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">([<\/span><span class=\"n\">blobs<\/span><span class=\"p\">,<\/span>\n                                     <span class=\"n\">no_structure<\/span><span class=\"p\">,<\/span> <span class=\"n\">noisy_circles<\/span><span class=\"p\">,<\/span> <span class=\"n\">noisy_moons<\/span><span class=\"p\">]):<\/span>\n    <span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span> <span class=\"o\">=<\/span> <span class=\"n\">dataset<\/span>\n    <span class=\"n\">X<\/span> <span class=\"o\">=<\/span> <span class=\"n\">StandardScaler<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"n\">fit_transform<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">connectivity<\/span> <span class=\"o\">=<\/span> <span class=\"n\">kneighbors_graph<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_neighbors<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">connectivity<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">0.5<\/span> <span class=\"o\">*<\/span> <span class=\"p\">(<\/span><span class=\"n\">connectivity<\/span> <span class=\"o\">+<\/span> <span class=\"n\">connectivity<\/span><span class=\"o\">.<\/span><span class=\"n\">T<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">distances<\/span> <span class=\"o\">=<\/span> <span class=\"n\">euclidean_distances<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">means<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">4<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">spectral<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">SpectralClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"n\">eigen_solver<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;arpack&#39;<\/span><span class=\"p\">,<\/span>\n                                          <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;nearest_neighbors&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">average_linkage<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;average&quot;<\/span><span class=\"p\">,<\/span>\n                            <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;cityblock&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span>\n                            <span class=\"n\">connectivity<\/span><span class=\"o\">=<\/span><span class=\"n\">connectivity<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">ward<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span>\n                    <span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;ward&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">connectivity<\/span><span class=\"o\">=<\/span><span class=\"n\">connectivity<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">for<\/span> <span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">algorithm<\/span> <span class=\"ow\">in<\/span> <span class=\"p\">[(<\/span><span class=\"s1\">&#39;KMeans&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">means<\/span><span class=\"p\">),(<\/span><span class=\"s1\">&#39;SpectrClust&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">spectral<\/span><span class=\"p\">),<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;AgglomClust (average)&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">average_linkage<\/span><span class=\"p\">),<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;AgglomClust (ward)&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">ward<\/span><span class=\"p\">)]:<\/span>\n        <span class=\"n\">algorithm<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"nb\">hasattr<\/span><span class=\"p\">(<\/span><span class=\"n\">algorithm<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;labels_&#39;<\/span><span class=\"p\">):<\/span>\n            <span class=\"n\">y_pred<\/span> <span class=\"o\">=<\/span> <span class=\"n\">algorithm<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"o\">.<\/span><span class=\"n\">astype<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">int<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">y_pred<\/span> <span class=\"o\">=<\/span> <span class=\"n\">algorithm<\/span><span class=\"o\">.<\/span><span class=\"n\">predict<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"n\">plot_num<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">i_dataset<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">18<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"n\">colors<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">tolist<\/span><span class=\"p\">(),<\/span> <span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n            \n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xlim<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">ylim<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(())<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">yticks<\/span><span class=\"p\">(())<\/span>\n        <span class=\"n\">plot_num<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">show<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>The code provided by scikit-learn for comparing the different clustering techniques when $k=2$ is as follows:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">figure<\/span><span class=\"p\">(<\/span><span class=\"n\">figsize<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"mi\">11<\/span><span class=\"p\">,<\/span> <span class=\"mf\">9.5<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplots_adjust<\/span><span class=\"p\">(<\/span><span class=\"n\">left<\/span><span class=\"o\">=.<\/span><span class=\"mi\">001<\/span><span class=\"p\">,<\/span> <span class=\"n\">right<\/span><span class=\"o\">=.<\/span><span class=\"mi\">999<\/span><span class=\"p\">,<\/span> <span class=\"n\">bottom<\/span><span class=\"o\">=.<\/span><span class=\"mi\">001<\/span><span class=\"p\">,<\/span> <span class=\"n\">top<\/span><span class=\"o\">=.<\/span><span class=\"mi\">96<\/span><span class=\"p\">,<\/span>  <span class=\"n\">wspace<\/span><span class=\"o\">=.<\/span><span class=\"mi\">05<\/span><span class=\"p\">,<\/span> <span class=\"n\">hspace<\/span><span class=\"o\">=.<\/span><span class=\"mi\">01<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plot_num<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n<span class=\"k\">for<\/span> <span class=\"n\">i_dataset<\/span><span class=\"p\">,<\/span> <span class=\"n\">dataset<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">([<\/span><span class=\"n\">blobs<\/span><span class=\"p\">,<\/span> <span class=\"n\">no_structure<\/span><span class=\"p\">,<\/span> <span class=\"n\">noisy_circles<\/span><span class=\"p\">,<\/span> \n                                     <span class=\"n\">noisy_moons<\/span><span class=\"p\">]):<\/span>\n    <span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span> <span class=\"o\">=<\/span> <span class=\"n\">dataset<\/span>\n    <span class=\"n\">X<\/span> <span class=\"o\">=<\/span> <span class=\"n\">StandardScaler<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"n\">fit_transform<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">connectivity<\/span> <span class=\"o\">=<\/span> <span class=\"n\">kneighbors_graph<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_neighbors<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">connectivity<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">0.5<\/span> <span class=\"o\">*<\/span> <span class=\"p\">(<\/span><span class=\"n\">connectivity<\/span> <span class=\"o\">+<\/span> <span class=\"n\">connectivity<\/span><span class=\"o\">.<\/span><span class=\"n\">T<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">distances<\/span> <span class=\"o\">=<\/span> <span class=\"n\">euclidean_distances<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">means<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">spectral<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">SpectralClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"n\">eigen_solver<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;arpack&#39;<\/span><span class=\"p\">,<\/span>\n                            <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;nearest_neighbors&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">average_linkage<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;average&quot;<\/span><span class=\"p\">,<\/span> \n                            <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;cityblock&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> \n                            <span class=\"n\">connectivity<\/span><span class=\"o\">=<\/span><span class=\"n\">connectivity<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">complete_linkage<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;complete&quot;<\/span><span class=\"p\">,<\/span> \n                            <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;cityblock&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> \n                            <span class=\"n\">connectivity<\/span><span class=\"o\">=<\/span><span class=\"n\">connectivity<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">ward_linkage<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">AgglomerativeClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span>\n                            <span class=\"n\">linkage<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;ward&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">connectivity<\/span><span class=\"o\">=<\/span><span class=\"n\">connectivity<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">for<\/span> <span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">algorithm<\/span> <span class=\"ow\">in<\/span> <span class=\"p\">[<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;KMeans&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">means<\/span><span class=\"p\">),<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;AgglomClust (average)&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">average_linkage<\/span><span class=\"p\">),<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;AgglomClust (average)&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">complete_linkage<\/span><span class=\"p\">),<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;AgglomClust (ward)&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">ward_linkage<\/span><span class=\"p\">),<\/span>\n                            <span class=\"p\">(<\/span><span class=\"s1\">&#39;SpectrClust&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">spectral<\/span><span class=\"p\">)<\/span>\n                           <span class=\"p\">]:<\/span>\n        <span class=\"n\">algorithm<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"nb\">hasattr<\/span><span class=\"p\">(<\/span><span class=\"n\">algorithm<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;labels_&#39;<\/span><span class=\"p\">):<\/span>\n            <span class=\"n\">y_pred<\/span> <span class=\"o\">=<\/span> <span class=\"n\">algorithm<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"o\">.<\/span><span class=\"n\">astype<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">int<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">y_pred<\/span> <span class=\"o\">=<\/span> <span class=\"n\">algorithm<\/span><span class=\"o\">.<\/span><span class=\"n\">predict<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">)<\/span>\n\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">subplot<\/span><span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"n\">plot_num<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">scatter<\/span><span class=\"p\">(<\/span><span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">X<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"n\">colors<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">tolist<\/span><span class=\"p\">(),<\/span> <span class=\"n\">s<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xlim<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">ylim<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(())<\/span>\n        <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">yticks<\/span><span class=\"p\">(())<\/span>\n        <span class=\"n\">plot_num<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">show<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>We applied the discussed clustering techniques, namely: K-means, agglomerative clustering with average linkage, agglomerative clustering with complete linkage, agglomerative clustering with Ward linkage and spectral clustering.  Connectivity is applied in the algorithms where it is applicable. Regarding the simple cases of separated clusters of data, all clustering algorithms perform well, as expected. Regarding uniform distribution of data, K-means, Ward agglomerative clustering and spectral clustering tend to obtain even and compact clusters, while complete linkage and average linkage agglomerative clusterings try to agglomerate as much as possible close points following the rule: &#8220;rich get richer&#8221;. This results in a second cluster of a small set of data. Regarding the embedded structures as in the case of the circles (the third row), K-means and Ward linkage agglomerative clustering try to obtain compact clusters and thus cannot separate the circles. Similar effect is observed with the moons example (the fourth row). Another fact worthful to emphasize from the illustrating example is the importance of knowing the number of clusters looked for, in the case of K-means, ward-linkage agglomerative clustering and spectral clustering, since the later also employs the K-means method. If k is not known, the average-linkage or complete-linkage agglomerative clustering is recommendable with the risk that it will not assure balanced clusters as final result.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h1 id=\"3.-CASE-STUDY:-EUROSTAT-data-analysis\">3. CASE STUDY: EUROSTAT data analysis<a class=\"anchor-link\" href=\"#3.-CASE-STUDY:-EUROSTAT-data-analysis\">&#182;<\/a><\/h1>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Eurostat is the home of the <a href=\"http:\/\/ec.europa.eu\/eurostat\">European Commission data<\/a>. Eurostat\u2019s main role is to process and publish comparable statistical information at European level. Data in Eurostat is provided by each member state. Eurostat&#8217;s re-use policy is free re-use of its data, both for non-commercial and commercial purposes (with some minor exceptions).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2 id=\"Applying-clustering-to-analyze-countries-according-to-their-education-resourses\">Applying clustering to analyze countries according to their education resourses<a class=\"anchor-link\" href=\"#Applying-clustering-to-analyze-countries-according-to-their-education-resourses\">&#182;<\/a><\/h2>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>In order to illustrate the clustering on a real dataset, we will analyze the indicators on education finance data among the European member states, provided by the Eurostat data bank2. The data is organized by year (TIME): [2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011] and country (GEO): [&#8216;Albania&#8217;, &#8216;Austria&#8217;, &#8216;Belgium&#8217;, &#8216;Bulgaria&#8217;, &#8216;Croatia&#8217;, &#8216;Cyprus&#8217;, &#8216;Czech Republic&#8217;, &#8216;Denmark&#8217;, &#8216;Estonia&#8217;, &#8216;Euro area (13 countries)&#8217;, &#8216;Euro area (15 countries)&#8217;, &#8216;European Union (25 countries)&#8217;, &#8216;European Union (27 countries)&#8217;, &#8216;Finland&#8217;, &#8216;Former Yugoslav Republic of Macedonia, the&#8217;, &#8216;France&#8217;, &#8216;Germany (until 1990 former territory of the FRG)&#8217;, &#8216;Greece&#8217;, &#8216;Hungary&#8217;, &#8216;Iceland&#8217;, &#8216;Ireland&#8217;, &#8216;Italy&#8217;, &#8216;Japan&#8217;, &#8216;Latvia&#8217;, &#8216;Liechtenstein&#8217;, &#8216;Lithuania&#8217;, &#8216;Luxembourg&#8217;, &#8216;Malta&#8217;, &#8216;Netherlands&#8217;, &#8216;Norway&#8217;, &#8216;Poland&#8217;, &#8216;Portugal&#8217;, &#8216;Romania&#8217;, &#8216;Slovakia&#8217;, &#8216;Slovenia&#8217;, &#8216;Spain&#8217;, &#8216;Sweden&#8217;, &#8216;Switzerland&#8217;, &#8216;Turkey&#8217;, &#8216;United Kingdom&#8217;, &#8216;United States&#8217;]. Twelve indicators (INDIC ED) on education finance with their values (Value) are given like:<\/p>\n<ul>\n<li>1) Expenditure on educational institutions from private sources as % of Gross Domestic Product (GDP), for all levels of education combined;<\/li>\n<li>2) Expenditure on educational institutions from public sources as \\% of GDP, for all levels of government combined,<\/li>\n<li>3) Expenditure on educational institutions from public sources as % of total public expenditure, for all levels of education combined,<\/li>\n<li>4) Public subsidies to the private sector as \\% of GDP, for all levels of education combined,<\/li>\n<li>5) Public subsidies to the private sector as \\% of total public expenditure, for all levels of education combined, etc. We can store in a table the 12 indicators for a given year (e.g. 2010).<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Let us start having a look at the data.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"c1\">#Read and check the dataset downloaded from the EuroStat<\/span>\n\n<span class=\"kn\">import<\/span> <span class=\"nn\">pandas<\/span> <span class=\"k\">as<\/span> <span class=\"nn\">pd<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">numpy<\/span> <span class=\"k\">as<\/span> <span class=\"nn\">np<\/span>\n\n<span class=\"kn\">from<\/span> <span class=\"nn\">sklearn.preprocessing<\/span> <span class=\"k\">import<\/span> <span class=\"n\">StandardScaler<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">sklearn<\/span> <span class=\"k\">import<\/span> <span class=\"n\">cluster<\/span>\n\n<span class=\"n\">edu<\/span><span class=\"o\">=<\/span><span class=\"n\">pd<\/span><span class=\"o\">.<\/span><span class=\"n\">read_csv<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;.\/files\/ch07\/educ_figdp_1_Data.csv&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">na_values<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;:&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">edu<\/span><span class=\"o\">.<\/span><span class=\"n\">head<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">edu<\/span><span class=\"o\">.<\/span><span class=\"n\">tail<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Data in CSV and databases are often organized in what is called <strong>stacked<\/strong> or <strong>record<\/strong> formats. In our case for each year (<code>TIME<\/code>) and country (<code>GEO<\/code>) of the EU as well as some reference countries such as Japan and United States, we have twelve indicators (<code>INDIC_ED<\/code>) on education finance with their values (<code>Value<\/code>). Let us reshape the table into a feature vector style data set.<\/p>\n<p>To the process of reshaping stacked data into a table is sometimes called <strong>pivoting<\/strong>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"c1\">#Pivot table in order to get a nice feature vector representation with dual indexing by TIME and GEO <\/span>\n<span class=\"n\">pivedu<\/span><span class=\"o\">=<\/span><span class=\"n\">pd<\/span><span class=\"o\">.<\/span><span class=\"n\">pivot_table<\/span><span class=\"p\">(<\/span><span class=\"n\">edu<\/span><span class=\"p\">,<\/span> <span class=\"n\">values<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;Value&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">index<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"s1\">&#39;TIME&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;GEO&#39;<\/span><span class=\"p\">],<\/span> <span class=\"n\">columns<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"s1\">&#39;INDIC_ED&#39;<\/span><span class=\"p\">])<\/span>\n<span class=\"n\">pivedu<\/span><span class=\"o\">.<\/span><span class=\"n\">head<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Let us check the two indices:<\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;<\/span><span class=\"se\">\\n<\/span><span class=\"s1\">Primary index (TIME): <\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">(<\/span><span class=\"n\">pivedu<\/span><span class=\"o\">.<\/span><span class=\"n\">index<\/span><span class=\"o\">.<\/span><span class=\"n\">levels<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">tolist<\/span><span class=\"p\">()))<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;<\/span><span class=\"se\">\\n<\/span><span class=\"s1\">Secondary index (GEO): <\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">(<\/span><span class=\"n\">pivedu<\/span><span class=\"o\">.<\/span><span class=\"n\">index<\/span><span class=\"o\">.<\/span><span class=\"n\">levels<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">tolist<\/span><span class=\"p\">()))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Observe that we have ten years information on these indicators, and as expected we have all members of the European Union with some aggregates and control\/reference countries. For the sake of simplicity, let us focus on values on year 2010.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"c1\">#Extract 2010 set of values<\/span>\n<span class=\"n\">edu2010<\/span><span class=\"o\">=<\/span><span class=\"n\">pivedu<\/span><span class=\"o\">.<\/span><span class=\"n\">ix<\/span><span class=\"p\">[<\/span><span class=\"mi\">2010<\/span><span class=\"p\">]<\/span>\n<span class=\"n\">edu2010<\/span><span class=\"o\">.<\/span><span class=\"n\">head<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Let us clean and store the names of the features and the countries.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"c1\">#Store column names and clear them for better handling. Do the same with countries<\/span>\n<span class=\"n\">edu2010<\/span> <span class=\"o\">=<\/span> <span class=\"n\">edu2010<\/span><span class=\"o\">.<\/span><span class=\"n\">rename<\/span><span class=\"p\">(<\/span><span class=\"n\">index<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"s1\">&#39;Euro area (13 countries)&#39;<\/span><span class=\"p\">:<\/span> <span class=\"s1\">&#39;EU13&#39;<\/span><span class=\"p\">,<\/span>\n                                <span class=\"s1\">&#39;Euro area (15 countries)&#39;<\/span><span class=\"p\">:<\/span> <span class=\"s1\">&#39;EU15&#39;<\/span><span class=\"p\">,<\/span>\n                                <span class=\"s1\">&#39;European Union (25 countries)&#39;<\/span><span class=\"p\">:<\/span> <span class=\"s1\">&#39;EU25&#39;<\/span><span class=\"p\">,<\/span>\n                                <span class=\"s1\">&#39;European Union (27 countries)&#39;<\/span><span class=\"p\">:<\/span> <span class=\"s1\">&#39;EU27&#39;<\/span><span class=\"p\">,<\/span>\n                                <span class=\"s1\">&#39;Former Yugoslav Republic of Macedonia, the&#39;<\/span><span class=\"p\">:<\/span> <span class=\"s1\">&#39;Macedonia&#39;<\/span><span class=\"p\">,<\/span>\n                                <span class=\"s1\">&#39;Germany (until 1990 former territory of the FRG)&#39;<\/span><span class=\"p\">:<\/span> <span class=\"s1\">&#39;Germany&#39;<\/span>\n                        <span class=\"p\">})<\/span>\n<span class=\"n\">features<\/span> <span class=\"o\">=<\/span> <span class=\"n\">edu2010<\/span><span class=\"o\">.<\/span><span class=\"n\">columns<\/span><span class=\"o\">.<\/span><span class=\"n\">tolist<\/span><span class=\"p\">()<\/span>\n\n<span class=\"n\">countries<\/span> <span class=\"o\">=<\/span> <span class=\"n\">edu2010<\/span><span class=\"o\">.<\/span><span class=\"n\">index<\/span><span class=\"o\">.<\/span><span class=\"n\">tolist<\/span><span class=\"p\">()<\/span>\n\n<span class=\"n\">edu2010<\/span><span class=\"o\">.<\/span><span class=\"n\">columns<\/span><span class=\"o\">=<\/span><span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">edu2010<\/span><span class=\"o\">.<\/span><span class=\"n\">head<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>As we can observe, this is not a clean data set, there are missing values. Some countries may not collect or have access to some indicators and there are countries without any indicators. Let us display this effect.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"c1\">#Check what is going on in the NaN data <\/span>\n<span class=\"n\">nan_countries<\/span><span class=\"o\">=<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">sum<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">where<\/span><span class=\"p\">(<\/span><span class=\"n\">edu2010<\/span><span class=\"o\">.<\/span><span class=\"n\">isnull<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">0<\/span><span class=\"p\">),<\/span><span class=\"n\">axis<\/span><span class=\"o\">=<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">bar<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"n\">nan_countries<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]),<\/span><span class=\"n\">nan_countries<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"n\">nan_countries<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]),<\/span><span class=\"n\">countries<\/span><span class=\"p\">,<\/span><span class=\"n\">rotation<\/span><span class=\"o\">=<\/span><span class=\"mi\">90<\/span><span class=\"p\">,<\/span><span class=\"n\">horizontalalignment<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;left&#39;<\/span><span class=\"p\">,<\/span>\n           <span class=\"n\">fontsize<\/span><span class=\"o\">=<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>We don&#8217;t have info on Albania, Macedonia and Greece. And very limited info from Liechtenstein, Luxembourg and Turkey. So let us work without them. Now let us check the features.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"c1\">#Remove non info countries<\/span>\n<span class=\"n\">wrk_countries<\/span> <span class=\"o\">=<\/span> <span class=\"n\">nan_countries<\/span><span class=\"o\">&lt;<\/span><span class=\"mi\">4<\/span>\n\n<span class=\"n\">educlean<\/span><span class=\"o\">=<\/span><span class=\"n\">edu2010<\/span><span class=\"o\">.<\/span><span class=\"n\">ix<\/span><span class=\"p\">[<\/span><span class=\"n\">wrk_countries<\/span><span class=\"p\">]<\/span> <span class=\"c1\">#.ix - Construct an open mesh from multiple sequences.<\/span>\n\n<span class=\"c1\">#Let us check the features we have<\/span>\n<span class=\"n\">na_features<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">sum<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">where<\/span><span class=\"p\">(<\/span><span class=\"n\">educlean<\/span><span class=\"o\">.<\/span><span class=\"n\">isnull<\/span><span class=\"p\">(),<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">0<\/span><span class=\"p\">),<\/span><span class=\"n\">axis<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"n\">na_features<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">bar<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"n\">na_features<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]),<\/span><span class=\"n\">na_features<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(<\/span><span class=\"n\">fontsize<\/span><span class=\"o\">=<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">8<\/span><span class=\"p\">,<\/span><span class=\"mi\">4<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>There are four features with missing data. At this point we can proceed in two ways:<\/p>\n<ul>\n<li><strong>Fill in<\/strong> the features with some non-informative, non-biasing data.<\/li>\n<li><strong>Drop<\/strong> the features with missing values.<\/li>\n<\/ul>\n<p>If we have many features and only a few have missing values then it is not much harmful to drop them. However, if missing values are spread across the features, we have to eventually deal with them. In our case, both options seem reasonable, so we will proceed with both at the same time.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"c1\">#Option A fills those features with some value, at risk of extracting wrong information<\/span>\n<span class=\"c1\">#Constant filling : edufill0=educlean.fillna(0)<\/span>\n<span class=\"n\">edufill<\/span><span class=\"o\">=<\/span><span class=\"n\">educlean<\/span><span class=\"o\">.<\/span><span class=\"n\">fillna<\/span><span class=\"p\">(<\/span><span class=\"n\">educlean<\/span><span class=\"o\">.<\/span><span class=\"n\">mean<\/span><span class=\"p\">())<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Filled in data shape: &#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">(<\/span><span class=\"n\">edufill<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">))<\/span>\n\n<span class=\"c1\">#Option B drops those features<\/span>\n<span class=\"n\">edudrop<\/span><span class=\"o\">=<\/span><span class=\"n\">educlean<\/span><span class=\"o\">.<\/span><span class=\"n\">dropna<\/span><span class=\"p\">(<\/span><span class=\"n\">axis<\/span><span class=\"o\">=<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span> \n         <span class=\"c1\">#dropna: Return object with labels on given axis omitted where alternately any or <\/span>\n          <span class=\"c1\"># all of the data are missing<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Drop data shape: &#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">(<\/span><span class=\"n\">edudrop<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>In the fill-in option, we have decided to fill the data with the mean value of the feature. This will not bias the distribution of the feature, though it has consequences in the interpretation of the results.<\/p>\n<p>Let us now apply a K-means clustering technique on this data in order to partition the countries according to their investment in education and check their profiles.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">scaler<\/span> <span class=\"o\">=<\/span> <span class=\"n\">StandardScaler<\/span><span class=\"p\">()<\/span> <span class=\"c1\">#Standardize features by removing the mean and scaling to unit variance<\/span>\n\n<span class=\"n\">X_train_fill<\/span> <span class=\"o\">=<\/span> <span class=\"n\">edufill<\/span><span class=\"o\">.<\/span><span class=\"n\">values<\/span>\n<span class=\"n\">X_train_fill<\/span> <span class=\"o\">=<\/span> <span class=\"n\">scaler<\/span><span class=\"o\">.<\/span><span class=\"n\">fit_transform<\/span><span class=\"p\">(<\/span><span class=\"n\">X_train_fill<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">clf<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">init<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;k-means++&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"n\">random_state<\/span><span class=\"o\">=<\/span><span class=\"mi\">42<\/span><span class=\"p\">)<\/span>\n    \n<span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X_train_fill<\/span><span class=\"p\">)<\/span> <span class=\"c1\">#Compute k-means clustering.<\/span>\n\n<span class=\"n\">y_pred_fill<\/span> <span class=\"o\">=<\/span> <span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">predict<\/span><span class=\"p\">(<\/span><span class=\"n\">X_train_fill<\/span><span class=\"p\">)<\/span> \n        <span class=\"c1\">#Predict the closest cluster each sample in X belongs to.<\/span>\n\n<span class=\"n\">idx<\/span><span class=\"o\">=<\/span><span class=\"n\">y_pred_fill<\/span><span class=\"o\">.<\/span><span class=\"n\">argsort<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Let&#8217;s visualize the result of the K-means clustering:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">plot<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">35<\/span><span class=\"p\">),<\/span><span class=\"n\">y_pred_fill<\/span><span class=\"p\">[<\/span><span class=\"n\">idx<\/span><span class=\"p\">],<\/span><span class=\"s1\">&#39;ro&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">wrk_countries_names<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">countries<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">wrk_countries<\/span><span class=\"p\">)<\/span> <span class=\"k\">if<\/span> <span class=\"n\">item<\/span> <span class=\"p\">]<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">)),[<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">idx<\/span><span class=\"p\">],<\/span>\n           <span class=\"n\">rotation<\/span><span class=\"o\">=<\/span><span class=\"mi\">90<\/span><span class=\"p\">,<\/span><span class=\"n\">horizontalalignment<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;left&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">fontsize<\/span><span class=\"o\">=<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Using filled in data&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">15<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">yticks<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">])<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Let&#8217;s apply the clustering on the dataset with dropped missing values:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">X_train_drop<\/span> <span class=\"o\">=<\/span> <span class=\"n\">edudrop<\/span><span class=\"o\">.<\/span><span class=\"n\">values<\/span>\n<span class=\"n\">X_train_drop<\/span> <span class=\"o\">=<\/span> <span class=\"n\">scaler<\/span><span class=\"o\">.<\/span><span class=\"n\">fit_transform<\/span><span class=\"p\">(<\/span><span class=\"n\">X_train_drop<\/span><span class=\"p\">)<\/span>\n    \n<span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X_train_drop<\/span><span class=\"p\">)<\/span> <span class=\"c1\">#Compute k-means clustering.<\/span>\n<span class=\"n\">y_pred_drop<\/span> <span class=\"o\">=<\/span> <span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">predict<\/span><span class=\"p\">(<\/span><span class=\"n\">X_train_drop<\/span><span class=\"p\">)<\/span> <span class=\"c1\">#Predict the closest cluster of each sample in X.<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">idx<\/span><span class=\"o\">=<\/span><span class=\"n\">y_pred_drop<\/span><span class=\"o\">.<\/span><span class=\"n\">argsort<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">plot<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">35<\/span><span class=\"p\">),<\/span><span class=\"n\">y_pred_drop<\/span><span class=\"p\">[<\/span><span class=\"n\">idx<\/span><span class=\"p\">],<\/span><span class=\"s1\">&#39;ro&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">wrk_countries_names<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">countries<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">wrk_countries<\/span><span class=\"p\">)<\/span> <span class=\"k\">if<\/span> <span class=\"n\">item<\/span> <span class=\"p\">]<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">)),[<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">idx<\/span><span class=\"p\">],<\/span>\n           <span class=\"n\">rotation<\/span><span class=\"o\">=<\/span><span class=\"mi\">90<\/span><span class=\"p\">,<\/span><span class=\"n\">horizontalalignment<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;left&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">fontsize<\/span><span class=\"o\">=<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Using dropped missing values data&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">15<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">yticks<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">])<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>We have sorted the data for better visualization. At a simple glance we can see that both partitions can be different. We can better check this effect plotting the clusters values of one technique against the other.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">plot<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred_drop<\/span><span class=\"o\">+<\/span><span class=\"mf\">0.2<\/span><span class=\"o\">*<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">rand<\/span><span class=\"p\">(<\/span><span class=\"mi\">35<\/span><span class=\"p\">),<\/span><span class=\"n\">y_pred_fill<\/span><span class=\"o\">+<\/span><span class=\"mf\">0.2<\/span><span class=\"o\">*<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">rand<\/span><span class=\"p\">(<\/span><span class=\"mi\">35<\/span><span class=\"p\">),<\/span><span class=\"s1\">&#39;bo&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xlabel<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Predicted clusters for the filled in dataset.&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">ylabel<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Predicted clusters for the dropped missing values dataset.&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Correlations&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">])<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">yticks<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">])<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">savefig<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;files\/ch07\/correlationkmeans.png&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">dpi<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">bbox_inches<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;tight&#39;<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Well, looking at both methods, both may yield the same results, but not necessarily always. This is mainly due to two aspects: the random initialization of the k-means clustering and the fact that each method works in a different space (dropped data vs filled-in data).<\/p>\n<p>Let us check the list of countries in both methods. Note that we should not consider the cluster value, since it is irrelevant.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Cluster 0: <\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">([<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred_fill<\/span><span class=\"p\">)<\/span> \n                             <span class=\"k\">if<\/span> <span class=\"n\">item<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">]))<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Cluster 0: <\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">([<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred_drop<\/span><span class=\"p\">)<\/span> \n                             <span class=\"k\">if<\/span> <span class=\"n\">item<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">]))<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;<\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Cluster 1: <\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">([<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred_fill<\/span><span class=\"p\">)<\/span> \n                             <span class=\"k\">if<\/span> <span class=\"n\">item<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">]))<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Cluster 1: <\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">([<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred_drop<\/span><span class=\"p\">)<\/span> \n                             <span class=\"k\">if<\/span> <span class=\"n\">item<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">]))<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;<\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Cluster 2: <\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">([<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred_fill<\/span><span class=\"p\">)<\/span> \n                             <span class=\"k\">if<\/span> <span class=\"n\">item<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">]))<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Cluster 2: <\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">([<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred_drop<\/span><span class=\"p\">)<\/span> \n                             <span class=\"k\">if<\/span> <span class=\"n\">item<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">]))<\/span>\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;<\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Let us check the profile of the clusters by looking at the centroids:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">width<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.3<\/span>\n<span class=\"n\">p1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">bar<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">),<\/span><span class=\"n\">scaler<\/span><span class=\"o\">.<\/span><span class=\"n\">inverse_transform<\/span><span class=\"p\">(<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">cluster_centers_<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]),<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;b&#39;<\/span><span class=\"p\">)<\/span>\n        <span class=\"c1\"># Scale back the data to the original representation<\/span>\n<span class=\"n\">p2<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">bar<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">)<\/span><span class=\"o\">+<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">scaler<\/span><span class=\"o\">.<\/span><span class=\"n\">inverse_transform<\/span><span class=\"p\">(<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">cluster_centers_<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]),<\/span>\n             <span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;yellow&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">p0<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">bar<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">)<\/span><span class=\"o\">+<\/span><span class=\"mi\">2<\/span><span class=\"o\">*<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">scaler<\/span><span class=\"o\">.<\/span><span class=\"n\">inverse_transform<\/span><span class=\"p\">(<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">cluster_centers_<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]),<\/span>\n             <span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">legend<\/span><span class=\"p\">(<\/span> <span class=\"p\">(<\/span><span class=\"n\">p0<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">p1<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">p2<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]),<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Cluster 0&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;Cluster 1&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;Cluster 2&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">,<\/span><span class=\"n\">loc<\/span><span class=\"o\">=<\/span><span class=\"mi\">9<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"mf\">0.5<\/span><span class=\"p\">,<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">),<\/span><span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">yticks<\/span><span class=\"p\">(<\/span><span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xlabel<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Economical indicators&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">ylabel<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Average expanditure&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">savefig<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;files\/ch07\/clusterexpenditure.png&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">dpi<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">bbox_inches<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;tight&#39;<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>It looks like cluster <code>1<\/code> spends more on education while cluster <code>0<\/code> is the one with less resources on education. (What about Spain?)<\/p>\n<p>Let us refine a little bit more cluster <code>0<\/code> and check how close are members from this cluster to cluster <code>1<\/code>. This may give us a hint on a possible ordering.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">from<\/span> <span class=\"nn\">scipy.spatial<\/span> <span class=\"k\">import<\/span> <span class=\"n\">distance<\/span>\n<span class=\"n\">p<\/span> <span class=\"o\">=<\/span> <span class=\"n\">distance<\/span><span class=\"o\">.<\/span><span class=\"n\">cdist<\/span><span class=\"p\">(<\/span><span class=\"n\">X_train_drop<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred_drop<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">,:],[<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">cluster_centers_<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]],<\/span><span class=\"s1\">&#39;euclidean&#39;<\/span><span class=\"p\">)<\/span> \n                  <span class=\"c1\">#the distance of the elements of cluster 0 to the center of cluster 1<\/span>\n    \n<span class=\"n\">fx<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">vectorize<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">int<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">plot<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]),<\/span> \n        <span class=\"n\">fx<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span><span class=\"p\">)<\/span>\n       <span class=\"p\">)<\/span>\n\n<span class=\"n\">wrk_countries_names<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">countries<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">wrk_countries<\/span><span class=\"p\">)<\/span> <span class=\"k\">if<\/span> <span class=\"n\">item<\/span> <span class=\"p\">]<\/span>\n<span class=\"n\">zero_countries_names<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred_drop<\/span><span class=\"p\">)<\/span> \n                        <span class=\"k\">if<\/span> <span class=\"n\">item<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">zero_countries_names<\/span><span class=\"p\">)),<\/span><span class=\"n\">zero_countries_names<\/span><span class=\"p\">,<\/span><span class=\"n\">rotation<\/span><span class=\"o\">=<\/span><span class=\"mi\">90<\/span><span class=\"p\">,<\/span>\n           <span class=\"n\">horizontalalignment<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;left&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">fontsize<\/span><span class=\"o\">=<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Well, it seems that Spain belongs to cluster <code>0<\/code>, it is the closest to change to a policy in the lines of the other clusters.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Additionally, we can also check the distance to the centroid of cluster <code>0<\/code>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">from<\/span> <span class=\"nn\">scipy.spatial<\/span> <span class=\"k\">import<\/span> <span class=\"n\">distance<\/span>\n<span class=\"n\">p<\/span> <span class=\"o\">=<\/span> <span class=\"n\">distance<\/span><span class=\"o\">.<\/span><span class=\"n\">cdist<\/span><span class=\"p\">(<\/span><span class=\"n\">X_train_drop<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred_drop<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">,:],[<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">cluster_centers_<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]],<\/span><span class=\"s1\">&#39;euclidean&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">pown<\/span> <span class=\"o\">=<\/span> <span class=\"n\">distance<\/span><span class=\"o\">.<\/span><span class=\"n\">cdist<\/span><span class=\"p\">(<\/span><span class=\"n\">X_train_drop<\/span><span class=\"p\">[<\/span><span class=\"n\">y_pred_drop<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">,:],[<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">cluster_centers_<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]],<\/span><span class=\"s1\">&#39;euclidean&#39;<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">width<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.45<\/span>\n<span class=\"n\">p0<\/span><span class=\"o\">=<\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">plot<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]),<\/span><span class=\"n\">fx<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span><span class=\"p\">),<\/span><span class=\"n\">width<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">p1<\/span><span class=\"o\">=<\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">plot<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">])<\/span><span class=\"o\">+<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">fx<\/span><span class=\"p\">(<\/span><span class=\"n\">pown<\/span><span class=\"p\">),<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">color<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;red&#39;<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">wrk_countries_names<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">countries<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">wrk_countries<\/span><span class=\"p\">)<\/span> <span class=\"k\">if<\/span> <span class=\"n\">item<\/span> <span class=\"p\">]<\/span>\n<span class=\"n\">zero_countries_names<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred_drop<\/span><span class=\"p\">)<\/span> \n                        <span class=\"k\">if<\/span> <span class=\"n\">item<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">zero_countries_names<\/span><span class=\"p\">)),<\/span><span class=\"n\">zero_countries_names<\/span><span class=\"p\">,<\/span><span class=\"n\">rotation<\/span><span class=\"o\">=<\/span><span class=\"mi\">90<\/span><span class=\"p\">,<\/span>\n           <span class=\"n\">horizontalalignment<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;left&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">fontsize<\/span><span class=\"o\">=<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">legend<\/span><span class=\"p\">(<\/span> <span class=\"p\">(<\/span><span class=\"n\">p0<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">p1<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]),<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;d -&gt; 1&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;d -&gt; 0&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">,<\/span><span class=\"n\">loc<\/span><span class=\"o\">=<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">savefig<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;files\/ch07\/dist2cluster01.png&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">dpi<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">bbox_inches<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;tight&#39;<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Let us redo the clustering with $K=4$ and see what we can conclude.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">X_train<\/span> <span class=\"o\">=<\/span> <span class=\"n\">edudrop<\/span><span class=\"o\">.<\/span><span class=\"n\">values<\/span>\n<span class=\"n\">clf<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">KMeans<\/span><span class=\"p\">(<\/span><span class=\"n\">init<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;k-means++&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"n\">random_state<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">X_train<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">y_pred<\/span> <span class=\"o\">=<\/span> <span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">predict<\/span><span class=\"p\">(<\/span><span class=\"n\">X_train<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">idx<\/span><span class=\"o\">=<\/span><span class=\"n\">y_pred<\/span><span class=\"o\">.<\/span><span class=\"n\">argsort<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">plot<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">35<\/span><span class=\"p\">),<\/span><span class=\"n\">y_pred<\/span><span class=\"p\">[<\/span><span class=\"n\">idx<\/span><span class=\"p\">],<\/span><span class=\"s1\">&#39;ro&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">wrk_countries_names<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">countries<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">wrk_countries<\/span><span class=\"p\">)<\/span> <span class=\"k\">if<\/span> <span class=\"n\">item<\/span> <span class=\"p\">]<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">)),[<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">idx<\/span><span class=\"p\">],<\/span><span class=\"n\">rotation<\/span><span class=\"o\">=<\/span><span class=\"mi\">90<\/span><span class=\"p\">,<\/span>\n           <span class=\"n\">horizontalalignment<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;left&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">fontsize<\/span><span class=\"o\">=<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Using drop features&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">15<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">yticks<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">])<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">width<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.2<\/span>\n<span class=\"n\">p0<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">bar<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">)<\/span><span class=\"o\">+<\/span><span class=\"mi\">1<\/span><span class=\"o\">*<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">cluster_centers_<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;r&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">p1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">bar<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">),<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">cluster_centers_<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;b&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">p2<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">bar<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">)<\/span><span class=\"o\">+<\/span><span class=\"mi\">3<\/span><span class=\"o\">*<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">cluster_centers_<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">],<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;yellow&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">p3<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">bar<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">)<\/span><span class=\"o\">+<\/span><span class=\"mi\">2<\/span><span class=\"o\">*<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">clf<\/span><span class=\"o\">.<\/span><span class=\"n\">cluster_centers_<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">],<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span><span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;pink&#39;<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">legend<\/span><span class=\"p\">(<\/span> <span class=\"p\">(<\/span><span class=\"n\">p0<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">p1<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">p2<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"n\">p3<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]),<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Cluster 0&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;Cluster 1&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;Cluster 2&#39;<\/span><span class=\"p\">,<\/span> \n                                           <span class=\"s1\">&#39;Cluster 3&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">,<\/span><span class=\"n\">loc<\/span><span class=\"o\">=<\/span><span class=\"mi\">9<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"mf\">0.5<\/span><span class=\"p\">,<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">),<\/span><span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">yticks<\/span><span class=\"p\">(<\/span><span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xlabel<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Economical indicator&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">ylabel<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Average expenditure&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">savefig<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;files\/ch07\/distances4clusters.png&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">dpi<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">bbox_inches<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;tight&#39;<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Spain is still in cluster <code>0<\/code>. But as we observed in our previous clustering it was very close to changing cluster. This time cluster <code>0<\/code> includes the averages values for the EU members. Just for the sake of completeness, let us write down the name of the countries in the clusters.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Cluster 0: <\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">([<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred<\/span><span class=\"p\">)<\/span> <span class=\"k\">if<\/span> <span class=\"n\">item<\/span><span class=\"o\">==<\/span><span class=\"mi\">0<\/span><span class=\"p\">]))<\/span>\n\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Cluster 1: <\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">([<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred<\/span><span class=\"p\">)<\/span> <span class=\"k\">if<\/span> <span class=\"n\">item<\/span><span class=\"o\">==<\/span><span class=\"mi\">1<\/span><span class=\"p\">]))<\/span>\n\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Cluster 2: <\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">([<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred<\/span><span class=\"p\">)<\/span> <span class=\"k\">if<\/span> <span class=\"n\">item<\/span><span class=\"o\">==<\/span><span class=\"mi\">2<\/span><span class=\"p\">]))<\/span>\n\n<span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s1\">&#39;Cluster 3: <\/span><span class=\"se\">\\n<\/span><span class=\"s1\">&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">([<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">y_pred<\/span><span class=\"p\">)<\/span> <span class=\"k\">if<\/span> <span class=\"n\">item<\/span><span class=\"o\">==<\/span><span class=\"mi\">3<\/span><span class=\"p\">]))<\/span>\n\n<span class=\"c1\">#Save data for future use.<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">pickle<\/span>\n<span class=\"n\">ofname<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">open<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;edu2010.pkl&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;wb&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">s<\/span> <span class=\"o\">=<\/span> <span class=\"n\">pickle<\/span><span class=\"o\">.<\/span><span class=\"n\">dump<\/span><span class=\"p\">([<\/span><span class=\"n\">edu2010<\/span><span class=\"p\">,<\/span> <span class=\"n\">wrk_countries_names<\/span><span class=\"p\">,<\/span><span class=\"n\">y_pred<\/span> <span class=\"p\">],<\/span><span class=\"n\">ofname<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">ofname<\/span><span class=\"o\">.<\/span><span class=\"n\">close<\/span><span class=\"p\">()<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>We can repeat the process using the alternative clustering techniques and compare their results. Let us first apply the spectral clustering. The corresponding code will be:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"kn\">from<\/span> <span class=\"nn\">scipy.cluster.hierarchy<\/span> <span class=\"k\">import<\/span> <span class=\"n\">linkage<\/span><span class=\"p\">,<\/span> <span class=\"n\">dendrogram<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">scipy.spatial.distance<\/span> <span class=\"k\">import<\/span> <span class=\"n\">pdist<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">sklearn.preprocessing<\/span> <span class=\"k\">import<\/span> <span class=\"n\">StandardScaler<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">sklearn.neighbors<\/span> <span class=\"k\">import<\/span> <span class=\"n\">kneighbors_graph<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">sklearn.metrics<\/span> <span class=\"k\">import<\/span> <span class=\"n\">euclidean_distances<\/span>\n\n<span class=\"n\">X<\/span> <span class=\"o\">=<\/span> <span class=\"n\">StandardScaler<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"n\">fit_transform<\/span><span class=\"p\">(<\/span><span class=\"n\">edudrop<\/span><span class=\"o\">.<\/span><span class=\"n\">values<\/span><span class=\"p\">)<\/span>\n \n<span class=\"n\">distances<\/span> <span class=\"o\">=<\/span> <span class=\"n\">euclidean_distances<\/span><span class=\"p\">(<\/span><span class=\"n\">edudrop<\/span><span class=\"o\">.<\/span><span class=\"n\">values<\/span><span class=\"p\">)<\/span>\n    \n<span class=\"n\">spectral<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cluster<\/span><span class=\"o\">.<\/span><span class=\"n\">SpectralClustering<\/span><span class=\"p\">(<\/span><span class=\"n\">n_clusters<\/span><span class=\"o\">=<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"n\">affinity<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;nearest_neighbors&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">spectral<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">edudrop<\/span><span class=\"o\">.<\/span><span class=\"n\">values<\/span><span class=\"p\">)<\/span>\n \n<span class=\"n\">y_pred<\/span> <span class=\"o\">=<\/span> <span class=\"n\">spectral<\/span><span class=\"o\">.<\/span><span class=\"n\">labels_<\/span><span class=\"o\">.<\/span><span class=\"n\">astype<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">int<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>If we visualize the results:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">idx<\/span><span class=\"o\">=<\/span><span class=\"n\">y_pred<\/span><span class=\"o\">.<\/span><span class=\"n\">argsort<\/span><span class=\"p\">()<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">plot<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"mi\">35<\/span><span class=\"p\">),<\/span><span class=\"n\">y_pred<\/span><span class=\"p\">[<\/span><span class=\"n\">idx<\/span><span class=\"p\">],<\/span><span class=\"s1\">&#39;ro&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">wrk_countries_names<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">countries<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">wrk_countries<\/span><span class=\"p\">)<\/span> <span class=\"k\">if<\/span> <span class=\"n\">item<\/span> <span class=\"p\">]<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">xticks<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">arange<\/span><span class=\"p\">(<\/span><span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">)),[<\/span><span class=\"n\">wrk_countries_names<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> \n        <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">idx<\/span><span class=\"p\">],<\/span><span class=\"n\">rotation<\/span><span class=\"o\">=<\/span><span class=\"mi\">90<\/span><span class=\"p\">,<\/span><span class=\"n\">horizontalalignment<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;left&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">fontsize<\/span><span class=\"o\">=<\/span><span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">yticks<\/span><span class=\"p\">([<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">])<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">title<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;Applying Spectral Clustering on the drop features&#39;<\/span><span class=\"p\">,<\/span><span class=\"n\">size<\/span><span class=\"o\">=<\/span><span class=\"mi\">15<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">))<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Note that in general, the spectral clustering intends to obtain more balanced clusters. In this way, the predicted cluster 1 merges the cluster 2 and 3 of the K-means clustering, cluster 2 corresponds to the cluster 1 of the K-means clustering, cluster 0 mainly goes to cluster 2, and clusters 3 corresponds to cluster 0 of the K-means.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Applying the agglomerative clustering, we obtain not only the different clusters, but also we can see how different clusters are obtained. This, in some way it is giving us information on which are the pairs of countries and clusters that are most similar. The corresponding code that applies the agglomerative clustering is:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span><span class=\"n\">X_train<\/span> <span class=\"o\">=<\/span> <span class=\"n\">edudrop<\/span><span class=\"o\">.<\/span><span class=\"n\">values<\/span>\n<span class=\"n\">dist<\/span> <span class=\"o\">=<\/span> <span class=\"n\">pdist<\/span><span class=\"p\">(<\/span><span class=\"n\">X_train<\/span><span class=\"p\">,<\/span><span class=\"s1\">&#39;euclidean&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">linkage_matrix<\/span> <span class=\"o\">=<\/span> <span class=\"n\">linkage<\/span><span class=\"p\">(<\/span><span class=\"n\">dist<\/span><span class=\"p\">,<\/span><span class=\"n\">method<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;complete&#39;<\/span><span class=\"p\">);<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">figure<\/span><span class=\"p\">()<\/span>  <span class=\"c1\"># we need a tall figure<\/span>\n<span class=\"n\">fig<\/span> <span class=\"o\">=<\/span> <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">fig<\/span><span class=\"o\">.<\/span><span class=\"n\">set_size_inches<\/span><span class=\"p\">((<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span><span class=\"mi\">12<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">dendrogram<\/span><span class=\"p\">(<\/span><span class=\"n\">linkage_matrix<\/span><span class=\"p\">,<\/span> <span class=\"n\">orientation<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;right&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">color_threshold<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span><span class=\"n\">labels<\/span> <span class=\"o\">=<\/span> <span class=\"n\">wrk_countries_names<\/span><span class=\"p\">,<\/span> <span class=\"n\">leaf_font_size<\/span><span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">);<\/span>\n\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">savefig<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;files\/ch07\/ACCountires.png&quot;<\/span><span class=\"p\">,<\/span><span class=\"n\">dpi<\/span><span class=\"o\">=<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">bbox_inches<\/span><span class=\"o\">=<\/span><span class=\"s1\">&#39;tight&#39;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">show<\/span><span class=\"p\">()<\/span>\n\n<span class=\"c1\">#plt.tight_layout()  # fixes margins<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>In scikit-learn, the parameter color_threshold colors all the descendent links below a cluster node k the same color if k is the first node below the color threshold. All links connecting nodes with distances greater than or equal to the threshold are colored blue. Thus, if we use color threshold = 3, the obtained clusters are as follows:<\/p>\n<ul>\n<li>Cluster 0: [&#8216;Cyprus&#8217;, &#8216;Denmark&#8217;, &#8216;Iceland&#8217;]<\/li>\n<li>Cluster 1: [&#8216;Bulgaria&#8217;, &#8216;Croatia&#8217;, &#8216;Czech Republic&#8217;, &#8216;Italy&#8217;, &#8216;Japan&#8217;, &#8216;Romania&#8217;, &#8216;Slovakia&#8217;]<\/li>\n<li>Cluster 2: [&#8216;Belgium&#8217;, &#8216;Finland&#8217;, &#8216;Ireland&#8217;, &#8216;Malta&#8217;, &#8216;Norway&#8217;, &#8216;Sweden&#8217;]<\/li>\n<li>Cluster 3: [&#8216;Austria&#8217;, &#8216;Estonia&#8217;, &#8216;EU13&#8217;, &#8216;EU15&#8217;, &#8216;EU25&#8217;, &#8216;EU27&#8217;, &#8216;France&#8217;, &#8216;Germany&#8217;, &#8216;Hungary&#8217;, &#8216;Latvia&#8217;, &#8216;Lithuania&#8217;, &#8216;Netherlands&#8217;, &#8216;Poland&#8217;, &#8216;Portugal&#8217;, &#8216;Slovenia&#8217;, &#8216;Spain&#8217;, &#8216;Switzerland&#8217;, &#8216;United Kingdom&#8217;, &#8216;United States&#8217;]<\/li>\n<\/ul>\n<p>Note that they correspond in high degree to the clusters obtained by the K-means (except permutation of clusters labels that is irrelevant). The figure shows the construction of the clusters using the complete linkage agglomerative clustering. Different cuts at different levels of the dendrogram allow to obtain different number of clusters. As a summary, let us compare the results of the three approaches of clustering. We cannot expect that the results coincide since different approaches are based on different criteria to construct the clusters. Still, we can observe that in this case K-means and the agglomerative approaches gave the same results (up to a permutation of the number of cluster that is irrelevant), meanwhile the spectral clustering gave more evenly distributed clusters. It fused cluster 0 and 2 of the agglomerative clustering in cluster 1, and split cluster 3 of agglomerative clustering in clusters 0 and 3 of it. Note that these results can change when using different distance between data.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2 id=\"&#160;4-Conclusions\">&#160;4 Conclusions<a class=\"anchor-link\" href=\"#&#160;4-Conclusions\">&#182;<\/a><\/h2>\n<p>In this chapter, we have introduced the unsupervised learning problem as a problem of knowledge or structure discovery from a set of unlabeled data. We have focused on the clustering as one of the main problems for unsupervised learning. Basic concepts like distance, similarity, connectivity and quality of the clustering results have been discussed as main elements to determine before choosing a specific clustering technique. Three basic clustering techniques have been introduced, mainly: K-means, agglomerative clustering and spectral clustering. We have discussed their advantages and disadvantages and compared them on different synthetic examples. One of the important parameters for most clustering techniques is the number of clusters expected. Regarding the scalability, K-means allows to be applied on very large datasets, but the number of clusters should be as much as medium due to its iterative procedure. Spectral clustering can manage not very large datasets and number of clusters, since it is based on computing the eigenvectors of its affinity matrix. In this aspect, best option is the hierarchical clustering that allows large number of samples and clusters. Regarding its use, K-means is able to discover mainly data with at geometry (isotropic and compact clusters), while spectral clustering and agglomerative clustering with average and complete linkage are able to detect data with non-flat geometry. The connectivity graph is specially helpful in such cases. At the end, a case study from a database of Eurostat has been considered to show the applicability of the clustering on real<br \/>\ndatasets.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\"><\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p><small><i> This notebook was created by [Petia Radeva](http:\/\/www.cvc.uab.es\/~petia) and [Oriol Pujol Vila](http:\/\/www.maia.ub.es\/~oriol). Last edition: 15 of July, 2016.<\/i><\/small><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[&nbsp;]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython3\">\n<pre><span><\/span> \n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><\/body><\/p>\n<p><\/html><\/p>\n","protected":false},"excerpt":{"rendered":"<p>ch07_Unsupervised_Learning In\u00a0[\u00a0]: import warnings warnings.filterwarnings(&#8216;ignore&#8217;) Chapter 7: Unsupervised learning\u00b6 In this notebook, we will discuss different techniques for unsupervised learning and will focus on several clustering techniques. After considering basic concepts like distance and similarity, taxonomy of clustering techniques and goodness of clustering quality, we will explore three basic clustering techniques, namely, K-means, spectral clustering [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"parent":11,"menu_order":6,"comment_status":"closed","ping_status":"closed","template":"page-templates\/full-width.php","meta":{"footnotes":""},"class_list":["post-159","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"http:\/\/vargas-solar.com\/data-centric-smart-everything\/wp-json\/wp\/v2\/pages\/159","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/vargas-solar.com\/data-centric-smart-everything\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/vargas-solar.com\/data-centric-smart-everything\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/vargas-solar.com\/data-centric-smart-everything\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"http:\/\/vargas-solar.com\/data-centric-smart-everything\/wp-json\/wp\/v2\/comments?post=159"}],"version-history":[{"count":22,"href":"http:\/\/vargas-solar.com\/data-centric-smart-everything\/wp-json\/wp\/v2\/pages\/159\/revisions"}],"predecessor-version":[{"id":413,"href":"http:\/\/vargas-solar.com\/data-centric-smart-everything\/wp-json\/wp\/v2\/pages\/159\/revisions\/413"}],"up":[{"embeddable":true,"href":"http:\/\/vargas-solar.com\/data-centric-smart-everything\/wp-json\/wp\/v2\/pages\/11"}],"wp:attachment":[{"href":"http:\/\/vargas-solar.com\/data-centric-smart-everything\/wp-json\/wp\/v2\/media?parent=159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}