加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 什么是无监督学习?
    • 无监督学习 vs. 监督学习:有点像放羊
    • 无监督学习的主要算法
    • 无监督学习的挑战
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

白话机器学习-第三章-无监督学习

08/27 09:00
472
阅读需 49 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在我们这个数据驱动的世界中,机器学习正在迅速改变着各行各业。无论是推荐你喜欢的电影,还是帮助医生诊断疾病,机器学习的应用无处不在。当谈到机器学习时,大多数人首先想到的是训练机器进行预测或分类的“监督学习”。但是,有一种同样强大但更神秘的学习方式,叫做“无监督学习”。今天,我们将揭开无监督学习的面纱,探索它的工作原理、应用场景以及几种经典的算法。

什么是无监督学习?

在解释无监督学习之前,先来简单回顾一下有监督学习。在监督学习中,我们有一个标注良好的数据集,每个数据样本都有一个明确的标签,比如“猫”或“狗”。机器学习模型通过学习这些已知的输入(特征)与输出(标签)之间的关系,来对新数据进行预测。

然而,在许多现实场景中,标注数据是稀缺的。标注数据集往往昂贵且耗时,因为每个数据样本都需要人工干预进行标签标注。这时候,无监督学习就派上用场了。无监督学习处理的是未标注的数据,也就是说,模型在训练过程中并不知道每个数据样本对应的类别或标签。它的任务是从数据中发现隐藏的模式、结构或关系。

简单来说,无监督学习就像是在一个陌生的环境中探险,没有地图,但它仍然可以通过观察地形、寻找规律来理解这个环境。

无监督学习 vs. 监督学习:有点像放羊

我们常说的监督学习就像你给羊群安排了一名牧羊人,告诉它们去哪里吃草(用标签告诉机器哪些是正确的答案)。无监督学习则不一样,它更像是把羊群放在一大片草原上,让它们自己去找最好吃的草,自己摸索出哪里才是最佳的草地(没有标签,机器自己摸索数据中的模式)。

无监督学习的应用场景

虽然无监督学习看似复杂且缺少明确的目标,但它在许多领域中都有着广泛的应用。以下是几个常见的场景:

聚类分析:这是无监督学习的一个经典应用。通过聚类,模型可以将相似的数据点归为一组。比如,在市场营销中,企业可以使用聚类算法将客户分成不同的群体,从而进行更有针对性的营销策略。

异常检测:无监督学习也被广泛用于检测异常行为。例如,在金融领域,它可以帮助检测欺诈交易,或者在制造业中发现生产线上的异常情况。

降维与特征提取:当数据集维度非常高时,降维技术可以将高维数据映射到低维空间,以便于可视化和分析。主成分分析(PCA)就是一种常见的无监督降维方法。

生成模型:无监督学习还可以用于生成新数据,例如通过生成对抗网络(GANs)生成逼真的图像,或者通过变分自编码器(VAE)生成合成数据。

无监督学习的主要算法

让我们深入了解几种常见的无监督学习算法,看看它们是如何工作的。

1. 聚类算法

聚类算法是机器学习中一种非常有趣的技术,简单来说,它就是在一堆杂乱无章的数据中,把相似的东西放在一起,分成几组。这就像是把各种水果分成不同的篮子,苹果放一篮,橘子放一篮,香蕉放一篮。

举个例子

假如你是超市的管理员,在超市收银处,你能看到很多顾客在买单前决定不需要购买的物品,比如水果、蔬菜、零食、饮料等等。你的任务是把这些东西归类放好:苹果、香蕉、西瓜是水果区的物品,薯片、饼干是零食区的物品,牛奶、可乐是饮料区的物品。你没必要知道它们的名字,只要根据它们的外形、颜色、大小等特征来分类就行了。

常见的聚类算法

有几种常见的聚类算法,每一种都有自己独特的“分组”方式:

K-Means聚类:这是最常见的聚类算法之一。K-Means会先随便选几个点作为“组长”(我们叫它“质心”),然后看看哪些数据点(比如商品)离哪个“组长”最近,就把这些数据分到这个“组长”管辖的组里。接着,组长会调整位置,让自己尽量站在组员们的中间,这样来回几次,直到组员们不再更换组长位置为止。这个算法简单高效,但有时候你得提前知道要分多少组(比如K值)。

层次聚类:这个算法有点像搭积木。它可以从小到大把相似的点先凑成小团体,然后这些小团体再合并成更大的团体,最后形成一个“家族树”。当然,你也可以反过来,从一个大团体开始,逐步拆分出更小的团体。这个算法能让你看到数据的层次结构,比如从“水果”到“苹果”再到“红苹果”。

DBSCAN:这是一个基于密度的算法。想象一下,你在一个派对上观察人群,那些站得很近、聚在一起的人就是一组,而那些站得远远的、独自一人的人就被当作“独行侠”或“噪声”处理。DBSCAN特别擅长发现形状不规则的群体,而不只是像K-Means那样找圆形或球形的群体。

聚类的应用

聚类算法可以用在很多地方,比如:

客户分群:在市场营销中,公司可以用聚类算法把客户分成不同的群体,比如“喜欢买奢侈品的客户”和“喜欢打折商品的客户”,然后针对每个群体设计不同的营销策略。

图像压缩:你可以用聚类算法来减少图像中的颜色种类,比如把相近的颜色归为一类,这样能减少图像文件的大小,同时保留主要的视觉效果。

异常检测:网络安全领域,聚类算法可以用来发现异常的行为模式,比如一台电脑突然开始发送大量数据,可能就是被黑客入侵了。

2. 降维算法

降维算法是机器学习中一个非常实用的工具,它的作用就像是整理房间里的杂物,把那些看起来很乱的东西重新归类摆放,让整个房间看起来更整洁,更容易找到东西。

什么是降维?

想象一下,你有一个巨大的衣柜,里面堆满了各种各样的东西:衣服、鞋子、帽子,还有一些看似无关的小物件。这个衣柜乱得不得了,每件东西都占据了一个“维度”,你感觉整个衣柜就是一团乱麻,找东西的时候总是毫无头绪。

现在,降维算法就像一个聪明的整理专家,它走进你的衣柜,开始认真观察。首先,它发现有些物品本质上是相似的,比如你有好几件不同颜色的T恤,这些T恤虽然在颜色上有区别,但它们都是同一类衣物。因此,它决定把颜色的差异稍微淡化一点,只保留“T恤”这个大类。然后,它发现你那些五颜六色的围巾虽然各不相同,但它们都属于“配饰”这一类,所以也把它们归到一起。

经过一番整理,降维算法把那些看似复杂、冗余的信息简化了——它把不太重要的差异“折叠”起来,只保留了那些真正让你衣柜有条理的信息。最后,整理专家让你的衣柜变得井井有条,你不再被无数的细节淹没,而是能够快速找到你需要的东西,因为它已经把你衣柜的“维度”降到了一个更容易管理的水平,同时还保留了所有重要的类别和关键信息。

为什么要降维?

在实际应用中,我们经常会遇到“高维数据”,也就是包含非常多特征的数据。这些特征可能包含了大量冗余信息,甚至会增加分析的复杂性,导致“维度诅咒”(也就是数据太多了,反而难以分析)。降维的目的是简化数据结构,把高维数据转换成低维数据,让我们更容易理解和分析,同时保留原始数据中的主要信息。

常见的降维算法

降维算法有很多种,但这里介绍几种最常见的:

主成分分析(PCA):

主成分分析是一种非常经典的降维算法。PCA的工作原理是找到数据中方差最大的一些方向,这些方向代表了数据中最重要的信息。简单来说,它就是试图找到数据最“广”的几条线,把数据投影到这些线上,丢掉那些不重要的“窄”方向。结果是,你得到了一个维度更少但信息密度更高的数据集。

打个比方,假如你在一个足球场上看一堆人跑步,从某个角度看过去,他们可能看起来都挤在一条线上,完全看不出谁跑得快谁跑得慢。但如果你换个角度,从更广的方向看,你就能更清楚地看到每个人的位置和速度。PCA就是在找这个最佳视角。

t-SNE(t-分布随机邻居嵌入):

t-SNE是一种非线性的降维算法,主要用于数据可视化。它擅长把高维数据映射到二维或三维空间里,同时保留数据点之间的局部结构关系。换句话说,t-SNE更在意的是近邻数据点之间的关系,而不是全局结构。

想象一下,你有一大堆不同颜色的珠子,你希望把它们摆放在一张纸上,颜色相近的珠子放在一起。t-SNE就像一个精细的排列师,帮你把这些珠子按照颜色、亮度、饱和度等特征排成一个美观的图案。

线性判别分析(LDA):

虽然LDA常被用于分类任务,但它也有降维的效果。LDA试图找到能最好地分离不同类别的数据的方向。它不是像PCA那样找“最广”的方向,而是找那些能把不同类别数据分开的方向。

举个例子,假设你有一组学生考试成绩的数据,你想通过降维来看看这些学生是否可以按成绩分成“优秀”、“中等”和“差”三个等级。LDA会找到一个方向,让不同等级的学生尽量分开,以便你能更清晰地看到他们的分布。

降维的应用

降维算法被广泛应用于各种领域,比如:

数据可视化:通过降维,把高维数据投影到二维或三维空间,方便我们用图表来观察数据的结构和模式。

特征提取:在处理大数据集时,降维可以帮助我们提取出最重要的特征,从而减少计算量,提高算法的性能。

噪声去除:有时候,数据中的一些维度可能是噪声,通过降维我们可以减少这些噪声的影响,使数据更纯净。

降维算法就像是一种数据的“精简术”,帮助我们从复杂的、高维的原始数据中提取出最有用的信息,让数据变得更简单、更容易理解。

3. 关联规则学习

关联规则学习是一种很有趣的机器学习方法,它的主要任务是从大量数据中发现隐藏的模式和关系。你可以把它想象成是超市里的“购物篮分析”——通过分析大家买东西的习惯,找出哪些商品经常一起出现在购物车里。

什么是关联规则学习?

关联规则学习的核心就是寻找数据中的“如果……那么……”的规则。比如,你可能会发现“如果有人买了牛奶,那么他很可能也会买面包”。这些发现可以用来制定促销策略、优化商品摆放,甚至是设计更好的推荐系统。

关联规则学习的基本概念

要理解关联规则学习,我们先来看看几个基本概念:

支持度(Support):支持度就是一种模式出现的频率。比如,如果10%的购物篮里同时有牛奶和面包,那么我们就说“牛奶 -> 面包”这个规则的支持度是10%。支持度高的规则意味着它们在数据中出现得比较频繁。

置信度(Confidence):置信度表示的是在购买了牛奶的情况下,购买面包的概率有多大。如果80%的买牛奶的人也买了面包,那么“牛奶 -> 面包”这个规则的置信度就是80%。置信度高的规则表明两者的关联性比较强。

提升度(Lift):提升度是用来衡量两个事件之间是否真的存在关联。如果提升度大于1,说明买牛奶的人比一般情况下更有可能买面包,这表明两者之间确实存在某种关联。如果提升度等于1,说明买面包的概率跟买不买牛奶没有关系。

关联规则学习的应用场景

关联规则学习可以应用在很多领域,以下是几个常见的例子:

超市购物篮分析:这是关联规则学习的经典应用。超市可以通过分析顾客的购买习惯,发现哪些商品经常一起购买,比如“啤酒和薯片”、“牙刷和牙膏”。通过这些发现,超市可以将相关商品摆在一起,或者设计捆绑销售的促销活动。

推荐系统:在电商平台,关联规则学习可以用来推荐商品。如果一个顾客购买了某件商品,系统可以根据关联规则推荐其他相关的商品,比如“买了手机,推荐手机壳”和“买了书,推荐其他同类书籍”。

医疗诊断在医疗领域,关联规则学习可以用来发现某些症状和疾病之间的关系,帮助医生更好地诊断病人。比如,通过分析大量病人的数据,可以发现“长期咳嗽 -> 高血压”的关联,从而提醒医生注意患者可能存在的其他健康问题。

网络安全:在网络安全中,关联规则学习可以帮助发现异常的访问模式,识别潜在的安全威胁。比如,通过分析服务器日志,可以发现“多次失败登录尝试 -> 恶意攻击”的规则,从而提前预警。

关联规则学习的常用算法

有几种经典的算法可以用来进行关联规则学习:

Apriori算法:这是最早的关联规则学习算法之一。Apriori算法通过逐步扩大频繁项集来发现规则,但它的计算量很大,因此更适合中小规模的数据集。

FP-Growth算法:FP-Growth是一种比Apriori更高效的算法,它通过构建一种叫做“频繁模式树”的结构来发现频繁项集。这个算法可以在大规模数据中更快地找到关联规则。

关联规则学习就是帮我们从海量数据中找出“如果发生了A,那么很可能会发生B”这种有用的规律。它的应用非常广泛,从超市的商品摆放到电商的推荐系统,再到医疗诊断和网络安全,都可以看到它的身影。通过这些规则,我们可以更好地理解数据背后的模式和趋势,从而做出更明智的决策。总的来说,关联规则学习是一种非常实用且强大的工具,帮助我们在复杂的数据世界中找到有价值的信息。

4. 生成模型

生成模型是机器学习中的一类算法,它们的任务是“创造”新数据,听起来有点像是机器学习界的“艺术家”。生成模型可以根据已经学到的知识,生成看起来很真实的新样本。比如,通过学习大量的猫咪图片,一个生成模型就能“画”出一张从未见过的猫咪图片,看起来和真的一样。

什么是生成模型?

生成模型的核心目标是学会数据背后的分布规律,然后根据这个规律来生成新的数据样本。通俗点说,假如你给模型看了很多风景画,它会慢慢学会画出类似风格的画作,即使这些画从未存在过。

生成模型的应用

生成模型在很多领域有着广泛的应用,以下是几个例子:

图像生成:生成模型可以用来生成逼真的图像,比如人脸、风景甚至艺术作品。你可能见过一些AI生成的虚拟人物,他们看起来和真实的人几乎没有区别,这就是生成模型的功劳。

文本生成:在自然语言处理领域,生成模型可以用来创作文章、写诗或者生成对话。像我们现在聊天的AI助手,背后就有生成模型的支持,它能根据上下文来生成合理的回答。

数据增强:在某些情况下,训练数据可能比较稀缺。生成模型可以用来合成新的数据样本,帮助增强训练集的多样性,提高模型的性能。比如,生成更多的虚拟手写数字来训练一个数字识别系统。

风格迁移:生成模型还能做“风格迁移”的工作,比如把一张普通的照片变成梵高风格的画,或者把白天的风景图像转换成夜晚的样子。

常见的生成模型

生成模型有几种常见的类型,每一种都有它独特的生成方式:

生成对抗网络(GANs):

生成对抗网络是近年来非常流行的一种生成模型。它由两个部分组成:一个生成器和一个判别器。生成器负责生成假的数据,判别器则负责判断这些数据是真是假。生成器和判别器不断对抗,生成器努力生成越来越真实的数据,以至于判别器无法分辨真假。最终,生成器能生成出非常逼真的数据。

比如,GANs可以用来生成虚拟人脸图片,甚至是编造从未存在的街景。这种对抗的方式让生成模型不断改进,最终生成的数据非常接近真实数据。

变分自编码器(VAE):

变分自编码器是一种基于概率的生成模型。VAE通过学习数据的“潜在表示”来生成新样本。你可以把VAE想象成一个压缩器,它把数据压缩到一个简化的版本,然后再解压还原成原始数据的样子。在这个过程中,它学会了如何生成看起来合理的新数据。

VAE在生成连续的数据(比如图像、音频)方面表现得很好,并且相比于GANs更容易训练和解释。

朴素贝叶斯生成模型:

这是一种比较简单的生成模型,基于贝叶斯定理。它假设所有特征是独立的(虽然这个假设有时不太准确),然后根据这些特征生成新数据。朴素贝叶斯生成模型通常用于分类任务,但也可以用来生成数据。

生成模型就像是数据的“创造者”,它们通过学习已有的数据,生成出新的数据样本。这些模型在图像生成、文本生成、数据增强等方面有着广泛的应用。通过不断改进和发展,生成模型正在逐渐突破极限,生成越来越逼真的数据,不论是在虚拟世界中创造图像,还是在现实应用中增强数据,它们都展现出了巨大的潜力。

生成模型让机器学习不仅能“理解”数据,还能“创造”数据,为我们打开了通往无限可能的大门。

无监督学习的挑战

尽管无监督学习有着广泛的应用和强大的功能,但它也面临着许多挑战。

缺乏标签指导:无监督学习的最大挑战之一是缺乏标签的指导,这使得模型的性能评估变得更加困难。由于没有明确的“正确答案”,很难量化模型的准确性。

结果解释性差:由于无监督学习模型的结果通常是数据的潜在结构或模式,这些结构或模式可能并不直观或容易解释。因此,在实际应用中,需要结合领域知识来解释模型的结果。

对初始条件敏感:许多无监督学习算法,如K-Means,强烈依赖于初始条件的选择。这意味着不同的初始值可能导致截然不同的结果,增加了结果的不确定性。

随着数据量的不断增加和计算能力的提升,无监督学习的应用前景越来越广阔。未来的研究可能集中在以下几个方面:

更强的模型解释性:研究人员正在开发能够提供更好解释性的无监督学习算法,以便在保持高效性能的同时,提高结果的可理解性。

融合有监督与无监督学习:半监督学习和自监督学习是将有监督学习与无监督学习相结合的两种方法。这些方法通过利用部分标注数据来提高模型的学习能力,并且在某些任务上已经展示出优异的性能。

无监督学习在新领域的应用:随着新技术的发展,无监督学习正在被应用到越来越多的领域,如自动驾驶、自然语言处理和生物医学等。在这些新领域中,无监督学习可以帮助发现数据中的潜在模式,从而推动技术的进步。

无监督学习就像是给机器一副眼镜,让它能从一堆混乱的数据中看出其中的奥秘。它并不是要让机器得出一个明确的答案,而是帮助它在探索中找到隐藏的模式和关联。就像我们在人生的旅途中,有时候也需要停下来,自己思考和发现问题的答案。

这就是无监督学习,一个机器学习中的“自我发现”过程。如果说监督学习是机器“按图索骥”,那么无监督学习就是它“摸着石头过河”——虽然没那么直截了当,但也许会发现一些出乎意料的惊喜。

实践环节:

下面我们随机介绍几个算法:

a. K-Means聚类算法的代码示例

我们需要生成两个簇的二维数据,每个簇包含100个点,分别围绕着 [2, 2] 和 [-2, -2] 这两个中心点。我们使用KMeans类来创建K-Means模型,并指定簇的数量为2(即 n_clusters=2)。然后,我们用生成的数据 X 来训练模型,即执行聚类操作。我们打印出每个簇的中心点 kmeans.cluster_centers_,以及每个数据点所属的簇标签 kmeans.labels_。使用matplotlib库将聚类结果进行可视化。数据点根据聚类的结果使用不同的颜色标识,簇的中心用红色的叉号表示。

import numpy as npimport osimport matplotlib.pyplot as pltfrom sklearn.cluster import KMeans

# 设置matplotlib的中文字体plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为SimHei,如果使用微软雅黑,则替换为'Microsoft YaHei'plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
# 解决KMeans在Windows系统上使用MKL时的内存泄漏问题os.environ["OMP_NUM_THREADS"] = "1"
# 1. 生成模拟数据# 创建两个簇的样本数据np.random.seed(0)X = np.vstack((    np.random.normal(loc=[2, 2], scale=0.5, size=(100, 2)),    np.random.normal(loc=[-2, -2], scale=0.5, size=(100, 2)),))
# 2. 使用K-Means进行聚类# 我们假设有两个簇kmeans = KMeans(n_clusters=2, random_state=0, n_init=10)kmeans.fit(X)
# 3. 输出聚类结果# kmeans.labels_ 包含了每个数据点的簇标签print("簇中心: n", kmeans.cluster_centers_)print("每个点的簇标签: n", kmeans.labels_)
# 4. 可视化结果plt.figure(figsize=(8, 6))
# 绘制原始数据点plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis', marker='o', s=50, edgecolor='k')
# 绘制簇中心plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], c='red', marker='x', s=200, label='Centroids')
plt.title("K-Means 聚类")plt.xlabel("X1")plt.ylabel("X2")plt.legend()plt.show()
# 输出簇中心:  [[-2.07153917 -2.05647532] [ 1.99952116  2.07138933]]每个点的簇标签:  [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

b. 层次聚类(Hierarchical Clustering)聚类算法的代码示例

我们生成了四个簇的二维数据,每个簇包含50个点,分别围绕着 [2, 2], [-2, -2], [2, -2] 和 [-2, 2] 这四个中心点。使用 AgglomerativeClustering 类进行凝聚层次聚类(自下而上)。我们设置 n_clusters=4,意味着希望最终得到4个簇。fit_predict 方法将数据点聚类,并返回每个数据点的簇标签。使用 matplotlib 来绘制聚类后的数据点,不同簇使用不同的颜色表示。linkage 函数使用 ward 方法计算层次聚类的链接矩阵(树状图中的节点关系),这是创建树状图的基础。使用 dendrogram 函数将层次聚类的树状结构可视化。树状图显示了数据点之间的层次关系和合并顺序,越低的分支代表越早被合并的数据点。

import numpy as npimport matplotlib.pyplot as pltfrom sklearn.cluster import AgglomerativeClusteringfrom scipy.cluster.hierarchy import dendrogram, linkage
# 设置matplotlib的中文字体plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为SimHei,如果使用微软雅黑,则替换为'Microsoft YaHei'plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

# 1. 生成模拟数据np.random.seed(0)X = np.vstack((    np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),    np.random.normal(loc=[-2, -2], scale=0.5, size=(50, 2)),    np.random.normal(loc=[2, -2], scale=0.5, size=(50, 2)),    np.random.normal(loc=[-2, 2], scale=0.5, size=(50, 2)),))
# 2. 使用层次聚类(凝聚层次聚类)clustering = AgglomerativeClustering(n_clusters=4)labels = clustering.fit_predict(X)
# 3. 可视化结果(聚类结果)plt.figure(figsize=(8, 6))plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', marker='o', s=50, edgecolor='k')plt.title("层次聚类结果")plt.xlabel("X1")plt.ylabel("X2")plt.show()
# 4. 计算层次聚类的链接矩阵Z = linkage(X, 'ward')
# 5. 可视化层次结构(树状图)plt.figure(figsize=(10, 7))dendrogram(Z)plt.title("层次聚类的树状图")plt.xlabel("数据点编号")plt.ylabel("距离")plt.show()
# 输出

c. 支持度(Support)关联学习算法的代码示例

我们创建了一个模拟的超市购物数据,每个交易都是一组购买的商品,例如['鸡蛋', '西红柿', '豆腐']表示一次购买了这三样商品。使用TransactionEncoder将原始交易数据转换为适合算法处理的布尔型数据框(DataFrame),每列代表一个商品,每行代表一次交易。如果某个商品出现在某次交易中,则该位置为True,否则为False。

使用apriori函数来计算所有可能的频繁项集及其对应的支持度。min_support参数设置为0.3,意味着我们只关心那些至少在30%的交易中出现的项集。打印出所有频繁项集以及它们的支持度。结果中会列出每个频繁项集(如{'土豆', '西红柿'})及其对应的支持度(如0.375)。

import pandas as pdfrom mlxtend.preprocessing import TransactionEncoderfrom mlxtend.frequent_patterns import apriori
# 1. 准备交易数据集# 模拟超市购物篮数据transactions = [    ['西红柿', '土豆', '茄子', '莲藕'],    ['西红柿', '土豆'],    ['土豆', '茄子', '豆腐'],    ['西红柿', '茄子', '土豆'],    ['土豆', '茄子', '鸡蛋'],    ['西红柿', '鸡蛋', '红萝卜'],    ['鸡蛋', '茄子'],    ['西红柿', '土豆', '鸡蛋'],]
# 2. 使用TransactionEncoder进行数据编码te = TransactionEncoder()te_ary = te.fit(transactions).transform(transactions)df = pd.DataFrame(te_ary, columns=te.columns_)
# 3. 使用Apriori算法计算频繁项集的支持度# 最小支持度设置为0.3(即至少在30%的交易中出现)frequent_itemsets = apriori(df, min_support=0.3, use_colnames=True)
# 4. 输出频繁项集及其支持度print("频繁项集及其支持度:")print(frequent_itemsets)
# 输出频繁项集及其支持度:   support   itemsets0    0.750       (土豆)1    0.625       (茄子)2    0.625      (西红柿)3    0.500       (鸡蛋)4    0.500   (土豆, 茄子)5    0.500  (土豆, 西红柿)

d. 生成对抗网络(GANs)生成模型算法的代码示例

使用PyTorch实现生成对抗网络(GANs)的一个简单示例。我们将使用PyTorch来训练一个GAN模型,通过生成手写数字图像(使用MNIST数据集)来演示该算法的工作原理。

import torchimport torch.nn as nnimport torch.optim as optimfrom torchvision import datasets, transformsfrom torch.utils.data import DataLoaderimport matplotlib.pyplot as plt
# 1. 设置超参数batch_size = 100learning_rate = 0.0002# 为了快速演示 我这里设置了训练为10个epoch 数字越高生成的字越清晰,建议设置为 50epochs = 10latent_dim = 100
# 检查CUDA是否可用device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 2. 加载MNIST数据集transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize([0.5], [0.5])])train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
# 3. 定义生成器模型class Generator(nn.Module):    def __init__(self):        super(Generator, self).__init__()        self.model = nn.Sequential(            nn.Linear(latent_dim, 256),            nn.ReLU(True),            nn.Linear(256, 512),            nn.ReLU(True),            nn.Linear(512, 1024),            nn.ReLU(True),            nn.Linear(1024, 28 * 28),            nn.Tanh()        )
    def forward(self, x):        return self.model(x).view(-1, 1, 28, 28)
# 4. 定义判别器模型class Discriminator(nn.Module):    def __init__(self):        super(Discriminator, self).__init__()        self.model = nn.Sequential(            nn.Linear(28 * 28, 1024),            nn.LeakyReLU(0.2, inplace=True),            nn.Dropout(0.3),            nn.Linear(1024, 512),            nn.LeakyReLU(0.2, inplace=True),            nn.Dropout(0.3),            nn.Linear(512, 256),            nn.LeakyReLU(0.2, inplace=True),            nn.Dropout(0.3),            nn.Linear(256, 1),            nn.Sigmoid()        )
    def forward(self, x):        x = x.view(-1, 28 * 28)        return self.model(x)
# 5. 初始化模型和优化器generator = Generator().to(device)discriminator = Discriminator().to(device)criterion = nn.BCELoss().to(device)optimizer_g = optim.Adam(generator.parameters(), lr=learning_rate)optimizer_d = optim.Adam(discriminator.parameters(), lr=learning_rate)
# 6. 训练模型def train():    for epoch in range(epochs):        for i, (images, _) in enumerate(train_loader):            images = images.to(device)            real_labels = torch.ones(batch_size, 1).to(device)            fake_labels = torch.zeros(batch_size, 1).to(device)
            # 训练判别器            outputs = discriminator(images)            d_loss_real = criterion(outputs, real_labels)            real_score = outputs
            z = torch.randn(batch_size, latent_dim).to(device)            fake_images = generator(z)            outputs = discriminator(fake_images.detach())            d_loss_fake = criterion(outputs, fake_labels)            fake_score = outputs
            d_loss = d_loss_real + d_loss_fake            optimizer_d.zero_grad()            d_loss.backward()            optimizer_d.step()
            # 训练生成器            z = torch.randn(batch_size, latent_dim).to(device)            fake_images = generator(z)            outputs = discriminator(fake_images)            g_loss = criterion(outputs, real_labels)
            optimizer_g.zero_grad()            g_loss.backward()            optimizer_g.step()
        # 输出训练信息        print(f'Epoch [{epoch+1}/{epochs}], d_loss: {d_loss.item():.4f}, g_loss: {g_loss.item():.4f}, '              f'D(x): {real_score.mean().item():.2f}, D(G(z)): {fake_score.mean().item():.2f}')
        # 每10个epoch生成并保存图片        if (epoch + 1) % 10 == 0:            save_fake_images(fake_images, epoch + 1)
# 7. 保存生成的图片def save_fake_images(fake_images, epoch):    fake_images = fake_images.reshape(fake_images.size(0), 1, 28, 28)    fake_images = fake_images.detach().cpu()    plt.figure(figsize=(10, 10))    for i in range(25):        plt.subplot(5, 5, i+1)        plt.imshow(fake_images[i][0], cmap='gray')        plt.axis('off')    plt.tight_layout()    plt.savefig(f'fake_images_epoch_{epoch}.png')    plt.show()
# 8. 开始训练train()
# 输出Epoch [1/10], d_loss: 0.0100, g_loss: 16.2670, D(x): 0.99, D(G(z)): 0.00Epoch [2/10], d_loss: 0.9867, g_loss: 1.0011, D(x): 0.62, D(G(z)): 0.37Epoch [3/10], d_loss: 0.6031, g_loss: 2.1963, D(x): 0.83, D(G(z)): 0.17Epoch [4/10], d_loss: 0.4026, g_loss: 4.2384, D(x): 0.89, D(G(z)): 0.14Epoch [5/10], d_loss: 0.2319, g_loss: 3.6145, D(x): 0.96, D(G(z)): 0.08Epoch [6/10], d_loss: 0.2127, g_loss: 4.0321, D(x): 0.97, D(G(z)): 0.12Epoch [7/10], d_loss: 0.0496, g_loss: 4.4559, D(x): 0.98, D(G(z)): 0.02Epoch [8/10], d_loss: 0.2561, g_loss: 4.0185, D(x): 0.91, D(G(z)): 0.08Epoch [9/10], d_loss: 0.0920, g_loss: 3.8384, D(x): 0.97, D(G(z)): 0.04Epoch [10/10], d_loss: 0.7587, g_loss: 2.5974, D(x): 0.80, D(G(z)): 0.19

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
ATSAMA5D35A-CN 1 Atmel Corporation RISC Microprocessor, 536MHz, CMOS, PBGA324, 15 X 15 MM, 1.40 MM HEIGHT, 0.80 MM PITCH, GREEN, MO-275KAAE-1, LFBGA-324
$13.79 查看
ATXMEGA128A3U-AU 1 Microchip Technology Inc IC MCU 8BIT 128KB FLASH 64TQFP

ECAD模型

下载ECAD模型
$8.03 查看
ATMEGA64-16AU 1 Microchip Technology Inc IC MCU 8BIT 64KB FLASH 64TQFP

ECAD模型

下载ECAD模型
$19.46 查看

相关推荐

电子产业图谱

致力于分享最前沿、最实用的人工智能(AI)技术,包括深度学习(DL)、自然语言处理(NLP)、机器学习(ML)、计算机视觉(CV)等领域的最新发展及应用。