Как решить ключевые вопросы, связанные с точностью классификации

Как решить ключевые вопросы, связанные с точностью классификации

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

Несбалансированные классы

Точность может быть обманчивой, если набор данных содержит неравномерные классификации. Например, модель, которая просто предсказывает мажоритарный класс, будет точной на 99 %, если доминирующий класс включает 99 % данных. К сожалению, он не сможет должным образом классифицировать класс меньшинства. Для решения этой проблемы следует использовать другие показатели, включая точность, отзыв и оценку F1.

5 наиболее распространенных методов, которые можно использовать для решения проблемы несбалансированного класса точности классификации: 

Ключевые вопросы, связанные с точностью классификации


Несбалансированный класс | Инженерия знаний

  1. Повышение дискретизации класса меньшинства: в этом методе мы дублируем примеры в классе меньшинства, чтобы сбалансировать распределение классов. 
  2. Понижение дискретизации мажоритарного класса: в этом методе мы удаляем примеры из мажоритарного класса, чтобы сбалансировать распределение классов. 
  3. Генерация синтетических данных: метод, используемый для создания новых выборок класса меньшинства. Когда случайный шум вводится в существующие примеры или путем создания новых примеров посредством интерполяции или экстраполяции, происходит генерация синтетических данных. 
  4. Обнаружение аномалий: в этом методе класс меньшинства рассматривается как аномалия, тогда как класс большинства рассматривается как нормальные данные. 
  5. Изменение порога принятия решения: этот метод настраивает порог принятия решения классификатора, чтобы повысить чувствительность к классу меньшинства. 

Переоснащение 

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

 
 

Ключевые вопросы, связанные с точностью классификации


Переоснащение | Фрипик

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

  1. Обучите модель с большим количеством данных: это позволяет алгоритму лучше обнаруживать сигнал и минимизировать ошибки. 
  2. Регуляризация: это включает в себя добавление штрафного члена к функции стоимости во время обучения, что помогает ограничить сложность модели и уменьшить переоснащение. 
  3. Перекрестная проверка. Этот метод помогает оценить производительность модели, разделив данные на обучающие и проверочные наборы, а затем обучив и оценив модель на каждом наборе. 
  4. Методы ансамбля. Это метод, который включает в себя обучение нескольких моделей, а затем объединение их прогнозов, что помогает уменьшить дисперсию и погрешность модели. 

Предвзятые данные 

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

Ключевые вопросы, связанные с точностью классификации


Предвзятость данных | Эксплориум

  1. Один из методов заключается в обеспечении того, чтобы используемые данные были репрезентативными для совокупности, которую они предназначены для моделирования. Это можно сделать путем случайной выборки данных из совокупности или с помощью таких методов, как избыточная или недостаточная выборка, чтобы сбалансировать данные. 
  2. Тщательно протестируйте и оцените модели, измеряя уровни точности для различных демографических категорий и чувствительных групп. Это может помочь выявить любые погрешности в данных и модели и устранить их. 
  3. Помните о предвзятости наблюдателя, которая возникает, когда вы сознательно или случайно навязываете свои мнения или желания данным. Этого можно добиться, зная о возможной предвзятости и принимая меры для ее минимизации. 
  4. Используйте методы предварительной обработки, чтобы удалить или исправить смещение данных. Например, используя такие методы, как очистка данных, нормализация данных и масштабирование данных. 

Матрица путаницы 

 

 

Ключевые вопросы, связанные с точностью классификации

Изображение автора

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

  1. Проанализируйте значения в матрице и определите любые закономерности или тенденции в ошибках. Например, если имеется много ложноотрицательных результатов, это может указывать на то, что модель недостаточно чувствительна к определенным классам. 
  2. Используйте такие показатели, как точность, полнота и F1-оценка, чтобы оценить производительность модели. Эти метрики обеспечивают более подробное понимание того, как работает модель, и могут помочь определить любые конкретные области, в которых модель испытывает трудности. 
  3. Отрегулируйте порог модели, если порог слишком высок или слишком низок, это может привести к тому, что модель будет делать больше ложных положительных или ложных отрицательных результатов. 
  4. Используйте ансамблевые методы, такие как бэггинг и бустинг, которые могут помочь улучшить производительность модели за счет объединения прогнозов нескольких моделей. 

Вклад точности классификации в машинное обучение 

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

Оригинальный источник статьи: https://www.kdnuggets.com/

#machinelearning #classification #accuracy #key #issues 

What is GEEK

Buddha Community

Как решить ключевые вопросы, связанные с точностью классификации

Как решить ключевые вопросы, связанные с точностью классификации

Как решить ключевые вопросы, связанные с точностью классификации

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

Несбалансированные классы

Точность может быть обманчивой, если набор данных содержит неравномерные классификации. Например, модель, которая просто предсказывает мажоритарный класс, будет точной на 99 %, если доминирующий класс включает 99 % данных. К сожалению, он не сможет должным образом классифицировать класс меньшинства. Для решения этой проблемы следует использовать другие показатели, включая точность, отзыв и оценку F1.

5 наиболее распространенных методов, которые можно использовать для решения проблемы несбалансированного класса точности классификации: 

Ключевые вопросы, связанные с точностью классификации


Несбалансированный класс | Инженерия знаний

  1. Повышение дискретизации класса меньшинства: в этом методе мы дублируем примеры в классе меньшинства, чтобы сбалансировать распределение классов. 
  2. Понижение дискретизации мажоритарного класса: в этом методе мы удаляем примеры из мажоритарного класса, чтобы сбалансировать распределение классов. 
  3. Генерация синтетических данных: метод, используемый для создания новых выборок класса меньшинства. Когда случайный шум вводится в существующие примеры или путем создания новых примеров посредством интерполяции или экстраполяции, происходит генерация синтетических данных. 
  4. Обнаружение аномалий: в этом методе класс меньшинства рассматривается как аномалия, тогда как класс большинства рассматривается как нормальные данные. 
  5. Изменение порога принятия решения: этот метод настраивает порог принятия решения классификатора, чтобы повысить чувствительность к классу меньшинства. 

Переоснащение 

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

 
 

Ключевые вопросы, связанные с точностью классификации


Переоснащение | Фрипик

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

  1. Обучите модель с большим количеством данных: это позволяет алгоритму лучше обнаруживать сигнал и минимизировать ошибки. 
  2. Регуляризация: это включает в себя добавление штрафного члена к функции стоимости во время обучения, что помогает ограничить сложность модели и уменьшить переоснащение. 
  3. Перекрестная проверка. Этот метод помогает оценить производительность модели, разделив данные на обучающие и проверочные наборы, а затем обучив и оценив модель на каждом наборе. 
  4. Методы ансамбля. Это метод, который включает в себя обучение нескольких моделей, а затем объединение их прогнозов, что помогает уменьшить дисперсию и погрешность модели. 

Предвзятые данные 

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

Ключевые вопросы, связанные с точностью классификации


Предвзятость данных | Эксплориум

  1. Один из методов заключается в обеспечении того, чтобы используемые данные были репрезентативными для совокупности, которую они предназначены для моделирования. Это можно сделать путем случайной выборки данных из совокупности или с помощью таких методов, как избыточная или недостаточная выборка, чтобы сбалансировать данные. 
  2. Тщательно протестируйте и оцените модели, измеряя уровни точности для различных демографических категорий и чувствительных групп. Это может помочь выявить любые погрешности в данных и модели и устранить их. 
  3. Помните о предвзятости наблюдателя, которая возникает, когда вы сознательно или случайно навязываете свои мнения или желания данным. Этого можно добиться, зная о возможной предвзятости и принимая меры для ее минимизации. 
  4. Используйте методы предварительной обработки, чтобы удалить или исправить смещение данных. Например, используя такие методы, как очистка данных, нормализация данных и масштабирование данных. 

Матрица путаницы 

 

 

Ключевые вопросы, связанные с точностью классификации

Изображение автора

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

  1. Проанализируйте значения в матрице и определите любые закономерности или тенденции в ошибках. Например, если имеется много ложноотрицательных результатов, это может указывать на то, что модель недостаточно чувствительна к определенным классам. 
  2. Используйте такие показатели, как точность, полнота и F1-оценка, чтобы оценить производительность модели. Эти метрики обеспечивают более подробное понимание того, как работает модель, и могут помочь определить любые конкретные области, в которых модель испытывает трудности. 
  3. Отрегулируйте порог модели, если порог слишком высок или слишком низок, это может привести к тому, что модель будет делать больше ложных положительных или ложных отрицательных результатов. 
  4. Используйте ансамблевые методы, такие как бэггинг и бустинг, которые могут помочь улучшить производительность модели за счет объединения прогнозов нескольких моделей. 

Вклад точности классификации в машинное обучение 

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

Оригинальный источник статьи: https://www.kdnuggets.com/

#machinelearning #classification #accuracy #key #issues 

Как решить Python с игнорированием недопустимого дистрибутива

В следующей статье мы рассмотрим Python, игнорирующий недопустимое распределение. Почему это происходит и как устранить это предупреждение. Это непонятная ошибка. Другими словами, вероятность встретить это предупреждение мала. Однако, поскольку вы здесь, это означает, что вы действительно столкнулись с этим. Не волнуйся. Эта статья подробно описывает это и попытается устранить эту ошибку.

Почему происходит игнорирование Python недопустимого распределения?

Иногда, когда вы пытаетесь установить пакет, например, вы можете столкнуться с ошибкой, подобной этой.

Предупреждение: игнорирование недопустимого распределенияПредупреждение: игнорирование недопустимого распределения

Это происходит потому, что когда pip обновляет или удаляет пакет, он переименовывает имя пакета, заменяя первую букву на «~» или «тильду», что является нормальным поведением. Проблема здесь в том, что pip переименовывает свой собственный пакет (pip -> ~ip) без его восстановления.

Всякий раз, когда выполняется обновление pip, пакет pip по умолчанию переименовывается в ~ip, а затем после удаления ~ip устанавливается новый пакет pip. Итак, если ваше обновление остановится между ними, оно оставит ~ ip как есть.

Этот сломанный пункт можно легко исправить или подавить. Но пока вы это не исправите, будет отображаться вышеуказанная ошибка.

Как подавить игнорирование предупреждений о недопустимом распространении?

Чтобы подавить все предупреждения, вы можете сделать следующее. Однако важно понимать, что подавление предупреждений не устраняет ошибку. Он просто скрывает предупреждающее сообщение.

pip --disable-pip-version-check install <module_name>

Как решить, что Python игнорирует предупреждение о недопустимом распространении?

точка

Это происходит из-за многовариантной установки библиотек. Иногда conda или pip не могли удалить версии. Вместо этого он переименовывает его в «~ip».

Поэтому рекомендуется найти пакеты сайтов в установке python (обычно расположенные в pythoninstallation/Lib/site-packages/), выполнить поиск «~ip» и удалить такие папки, которые начинаются с ~ip. После этого проблема с игнорированием недействительной раздачи будет решена, и вы больше не будете получать подобных предупреждений.

Игнорирование недопустимого распределения при установке библиотеки pipИгнорирование недопустимого распределения при установке библиотеки pip

после удаления ~<package_name>

установка pip прошла успешно, предупреждений не возникало

установка pip прошла успешно, предупреждений не возникало

анаконда

Anaconda — это менеджер пакетов с открытым исходным кодом, похожий на pip. Более того, шансы предупредить python об игнорировании недопустимого дистрибутива, появляющегося в анаконде, очень малы, поскольку они используют свой собственный исполняемый файл conda. Это обеспечивает стабильную и быструю установку с очень малой вероятностью появления ошибок. Если в вашей библиотеке сайта нет ~ip, нет причин для появления этого предупреждения.

пичарм

Точно так же у pycharm есть специальный графический интерфейс для установки и удаления пакетов для проекта. Если пакет не работает должным образом, просто удалите его и переустановите. Поэтому маловероятно, что в pycharm произойдет игнорирование недопустимого распределения.

Как починить сломанный пип?

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

  • Загрузите следующий файл и сохраните его как get-pip.py.
  • Откройте командную строку.
  • Откройте каталог, в котором был сохранен файл get-pip.py.
  • После этого запустите get-pip.py как python get-pip.py. Это установит колесо и пип.
  • Используйте pip –version, чтобы проверить, правильно ли он установлен.

Часто задаваемые вопросы

Как принудительно переустановить PIP?

Чтобы принудительно переустановить пакет pip, вам нужно будет сделать, например, следующее:
pip install pandas –no-cache-dir

Почему мы не должны игнорировать Python, игнорируя предупреждения о недопустимом дистрибутиве?

Мы не должны игнорировать Python, игнорируя предупреждения о недопустимом дистрибутиве, потому что некоторые зависимые пакеты могут быть не установлены. Кроме того, это может привести к более нежелательным ошибкам.

Вывод

В следующей статье мы обсудили, почему появляется предупреждение Python, т. е. игнорирование недопустимого распределения, и рассмотрели способ устранения предупреждающего сообщения. В современных IDE, таких как Pycharm и Anaconda, появление этой ошибки маловероятно, поскольку эти IDE имеют собственный процесс установки пакетов.

Источник:  https://www.pythonpool.com

#python 

Как выключить компьютер с помощью Python с примером

В этом уроке мы узнаем, как выключить компьютер с помощью Python. Чтобы завершить работу вашей системы с помощью языка программирования Python, вы должны иметь некоторое представление о модуле ОС в Python. Он предустановлен в стандартной библиотеке Python, поэтому вам не нужно писать команду pip, чтобы установить его в вашей среде Python. От чтения или записи файла до выключения вашей системы с помощью Python модуль ОС можно использовать в любой задаче, которая зависит от операционной системы вашей системы.

import os
os.system('shutdown -s')

Чтобы выключить компьютер с помощью Python, обязательно сохраните и закройте все запущенные файлы. Теперь вот как выключить компьютер с помощью Python:

import os
  
shutdown = input("Do you wish to shutdown your computer ? (yes / no): ")
  
if shutdown == 'no':
    exit()
else:
    os.system("shutdown /s /t 1")

Вот программа Python, которая попросит пользователя выключить компьютер, предоставив вариант «Да» или «Нет». Кроме того, когда вы набираете «да» и затем нажимаете клавишу ENTER, система мгновенно выключается.

Как скачать видео с YouTube с помощью Python

YouTube — очень популярный сайт для обмена видео. Загрузка видео с YouTube — непростая задача. Загрузите загрузчик и получите видео, используя его, или перейдите на любой другой веб-сайт, который загружает видео и сохраняет его на вашем компьютере. Используя Python, эта задача очень проста. Несколько строк кода загрузят для вас видео с YouTube. Для этого существует библиотека Python с именем «pytube». pytube — это легкая библиотека Python без зависимостей, которая используется для загрузки видео из Интернета.

Установка Python

Откройте терминал и выполните следующую команду

pip install pytube3

Получение заголовка

Первый шаг — импортировать класс YouTube из pytubeмодуля.

from pytube import YouTube
url = 'Your URL goes here'
my_video = YouTube(url)

Теперь получите URL-адрес, я сохраняю его в формате url. Затем я вызываю YouTubeметод my_videoи передаю URL.

print(my_video.title)

Теперь давайте получим название видео YouTube, используя titleметод. Далее, давайте получим миниатюру изображения.

Получение эскиза изображения

Чтобы получить миниатюру видео YouTube, мы будем использовать этот thumbnail_urlметод.

print(my_video.thumbnail_url)

Printметод отобразит миниатюру видео YouTube.

Загрузка видео с YouTube

Чтобы загрузить видео с YouTube, нам нужно установить stream resolutionпервый.

my_video = my_video.streams.get_highest_resolution()
or
my_video = my_video.streams.first()

Вы можете выбрать первое разрешение потока или выбрать его вместе с разрешением потока.

Если вы хотите получить все разрешение потока для видео, а затем выбрать подходящее, вы можете использовать следующую команду.

for stream in my_video.streams:
    print(stream)

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

Двигаемся вперед, теперь давайте загрузим видео! Мы будем использовать этот downloadметод для конкретного потока для загрузки видео с YouTube.

my_video.download()

Ваше видео YouTube будет загружено в ту же папку, где находится ваш скрипт Python.

Как построить блокчейн с нуля с помощью Go

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

Блокчейны являются базовой технологией для многих децентрализованных приложений и криптовалют. Они считаются одним из самых значительных открытий этого поколения. Несмотря на то, что блокчейн находится на начальной стадии, он уже применим во многих отраслях и создает новые рабочие места и возможности для разработчиков, художников, геймеров, авторов контента и многих других.

Это руководство направлено на то, чтобы научить вас, как работают блокчейны, и научит вас создавать их с нуля с помощью Go. Если вы слышали о блокчейнах, но все еще не знаете, как они работают, эта статья для вас.

Зачем строить блокчейн с Go?

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

Go также отлично подходит для создания приложений, требующих параллелизма и параллелизма (например, блокчейнов), благодаря его способности создавать тысячи горутин и управлять ими. Go реализует автоматическую сборку мусора и управление стеком в своей системе времени выполнения.

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

Что такое блокчейн?

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

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

Что такое блок?

Мы упоминали блоки ранее, и вам может быть интересно, что это такое. Проще говоря, блок - это группа данных, и несколько блоков объединяются в цепочку блоков.

Каждый блок в цепочке блоков обладает следующими свойствами:

  • Данные для записи в цепочку блоков, например данные транзакции
  • Хеш блока, идентификатор блока, сгенерированного с использованием методов криптографии.
  • Хеш предыдущего блока, который является криптографическим хешем последнего блока в цепочке блоков. Он записывается в каждый блок, чтобы связать его с цепочкой и повысить ее безопасность.
  • Отметка времени, когда блок был создан и добавлен в цепочку блоков.
  • Доказательство работы (PoW), которое представляет собой количество усилий, затраченных на получение хэша текущего блока. Мы объясним это подробно позже в руководстве.

Начиная

Давайте начнем с создания нового проекта Go и импорта всех необходимых пакетов для построения нашей цепочки блоков. Создайте файл с именем blockchain.goи сохраните в нем следующий код:

package main

import (
        "crypto/sha256"
        "encoding/json"
        "fmt"
        "strconv"
        "strings"
        "time"
)

Затем мы создадим настраиваемый тип блока для хранения данных нашей цепочки блоков. Добавьте в blockchain.goфайл следующий код :

type Block struct {data map [string] interface {} hash string previousHash string timestamp time.Time pow int}

Затем мы создадим собственный Blockchainтип, содержащий наши блоки. Добавьте в blockchain.goфайл следующий код :

type Blockchain struct {
        genesisBlock Block
        chain        []Block
        difficulty   int
}

genesisBlockСвойство представляет первый блок добавляется к blockchain. Напротив, difficultyсвойство определяет минимальные усилия, которые майнеры должны предпринять для добычи блока и включения его в цепочку блоков.

Расчет хэша блока

Как мы обсуждали ранее, хеш блока - это его идентификатор, сгенерированный с помощью криптографии. Мы получим хэш блока для нашей цепочки блоков путем хеширования предыдущего хэша блока, текущих данных блока, отметки времени и PoW с использованием алгоритма SHA256 .

Создадим для нашего Blockтипа метод , реализующий эту функциональность:

func (b Block) calculateHash() string {
        data, _ := json.Marshal(b.data)
        blockData := b.previousHash + string(data) + b.timestamp.String() + strconv.Itoa(b.pow)
        blockHash := sha256.Sum256([]byte(blockData))
        return fmt.Sprintf("%x", blockHash)
}

В приведенном выше коде мы сделали следующее:

  • Конвертировал данные блока в формат JSON
  • Объединены предыдущий хэш блока, данные, временная метка и доказательство работы (PoW).
  • Хеширование более ранней конкатенации с алгоритмом SHA256
  • Возвращен результат хеширования по основанию 16 со строчными буквами для AF.

Добыча новых блоков

Майнинг нового блока включает в себя создание хэша блока, который начинается с желаемого количества нулей (желаемое число - это сложность майнинга). Это означает, что если сложность блокчейна равна трем, вам необходимо сгенерировать хэш блока, который начинается, "000"например, с "0009a1bfb506…".

Поскольку мы получаем хэш блока из его содержимого, нам нужно продолжать изменять значение PoW текущего блока, пока мы не получим хеш, который удовлетворяет нашему условию добычи (начальные нули> сложность).

Чтобы реализовать это, мы создадим mine()метод для нашего Blockтипа, который будет продолжать увеличивать значение PoW и вычислять хэш блока, пока мы не получим действительный хеш.

Добавьте в blockchain.goфайл следующий код :

func (b *Block) mine(difficulty int) {
        for !strings.HasPrefix(b.hash, strings.Repeat("0", difficulty)) {
                b.pow++
                b.hash = b.calculateHash()
        }
}

Создание блока генезиса

Затем мы напишем функцию, которая создает блок генезиса для нашей цепочки блоков и возвращает новый экземпляр Blockchainтипа.

Добавьте в blockchain.goфайл следующий код :

func CreateBlockchain(difficulty int) Blockchain {
        genesisBlock := Block{
                hash:      "0",
                timestamp: time.Now(),
        }
        return Blockchain{
                genesisBlock,
                []Block{genesisBlock},
                difficulty,
        }
}

Здесь мы устанавливаем хэш нашего блока генезиса на "0". Поскольку это первый блок в цепочке блоков, предыдущий хэш не имеет значения, а свойство данных пусто.

Затем мы создали новый экземпляр Blockchainтипа и сохранили генезисный блок вместе со сложностью блокчейна.

Добавление новых блоков в блокчейн

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

Добавьте в blockchain.goфайл следующий код :

func (b *Blockchain) addBlock(from, to string, amount float64) {
        blockData := map[string]interface{}{
                "from":   from,
                "to":     to,
                "amount": amount,
        }
        lastBlock := b.chain[len(b.chain)-1]
        newBlock := Block{
                data:         blockData,
                previousHash: lastBlock.hash,
                timestamp:    time.Now(),
        }
        newBlock.mine(b.difficulty)
        b.chain = append(b.chain, newBlock)
}

Здесь мы создали addBlockметод для Blockchainтипа, который выполняет следующие действия:

  • Собирает детали транзакции (отправитель, получатель и сумма перевода)
  • Создает новый блок с деталями транзакции
  • Майнит новый блок с помощью хэша предыдущего блока, текущих данных блока и сгенерированного PoW
  • Добавляет вновь созданный блок в цепочку блоков.

Проверка действительности блокчейна

Мы успешно создали блокчейн, который может записывать транзакции, и нам нужна функция, которая проверяет, действителен ли блокчейн, чтобы мы знали, что никакие транзакции не были подделаны.

Добавьте в blockchain.goфайл следующий код :

func (b Blockchain) isValid() bool {
        for i := range b.chain[1:] {
                previousBlock := b.chain[i]
                currentBlock := b.chain[i+1]
                if currentBlock.hash != currentBlock.calculateHash() || currentBlock.previousHash != previousBlock.hash {
                        return false
                }
        }
        return true
}

Здесь мы пересчитали хэш каждого блока, сравнили их с сохраненными хеш-значениями других блоков и проверили, равно ли предыдущее хеш-значение любого другого блока хэш-значению блока перед ним. Если какая-либо из проверок завершилась неудачно, это значит, что блокчейн был взломан.

Использование блокчейна для совершения транзакций

Теперь у нас есть полностью функциональный блокчейн! Давайте создадим main()функцию, чтобы показать ее использование.

Добавьте в blockchain.goфайл следующий код :

func main() {
        // create a new blockchain instance with a mining difficulty of 2
        blockchain := CreateBlockchain(2)

        // record transactions on the blockchain for Alice, Bob, and John
        blockchain.addBlock("Alice", "Bob", 5)
        blockchain.addBlock("John", "Bob", 2)

        // check if the blockchain is valid; expecting true
        fmt.Println(blockchain.isValid())
}

Вывод

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

Исходный код блокчейна Go доступен в виде GitHub Gist . Мне не терпится увидеть удивительные вещи, которые вы создаете с помощью Go, поскольку он хорошо подходит для приложений, в которых эффективность и производительность являются главным приоритетом.