第N1周:one-hot独热编码

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

一、OneHot独热编码原理

独热编码(One-Hot Encoding)是一种将分类数据转换为二进制向量的方法,其中每个类别对应一个唯一的二进制向量。在独热编码中,每个类别都由一个长度为n的向量表示,其中n是所有可能类别的数量。向量中的每个位置对应一个可能的类别,该位置上的值是1或0,表示该实例是否属于该类别。
例如,假设我们有四个类别:A、B、C和D。使用独热编码,我们可以将它们表示为:

  • A: [1, 0, 0, 0]
  • B: [0, 1, 0, 0]
  • C: [0, 0, 1, 0]
  • D: [0, 0, 0, 1]
    独热编码的优点包括:
  1. 处理分类数据:独热编码允许分类数据被模型处理,因为许多机器学习算法和神经网络都要求输入是数字。
  2. 无序性:独热编码假设类别之间没有顺序关系,每个类别都是相互独立的。
  3. 稀疏性:独热编码产生的向量通常是稀疏的,这意味着大多数位置的值都是0,只有少数几个位置的值是1。这种稀疏性在某些情况下可以减少模型复杂性。
  4. 兼容性:独热编码可以与多种机器学习算法兼容,包括逻辑回归、支持向量机、决策树、随机森林、神经网络等。
    在Python中,可以使用多种库来实现独热编码,例如pandasget_dummies函数或scikit-learnOneHotEncoder类。以下是使用scikit-learn进行独热编码的一个简单例子:
from sklearn.preprocessing import OneHotEncoder
# 创建一个独热编码器实例
encoder = OneHotEncoder()
# 假设我们有以下类别数据
data = [['A'], ['B'], ['C'], ['A'], ['B'], ['C'], ['D']]
# 对数据进行拟合和变换
encoded_data = encoder.fit_transform(data)
# 打印编码后的数据
print(encoded_data.toarray())

在这个例子中,encoded_data将是一个稀疏矩阵,如果想要查看完整的矩阵,可以使用toarray()方法将其转换为密集数组。

二、jieba库对中文句子的划分

jieba库是一个流行的中文分词工具,它使用了一种基于前缀词典的分词算法。以下是jieba进行句子划分的基本步骤:

  1. 词典匹配jieba首先使用一个预先构建的词典来查找句子中的词语。这个词典包含了大量的中文词语和它们的频率信息。jieba会尝试在句子中找到所有可能的词语匹配。
  2. 动态规划:对于句子中词典中没有的词语,jieba使用基于动态规划的最大概率分词算法来划分。这种方法考虑了词语的相邻关系,以及每个词语出现的概率,以找到最可能的分词结果。
  3. HMM模型:对于一些歧义较大的句子,jieba还会使用一个隐马尔可夫模型(HMM)来进一步确定分词。HMM模型可以帮助识别一些未知词语,并处理一些特殊情况,如中文中的姓氏和双音节词语。
  4. 双向扫描jieba还会进行双向扫描,即从前往后和从后往前分别进行分词,然后结合两者的结果,以得到最佳的划分。
  5. 用户词典jieba允许用户添加自定义的词典,这样可以在分词时考虑到特定领域的词汇或者新词。
  6. 分词模式jieba提供了几种不同的分词模式,包括精确模式(尝试将句子最精确地切开,适合文本分析)、全模式(把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义)和搜索引擎模式(在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎构建索引的分词)。
    通过这些步骤,jieba能够高效地对中文句子进行准确的分词,适用于各种自然语言处理任务。

三、案例

import torch
import torch.nn.functional as F
import jieba

texts=['比较直观的编码方式是采用上面提到的字典序列。例如,对于一个有三个类别的问题,可以用1、2和3分别表示这三个类别。但是,这种编码方式存在一个问题,就是模型可能会错误地认为不同类别之间存在一些顺序或距离关系,而实际上这些关系可能是不存在的或者不具有实际意义的。',
'为了避免这种问题,引入了one-hot编码(也称独热编码)。one-hot编码的基本思想是将每个类别映射到一个向量,其中只有一个元素的值为1,其余元素的值为0。这样,每个类别之间就是相互独立的,不存在顺序或距离关系。例如,对于三个类别的情况,可以使用如下的one-hot编码:']

word_index = {}
index_word = {}
for i, word in enumerate(set("".join(texts))):
    word_index[word] = i
    index_word[i] = word
    
# 将文本转化为整数序列
sequences = [[word_index[word] for word in text] for text in texts]

# 获取词汇表大小
vocab_size = len(word_index)

# 将整数序列转化为one-hot编码
one_hot_results = torch.zeros(len(texts), vocab_size)
for i, seq in enumerate(sequences):
    one_hot_results[i, seq] = 1
    
# 打印结果
print("词汇表:")
print(word_index)
print("\n文本:")
print(texts)
print("\n文本序列:")
print(sequences)
print("\nOne-Hot编码:")
print(one_hot_results)

在这里插入图片描述

这段代码的目的是将给定的文本数据集转换为独热编码(One-Hot Encoding)。下面是这段代码的内部运行逻辑的逐步解释:

  1. 构建词汇表
    • texts 是一个包含多个句子的列表。
    • 使用 set("".join(texts)) 将所有句子连接成一个长字符串,并去重得到所有独特的字符。
    • word_indexindex_word 是两个空字典,用于存储字符到整数的映射和整数到字符的映射。
    • 使用 enumerate 遍历所有独特的字符,为每个字符分配一个唯一的整数索引。
  2. 将文本转化为整数序列
    • sequences 是一个空列表,用于存储每个句子转换成的整数序列。
    • 遍历 texts 中的每个句子,对于句子中的每个字符,使用 word_index 字典找到对应的整数索引,并将这些索引组成一个列表,作为句子的整数序列。
  3. 获取词汇表大小
    • vocab_size 存储了词汇表的大小,即独特字符的数量。
  4. 将整数序列转化为独热编码
    • one_hot_results 是一个初始化为0的二维张量(Tensor),大小为 len(texts) 行(每个句子一行)和 vocab_size 列(每个字符一列)。
    • 遍历 sequences 中的每个整数序列,对于序列中的每个整数(代表一个字符),在 one_hot_results 的对应行和列的位置上标记为1。这样,每个句子的独热编码就形成了,其中每行只有一个1,其他都是0,1的位置对应于句子中字符的索引。
      最终,one_hot_results 包含了所有句子的独热编码。每个句子的独热编码是一个稀疏的向量,其中只有字符实际出现的位置被标记为1,其余位置都是0。这种表示方法使得每个字符都是相互独立的,没有任何顺序或距离关系,这正是独热编码的目的。

四、个人笔记

这次在导入库时候遇到了一些小问题.
在这里插入图片描述
在这里插入图片描述
这种情况下我选择cmd下安装然后把jupyter运行目录改到安装目录下就可以了
在这里插入图片描述
在jupyter中改一下这个路径就可以完美使用了。(注意斜杠的方向,如果安装了代码自动补全的会自动把斜杠补对,这个还挺好的)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/588349.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何下载AndroidStudio旧版本

文章目录 1. Android官方网站2. 往下滑找到历史版本归档3. 同意软件下载条款协议4. 下载旧版本Androidstudio1. Android官方网站 点击 Android官网AS下载页面 https://developer.android.google.cn/studio 进入AndroidStuido最新版下载页面,如下图: 2. 往下滑找到历史版本归…

Delta lake with Java--利用spark sql操作数据2

上一篇文章尝试了建库,建表,插入数据,还差删除和更新,所以在这篇文章补充一下,代码很简单,具体如下: import org.apache.spark.sql.SaveMode; import org.apache.spark.sql.SparkSession;publi…

谈一谈电影《飞驰人生》

文章目录 1.概述2.电影情节3.观后感 1.概述 电影《飞驰人生》是一部关于赛车的电影,主要演员是沈腾,因此电影中有不少的喜剧片段,不过电影整体偏向于剧情类电影。该电影的导演是韩寒,就是哪个曾经写出高分高考作文的考生&#xf…

【跟我学RISC-V】(一)认识RISC-V指令集并搭建实验环境

写在前面 现在计算机的体系架构正是发展得如火如荼的时候,占领桌面端市场的x86架构、占领移动端市场的arm架构、在服务器市场仍有一定地位的mips架构、国产自研的指令集loongarch架构、还有我现在要讲到的新型开源开放的RISC-V指令集架构。 我先说一说我的学习经历…

十二、视觉内容生成模型

1 判别式模型和生成式模型 1. 判别式模型 学习策略函数 Y f ( X ) Yf(X) Yf(X)或者条件概率 P ( Y ∣ X ) P(Y|X) P(Y∣X)不能反映训练数据本身的特性学习成本低,需要的训练样本少无法转为生成式 2. 生成式模型 学习联合概率密度分布 P ( X ∣ Y ) P(X|Y) P(X∣…

C++ 矩阵

目录 了解矩阵的数学原理(大学线性代数) 矩阵及转置矩阵 矩阵乘法 矩阵快速幂 相伴矩阵模板 [相伴矩阵,快速矩阵幂]CSES1722 Fibonacci Numbers 了解矩阵的数学原理(大学线性代数) 矩阵及转置矩阵 这里A就是一个矩阵&…

动态数据结构中的表扩张性:摊还分析、伪代码与C语言实现

动态数据结构中的表扩张性:摊还分析、伪代码与C语言实现 引言表扩张性的概念摊还分析在表扩张性中的应用伪代码示例:TABLE-INSERT操作C语言实现结论 引言 在处理数据结构时,尤其是表(或数组),我们经常面临…

Swift - 可选项(Optional)

文章目录 Swift - 可选项(Optional)1. 可选项(Optional)2. 强制解包(Forced Unwrapping)3. 判断可选项是否包含值4. 可选项绑定(Optional Binding)5. 等价写法6. while循环中使用可选…

DVWA 靶场命令注入通关解析

介绍 命令注入(Command Injection)是一种常见的安全漏洞,它允许攻击者通过在应用程序中执行恶意命令来获取系统权限或执行非授权操作。 命令注入通常发生在需要将用户输入作为命令执行的地方,例如Web应用程序的输入框、参数传递…

制作一个RISC-V的操作系统十五-软件定时器

文章目录 定时器分类定时器相关分类软件定时器设计初始化创建删除触发流程图形示意 优化代码 定时器分类 硬件定时器:由硬件频率和触发限制的大小决定,只有一个,精度高 软件定时器:基于硬件定时器实现,精度大于等于硬…

搭建vue3组件库(三): CSS架构之BEM

文章目录 1. 通过 JS 生成 BEM 规范名称1.1 初始化 hooks 目录1.2 创建 BEM 命名空间函数1.3 通过 SCSS 生成 BEM 规范样式 2. 测试 BEM 规范 BEM 是由 Yandex 团队提出的一种 CSS 命名方法论,即 Block(块)、Element(元素&#xf…

AngularJS 的生命周期和基础语法

AngularJS 的生命周期和基础语法 文章目录 AngularJS 的生命周期和基础语法1. 使用步骤2. 生命周期钩子函数3. 点击事件4. if 语句1. if 形式2. if else 形式 5. for 语句6. switch 语句7. 双向数据绑定 1. 使用步骤 // 1. 要使用哪个钩子函数,就先引入 import { O…

Flutter笔记:Widgets Easier组件库(4)使用按钮组

Flutter笔记 Widgets Easier组件库(4):使用按钮组 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress…

vue3 vite 路由去中心化(modules文件夹自动导入router)

通过路由去中心化可实现多人写作开发,不怕文件不停修改导致的冲突,modules中的文件可自动导入到index.js中 // 自动导入模块 const files import.meta.globEager(./modules/**.js); const modules {} for (const key in files) {modules[key.replace…

【C语言加油站】字符函数与字符串函数

字符函数与字符串函数 导言一、字符分类函数1.1 字符分类函数的用法 二、字符转换函数2.1 字符转换函数的用法 三、字符串函数3.1 成员3.2 strlen函数3.2.1 size_t类型3.2.2 strlen的易错点3.2.2 strlen的使用3.2.3 strlen与sizeof 3.3 strcpy函数和strncpy函数3.3.1 strcpy和s…

Messari 报告摘要 :Covalent Network(CQT)2024 年第一季度表现

摘要: 尽管 CQT 代币流通供应量增加了 20%(新增 1.04 亿枚 CQT),但 CQT 的质押百分比仅从 2023 年第一季度的 22% 增长到了 2024 年第一季度的 29%。 CQT 的市值季度环比增长了 28%,多次达到 2.75 亿美元&#xff0c…

脑筋急转弯在线问答

页面效果 点击“显示答案”按钮&#xff0c;显示参考答案。 页面代码 <% layout(/layouts/default.html, {title: 脑筋急转弯管理, libs: [dataGrid]}){ %> <div class"main-content"><div class"box box-main"><div class"bo…

【介绍下大数据组件之Storm】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【Java】 对象的比较【比较器】

登神长阶 第七阶 Java对象的比较 &#x1f3b7;一.Java对象的比较 &#x1fa97;1.基于引用的比较 基于引用的比较在Java中使用运算符进行。它主要检查两个对象是否引用内存中的相同位置。以下是基于引用的比较的详细介绍&#xff1a; 使用运算符&#xff1a; 运算符用于比…

【Qt QML】Frame组件

Frame&#xff08;框架&#xff09;包含在&#xff1a; import QtQuick.Controls继承自Pane控件。用于在可视框架内布局一组逻辑控件。简单来说就是用来包裹和突出显示其他可视元素。Frame不提供自己的布局&#xff0c;但需要自己对元素位置进行设置和定位&#xff0c;例如通过…
最新文章