RAntiquity
1.1K subscribers
299 photos
11 videos
5 files
553 links
Об античности на языке R и не только

@locusclassicus
Download Telegram
🌳 Придется вам потерпеть еще несколько постов про #филогенетика, пока я разбираюсь в теме. Этот пост о силе консенсуса, но совсем не того, о котором сегодня можно было бы подумать.

Допустим, у нас есть три дерева. Таких, как на картинке 1. Вот код для воспроизведения:

library(ape)
tr1 <- ape::read.tree(text = "((1,2),(3,4));")
tr2 <- ape::read.tree(text = "((1,3),(2,4));")
tr3 <- ape::read.tree(text = "((1,2),(3,4));")


par(mfrow = c(1, 3), mar = c(5,1,5,1), cex = 1)
plot.phylo(tr1, tip.color = 2 )
plot.phylo(tr2, tip.color = 2 )
plot.phylo(tr3, tip.color = 2 )

Кластеры 1-2, 3-4 встречаются в двух деревьях, остальные лишь в одном. Задача — найти наиболее устойчивые кластеры методом простого большинства. Это можно сделать при помощи консенсусных деревьев.

Сначала считаем консенсус, аргумент p указывает, что кластер должен быть представлен не менее, чем в половине деревьев. Также уточняем, что наши деревья укоренены:

cons <- consensus(list(tr1, tr2, tr3), p = 0.5, rooted = TRUE)

Консенсус тоже можно изобразить; дополнительно для узлов укажем силу консенсуса (2/3 = 0.67):

par(mfrow = c(1,1), mar = c(5,5,5,5))
plot.phylo(cons, tip.color = 2)
nodelabels(round(cons$node.label[3],2), 7, frame = "c", cex = 0.7)
nodelabels(round(cons$node.label[2],2), 6, bg = "yellow")

Это очень простое консенсусное дерево, построенное по методу простого большинства, которое позволяет «обобщить» несколько разных деревьев. Полезно не только эволюционным биологам, но и тем, кто работает с текстами. Чуть позже расскажу, как.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94
Forwarded from aGricolaMZ
https://vectors2024.tilda.ws/digitalpast

тезисы до завтра а сама конференция 18 по 21 апреля
5
RAntiquity
🌳 Придется вам потерпеть еще несколько постов про #филогенетика, пока я разбираюсь в теме. Этот пост о силе консенсуса, но совсем не того, о котором сегодня можно было бы подумать. Допустим, у нас есть три дерева. Таких, как на картинке 1. Вот код для воспроизведения:…
🌳У консенсусных деревьев есть один очевидный недостаток. Допустим, у нас есть три неукорененных дерева, как на рис. 1.

library(ape)
tr1 <- ape::read.tree(text = "((1,2),(3,4));")
tr2 <- ape::read.tree(text = "((1,3),(2,4));")
tr3 <- ape::read.tree(text = "((1,4),(2,3));")

par(mfrow = c(1, 3), mar = c(5,0,5,0), cex = 1)
plot.phylo(tr1, tip.color = 2, type= "unrooted" )
plot.phylo(tr2, tip.color = 2, type= "unrooted" )
plot.phylo(tr3, tip.color = 2, type= "unrooted" )

Консенсусное дерево в таком случае никак не поможет: оно не допускает значений p < 0.5. Проверьте сами: код ниже вернет садовые вилы 🔱

par(mfrow = c(1,1))
cons.tr <- consensus(list(tr1, tr2, tr3), p = 0.5, rooted = F)
plot.phylo(cons)

В таких случаях на помощь приходит консенсусная сеть, строится с использованием пакета phangorn. На входе отдаем объект класса multiPhylo, это по сути просто три дерева в одном букете.

library(phangorn)
library(TreeTools)
mph <- as.multiPhylo(list(tr1, tr2, tr3))

cons.nw <- consensusNet(mph, prob = 0.3, rooted = F)

Объект cons.nw относится к классу networx. Его можно изобразить как в двух, так и в трех измерениях. Вот так (рис. 2):

plot(cons.nw, type = "2D")

Но вообще говоря самое веселое — это сеть в 3D. #филогенетика

library(rgl) 
movie3d(spin3d(axis=c(0,1,0), rpm=3), duration=10, dir = ".", type = "gif", webshot = F)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Земля в иллюминаторе… 👩‍🚀
9👌2👍1🥰1
Forwarded from Vox mediaevistae
В следующую среду в 16.30 по московскому времени (20.30 по Красноярску) состоится заседание семинара «Цифровая среда», на котором я расскажу про автоматическую транскрипцию рукописей. Это будет обзорное выступление, на котором я обрисую историю распознавания печатного и рукописного текста, опишу пайплайн распознавания рукописи (способы добычи изображения; его сегментация на зоны (на примере kraken и YOLO рассмотрим два подхода: семантическую сегментацию и обнаружение объектов); сегментация на строки (здесь тоже поговорим про несколько подходов: paths, baselines, bounding boxes); сама транскрипция) и скажу несколько слов про то, как «улучшить» полученную транскрипцию (в частности, про свежие эксперименты с трансформерами).
Дискутантом выступит Глеб Шмидт, который великолепно разбирается и в тематическом моделировании, и в факторном анализе, и в стилометрии, и в HTR.
Чтобы послушать и присоединиться к дискуссии, нужно зарегистрироваться здесь.
🔥11👍41
🌳 Снова #филогенетика. Зачем строить несколько деревьев?

Дело в том, что результат кластеризации зависит от нескольких параметров:
📌 число предикторов (например, наиболее частотных слов для разных произведений);
📌 расстояние, которое используется для попарных сравнений (евклидово, городских кварталов, др.)
📌 метод связи при иерархической кластеризации (метод полной связи, метод средней связи, метод Уорда и др.);

Иногда добавление или удаление буквально одного слова меняет структуру дерева. Поэтому бывает необходимо сравнить разные деревья. Выше мы уже видели один способ это сделать — консенсусное дерево. Но оно дает уже результат обобщения, а иногда интересно посмотреть на исходные деревья, сопоставить их попарно.

Для этого удобно построить tanglegram, в R это проще всего сделать при помощи пакета dendextend.


library(stylo)
library(dendextend)

data("galbraith")
data <- as.data.frame.matrix(galbraith)[c(1,2, 9, 10, 16, 17),c(1:30)]
distmx <- dist(scale(data))

d1 <- as.dendrogram(hclust(distmx, method ="average")) %>% set("labels_col", value = c("skyblue", "orange", "grey40"), k=3) %>% set("branches_k_color", value = c("skyblue", "orange", "grey40"), k = 3)

d2 <- as.dendrogram(hclust(distmx, method ="ward.D2")) %>% set("labels_col", value = c("skyblue", "orange", "grey40"), k=3) %>% set("branches_k_color", value = c("skyblue", "orange", "grey40"), k = 3)

dlist <- dendlist(d1, d2)

par(family = "Arial Bold")
tanglegram(dlist, common_subtrees_color_lines = FALSE, highlight_distinct_edges = TRUE, highlight_branches_lwd=FALSE, margin_inner=10, lwd=2, axes=FALSE, main_left = "Cредняя", main_right = "Уорд", lab.cex = 1.3)


На картинке видно, что одно из сочинений Дж. Роулинг попадает в разные кластеры в зависимости от метода связи, хотя для кластеризации использовалась одна и та же матрица расстояний.
Please open Telegram to view this post
VIEW IN TELEGRAM
😱6👍4
🌳 Консенсусное дерево легко построить в пакете Stylo, в том числе используя GUI (графический интерфейс).

Нажимать на кнопки легко и приятно, но есть нюансы. Во-первых, не получится кастомизировать внешний вид дерева, а, во-вторых, в Stylo реализована достаточно специфическая процедура бутстрепа (повторных выборок).

Вот что пишут разработчики:

Under the FEATURES tab, users can define the minutes of the MFW division and sampling procedure, using the increment, the minimum and maximum parameters. For minimum = 100, maximum = 3000, and increment = 50, stylo will run subsequent analyses for the following frequency bands: 100 MFW, 50–150 MFW, 100–200 MFW, ..., 2900–2950 MFW, 2950–3000 MFW.



Для консенсуса нужно много деревьев, и Stylo будет строить эти деревья в заданном интервале. Это значит, что последние деревья будут построены уже не на основе самой частотной лексики, т.е. скорее всего на них отразится тематика текстов, входящих в корпус.

В некоторых случаях это работает неплохо. Например, для моего тренировочного греческого корпуса хватило 100-500 mfw, и почти все авторы (кроме Аристида) благополучно разошлись по своим домикам на дереве 🏡 (см. рисунок).

Но, возможно, вам понадобятся другие идеи для консенсуса. Разные расстояния. Разные методы кластеризации. Случайные выборки из первых двух сотен слов или еще что-то. Тогда придется самим строить сразу множество деревьев. Как это сделать грамотно, расскажем в следующих выпусках нашего кулинарного цифрового шоу. #филогенетика
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍1
🗣Приглашаем на презентацию проектных работ студентов 2го курса магистратуры по Digital Humanities НИУ ВШЭ.

В этом году темы проектов посвящены исследованию деколонизации музеев, индвидиуального стиля Платона, особенностям советского кинопроката, библиографии детской литературы, наскальной живописи, многобразию лингвистики как науки и сохранению цифровой памяти.

📆 Встреча пройдет 23 марта в 16.00.

Регистрация по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥81
Если изучить изнанку функции stylo(), которая вызывает GUI в одноименном пакете, то можно заметить, что за консенсусное дерево там отвечает пакет для работы с филогенетическими данными под названием Ape 🦍

Что делает машинка, когда вы заказываете у нее консенсусное дерево? Принимает на входе матрицу с 1 … N столбцами, в которых хранится частотность для слов. Потом отбирает первые сколько-то слов (скажем, сотню или сколько скажете), считает расстояние, строит на основе матрицы расстояний дерево, складывает его в корзинку. Потом берет следующую сотню слов, считает расстояние, строит дерево, складывает в корзинку… Ну вы поняли. Получается букет деревьев.

Звучит как итерация, а такие задачи в R решаются при помощи цикла for или пакета purrr. Функции map() из пакета purrr надо вручить другую функцию, у меня это пользовательская get_tree(). Она берет случайные 100 столбцов в таблице с частотностями galbraith из пакета Stylо, считает евклидово расстояние между документами и строит дерево.

library(stylo)
library(ape)
library(purrr)

data("galbraith")
df <- as.data.frame.matrix(galbraith)[c(1,2, 9, 10, 16, 17),]

get_tree <- function(df) {
X <- df[ , sample(3000, replace = T, size = 100)]
distmx <- dist(scale(X))
tr <- as.phylo(hclust(distmx))
tr
}

Запускаем ее 4 раза при помощи map, получаем список из 4-х деревьев. Тем же map() печатаем сразу четыре дерева одной строчкой кода 🧙🪄

set.seed(123)
result <- map(1:4, ~get_tree(df))

# отдельные деревья
par(mfrow = c(2, 2), mar = c(1,1,1,1))
map(1:4, ~print(plot(result[[.]])))

Так можно построить и 100, и 1000 деревьев, попробуйте. О том, что с ними делать дальше — чуть позже. #филогенетика
Please open Telegram to view this post
VIEW IN TELEGRAM
6
На результат стилометрического исследования древнегреческих текстов может влиять не только жанр и тема (как у нормальных людей), но и особенности кодировки, диалекта и даже неприятная издательская практика писать по-разному несобственные дифтонги (т.е. дифтонги с первым долгим гласным).

Как объяснить машине, что iota adscriptum и iota subscriptum — это одно и то же? И к автору не имеет никакого отношения. Для гласных, которые всегда долгие, можно настроить автозамену. Вот мое решение:


library(stringr)

ortho_fix <- function(string) { string %>% str_replace_all( c("ῶι"="ῷ", "ωι"="ῳ", "ὧι"="ᾧ", "ὦι"="ᾦ", "ηι"="ῃ", "ῆι"="ῇ", "ἦι"="ᾖ", "ἧι"="ᾗ")) }

test_string <- c("ἑκάστωι ἔργωι καὶ πράγματι", "σὺν πολλῶι χρόνωι", "καὶ τῆι ἐξ ὀλίγου χρόνου εὐδοξίαι")

test_string %>% ortho_fix()


А вот с альфой так поступить не получится, потому что αι не всегда можно заменить на ᾳ. В раздумьях.
#regex
🤝63👍1
Рано расслабляться. Еще сигма в середине слова (на стыке морфем) в старых изданиях.
😭4😱2
Forwarded from DH CLOUD
Вестник Digital Humanities: что делают цифровые гуманитарии с большими языковыми моделями и где смотреть (и оценивать!) достижения DH-хозяйства

Несмотря на непрекращающиеся драматические события в разных точках планеты, научная DH-жизнь продолжается. А значит, и мы продолжаем рассказывать о ней в новых выпусках «Вестника Digital Humanities». В мартовском выпуске — отчет о недавней немецкой DH-конференции и LLM-воркшопе на ней, статья о конкуренции гуманитариев с большими языковыми моделями, анонс семинара по цифровому распознаванию рукописей и приглашение проголосовать за DH-awards этого года.

https://mailchi.mp/d654715e70ab/digital-humanities-16506350?e=ed4cb54ab6
5🔥2
Наука (в широком смысле techne) отличается от ненауки рефлексией по поводу инструментов и методов. Землемер вполне способен на практике применять теорему Пифагора, но он никогда не задумается о проблеме соизмеримости, связанной с этой теоремой. Дачник, соорудивший стол из старой дверной створки, — еще не плотник. Обращение к цифровым методам, когда оно диктуется не внутренней потребностью исследователя, а внешними обстроятельствами, неизбежно принимает вид «бриколажа».

В наши дни бриколер — это тот, кто творит сам, самостоятельно, используя подручные средства в отличие от средств, используемых специалистом. …Бриколер способен выполнить огромное число разнообразных задач. Но в отличие от инженера ни одну из них он не ставит в зависимость от добывания сырья и инструментов, задуманных и обеспечиваемых в соответствии с проектом: мир его инструментов замкнут, и правило игры всегда состоит в том, чтобы устраиваться с помощью «подручных средств», то есть на каждый момент с ограниченной совокупностью причудливо подобранных инструментов и материалов… Совокупность бриколерских средств определяется не каким-либо проектом (что бы предполагало, как у инженера, существование и наборов инструментов, и проектов разного рода, по меньшей мере в теории); она определяется лишь своим инструментальным использованием, иначе говоря, если употребить язык бриколера, элементы собираются и сохраняются по принципу «это может всегда сгодиться».

К. Леви-Стросс. Неприрученная мысль (1962).

Форсированная цифровизация — это массовое производство бриколеров. А науке, как учил великий Гумбольдт, нужны свобода и досуг.
🔥105
6 апреля 2024 г. для студентов гуманитарного факультета НИУ ВШЭ стартует новый факультатив под названием «Количественные методы в гуманитарных науках: критическое введение».

Среди авторов этого курса — руководитель образовательной программы «Цифровые методы в гуманитарных науках» Борис Орехов и преподаватель этой программы Ольга Алиева.

🤔 Уровень теоретического осмысления “цифрового поворота” далеко не всегда успевает за технологическим прогрессом. Из-за этого даже в серьезной литературе можно встретить довольно наивное представление о том, что главная заслуга количественных методов — это повышение “объективности” и “точности”.

💡 Существующие учебники и онлайн-курсы, заявленные как обзор цифровых методов для гуманитариев, обычно представляют собой практические пособия по программированию и избегают теоретических вопросов. Наш курс поможет критически взглянуть на инструментарий DH в современных гуманитарных науках.

‼️ Курс будет полезен не только студентам бакалавриата, на которых он рассчитан, но и более широкой аудитории студентов и исследователей, которые пытаются разобраться в новейшем цифровом инструментарии. В частности, факультатив станет хорошим введением в проблематику для тех, кто рассматривает для себя возможность поступления на магистерскую программу «Цифровые методы в гуманитарных науках».

🔗 Всю информацию о курсе, видео лекций и полезные ссылки мы будем собирать на сайте http://criticaldh.ru/

Первая лекция курса состоится уже 6 апреля 🔽#criticaldh
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥8🔥43
RAntiquity
6 апреля 2024 г. для студентов гуманитарного факультета НИУ ВШЭ стартует новый факультатив под названием «Количественные методы в гуманитарных науках: критическое введение». Среди авторов этого курса — руководитель образовательной программы «Цифровые…
Неужели Вселенная состоит из потоков данных и действительно ценность каждого определяется вкладом в обработку данных? Зачем цифровые гуманитарии собирают данные о прошлом, настоящем и будущем? И как эти данные смогут помочь понять мир вокруг нас?

Обо всем этом в первой лекции курса “Количественные методы в гуманитарных науках” расскажет Андрей Володин — кандидат исторических наук, доцент кафедры исторической информатики исторического факультета МГУ, руководитель Института цифровых гуманитарных исследований СФУ.

🗓 Лекция состоится 6 апреля 2024 г. онлайн на платформе Zoom в 13:00 по Москве (ссылка). #criticaldh
🔥103👍3
Продолжаю разбираться с филогенетическими методами.

Представьте, что у вас есть такая нехитрая сеть, как на рис. 1. Расстояние между двумя узлами определяется как длина кратчайшего пути между ними. Поэтому несложно посчитать матрицу расстояний на основе сети. Я это сделала на листочке, а результат сохранила в R, он на второй картинке. Можете перепроверить 😊


mx <- matrix(data = c(0, 0.07, 0.12, 0.12, 0.07, 0, 0.13, 0.09, 0.12, 0.13, 0, 0.06, 0.12, 0.09, 0.06, 0), nrow = 4)
colnames(mx) <- c("a", "b", "c", "d")
rownames(mx) <- colnames(mx)

dm <- as.dist(mx)


Но верно и обратное! От матрицы расстояний можно перейти к длине ребер. Для нашей простой матрицы длина горизонтальных ребер, например, считается по формуле:

1/2 (max(D[a,d]+D[b,c], D[a,c]+D[b,d])-D[a,b] – D[d,c])

1/2 (max(0.12+0.13, 0.12+0.09) – 0.07 – 0.06) = 0.06


Аналогичным образом считается длина вертикальных ребер. Формула сработает максимум для четырех таксонов, для более сложных структур понадобится метод наименьших квадратов, но пока смотрим простой пример.

Чтобы не мучиться с ручными подсчетами, берем функцию neighborNet из пакета phangorn (за наводку спасибо agricolamz).


library(phangorn)
nnet <- neighborNet(dm)

plot(nnet, show.edge.label = T, edge.label = nnet$edge.length, edge.color = "grey", col.edge.label = "navy")


Если аргументу edge.label оставить значение по умолчанию, то на картинке увидите номер сплита (на рис. 3 красным). У каждого сплита есть свой вес (рассчитанный методом наименьших квадратов). Его можно достать из объекта nnet:


w = attr(nnet$splits, "weights")


Это можно понять так: чтобы попасть из пунка b в пункт d, нужно сложить веса для сплитов 4, 5 и 1:


w[4] + w[5] + w[1]


Это вернет нам 0.09. Сверяемся с матрицей расстояний — все верно! #филогенетика
👍51🤯1