<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DimoninG.ru &#187; алгоритмы</title>
	<atom:link href="http://dimoning.ru/category/programmirovanie/algoritmyi/feed" rel="self" type="application/rss+xml" />
	<link>http://dimoning.ru</link>
	<description>программирование сайтов и скриптов</description>
	<lastBuildDate>Tue, 07 Feb 2012 15:45:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Метод К-средних (K-means), исходник на C++ (Builder)</title>
		<link>http://dimoning.ru/metod-k-srednih-k-means-ishodnik-na-c-builder.html</link>
		<comments>http://dimoning.ru/metod-k-srednih-k-means-ishodnik-na-c-builder.html#comments</comments>
		<pubDate>Tue, 23 Jun 2009 12:27:24 +0000</pubDate>
		<dc:creator>DimoninG</dc:creator>
				<category><![CDATA[алгоритмы]]></category>

		<guid isPermaLink="false">http://dimoning.ru/?p=1199</guid>
		<description><![CDATA[Народ, не хочу никого пугать, но сейчас пост будет о кластеризации методом K-средних. Помогал знакомой с заданием из универа, родилась прога. Решил поделиться. Может вам никому и не надо, а кому-то где-то точно будет нужно (я сам пока гуглил, чуть пальцы не сломал; даже описание алгоритма еле нашел).
Внимание, рассказывает профан; все объяснения даются приближенные, &#171;чтобы [...]]]></description>
			<content:encoded><![CDATA[<p>Народ, не хочу никого пугать, но сейчас пост будет о кластеризации методом K-средних. Помогал знакомой с заданием из универа, родилась прога. Решил поделиться. Может вам никому и не надо, а кому-то где-то точно будет нужно (я сам пока гуглил, чуть пальцы не сломал; даже описание алгоритма еле нашел).</p>
<p><em>Внимание, рассказывает профан; все объяснения даются приближенные, &laquo;чтобы понять&raquo;. За подробным описанием алгоритмов и точными определениями &#8211; в энциклопедию.</em> Что такое кластеризация? Грубо говоря &#8211; это деление по группам некоторого количества объектов. Например, у нас в огромной куче смешались чебурашки, велосипеды и роботы-убийцы-детей. Если производить кластеризацию по признаку, то чебурашек мы отнесем в одну группу, велосипеды &#8211; в другу, а роботов-убийц-детей в третью (ту, что рядом с детским садиком у меня под окном). Признак, по которому мы относим один предмет в одну группу, а другой в другую называется метрикой. Грубо говоря, метрика &#8211; это просто способ отделить один предмет от другого, используя какие-то точные рассчеты. Самый простой вариант &#8211; это когда метрикой является расстояние.</p>
<p>Кластеризация (деление на кластеры) может быть и немного другой. Если в первом примере с 3 кучами вещей нам сказано разделить их на четыре кластера, то наверняка велосипеды попадут в кучу с чебурашками, а для каких-то детей не найдутся их роботы-убийцы.</p>
<p>Есть метод, называется метод кластеризации К-средних, который позволяет &laquo;расфасовать&raquo; объекты как раз по второму принципу. То есть мы заранее задаем количество кластеров, а алгоритм сам разделяет объекты на это количетсво.</p>
<p>В данном случае мы будем работать с точками на плоскости. Чтобы сразу можно было наглядно все представить, выложу скриншот программы на C++ Builder (скачать можно по ссылке в конце статьи).</p>
<p><a href="http://dimoning.ru/wp-content/uploads/2009/06/kluster.jpg"><img class="aligncenter size-full wp-image-1200" title="kluster" src="http://dimoning.ru/wp-content/uploads/2009/06/kluster.jpg" alt="kluster" width="344" height="348" /></a></p>
<p>Итак. Все точки, обозначенные&#8230; точками &#8211; это&#8230; точки&#8230; те, которые на плоскости. Во сказал. Кстати, почему-то точки тут немного похожи на маленькие ромбики &#8211; в общем, это они и есть. Квадратики &#8211; это центры кластеров. Линии от точек до центров нужны просто для наглядности, чтобы сразу видеть к какому центру принадлежит точка (их можно убрать, сняв галку &laquo;линии&raquo;). Хотя они и одного цвета, а центр обведен ченым и квадратный, я решил добавить линии.</p>
<p><span id="more-1199"></span></p>
<p>Так вот. Хотя для многих студентов достаточно только программы, я расскажу как работает сам алгоритм кластеризации. Он интеративный. То есть он повторяется несколько раз, пока не &laquo;сойдется&raquo;. Сходимость в данном случае значит, что с каждоый итерацией (повторением вычислений) мы все точнее приближаемся к правильному ответу. А &laquo;сошелся&raquo; в данном случае значит, что мы нашли правильный ответ или мы очень близко к нему (то есть нашлось число с небольшой погрешностью, на которую мы плюем и топчем ногами).</p>
<p>Дано. 50 точек, расположенных случайным образом на плоскости 20 на 20 (не важно даже каких единиц). Нужно распределить эти точки по кластерам алгоритмом К-средних (или K-means). Алгоритм действует так:</p>
<p>1) Сначала случайным образом выставляем на этой же плоскости k центров кластеров. Центр кластера называется центроидом. Просто рандомом, от балды, наплевательски, кое-какерски. Без начального положения центроидов не удастся запустить алгоритм (увидите почему). Как их расставить &#8211; дело ваше, можно самостоятельно вводить координаты, можно применить еще какой-нибудь алгоритм.</p>
<p>2) Начинается вычисление кластеров в цикле. Он простой как&#8230; куча дерьма.</p>
<p>2.1) Сначала мы &laquo;привязываем&raquo; каждую точку к тому центроиду, к которому она ближе. Т.к. центроид является центром кластера, то можно сказать, что мы относим каждую точку к тому кластеру, к центру которого она ближе.</p>
<p>2.2) Когда все точки привязаны и ни одна от нас не убежала, нужно пересчитать координаты центроидов. Для этого мысленно вписываем весь кластер в прямоугольник и ставим центроид туда, где пересекутся его диагонали (в середину, короче).  На скриншоте это очень хорошо видно. Обведите, например, синий кластер прямоугольником и вы увидите, что синий центроид стоит в его середине.</p>
<p>2.3) Повторяем с шага 2.1 до тех пор, пока центроиды не перестанут менять своего положения. Если они перестали менять положение, значит алгоритм сошелся, мы крутые перцы и все надрали зад. Кстати, как правило алгоритм сходится где-то за 2-6 итераций. Но в теории возможно, что алгоритм не сойдется вообще, поэтому я на всякий случай включил в него &laquo;защиту&raquo; &#8211; сделал максимальное число итераций 30. Это гарантирует, что программа не зависнет.</p>
<p><em>Исходник потерян за давностью лет, простите. Хотя с точки зрения программирования &#8211; ничего сложного.</em></p>
<p>Постовые: <a href="http://webwalker.ru">обратные ссылки</a>, <a href="http://smopro.ru/category/blog/tweemru-servis-skryitoy-reklamyi-v-twitter/">реклама в Twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dimoning.ru/metod-k-srednih-k-means-ishodnik-na-c-builder.html/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
	</channel>
</rss>

