吴恩达471机器学习入门课程3第1周——K-means

news2024/9/21 0:29:03

K-means 聚类

    • 1 - 实现 K-means
      • 1.1 找到最近的质心
      • 练习1
      • 1.2 计算质心均值
      • 练习2
    • 2 - K-means在样本数据集上的应用
    • 3 - 随机初始化
    • 4 - K-means图像压缩
      • 4.1 数据集
        • 可视化
        • 处理数据
      • 4.2图像像素上的 K-mean
      • 4.3 压缩图片

实现 K-means 算法,并将其用于图像压缩。

  • 您将从一个样本数据集开始,帮助您获得 K-means 算法的工作概述
  • 然后,您将使用 K-means 算法进行图像压缩,将出现在图像中的颜色数量减少到仅包括那些在该图像中最常见的颜色。
import numpy as np
import matplotlib.pyplot as plt
from utils import *

%matplotlib inline

1 - 实现 K-means

K-means 算法是一种自动将相似数据点聚合在一起的方法。

  • 具体而言,给定一个训练集 { x ( 1 ) , . . . , x ( m ) } \{x^{(1)}, ..., x^{(m)}\} {x(1),...,x(m)},您想将数据分成几个连贯的“簇”。

  • K-means 是一个迭代过程,它

    • 从猜测初始质心开始,然后
    • 通过
      • 反复将示例分配给其最近的质心,然后
      • 根据分配重新计算质心,来改进这个猜测。
  • 伪代码中,K-means 算法如下:

    # 初始化质心
    # K 是簇的数量
    centroids = kMeans_init_centroids(X, K)
    
    for iter in range(iterations):
        # 聚类分配步骤:
        # 将每个数据点分配到最近的质心
        # idx[i] 对应于分配给第 i 个样本的质心的索引
        idx = find_closest_centroids(X, centroids)
    
        # 移动质心步骤:
        # 根据质心分配计算平均值
        centroids = compute_means(X, idx, K)
    
  • 算法的内循环反复执行两个步骤:

    • (i) 将每个训练样本 x ( i ) x^{(i)} x(i) 分配给其最近的质心,并且
    • (ii) 使用分配给它的点重新计算每个质心的平均值。
  • K K K-means 算法将总是收敛到一些中心点的最终集合。

  • 但是,收敛解决方案可能并不总是理想的,并且取决于质心的初始设置。

    • 因此,在实践中,通常使用不同的随机初始化运行 K-means 算法几次。
    • 选择来自不同随机初始化的这些不同解决方案之间的一种方法是选择具有最低成本函数值(失真)的解决方案。

您将在接下来的部分单独实现 K-means 算法的两个阶段。

  • 您将首先完成 find_closest_centroid,然后继续完成 compute_centroids

1.1 找到最近的质心

在 K-means 算法的“聚类分配”阶段,算法会根据质心的当前位置将每个训练样本 x ( i ) x^{(i)} x(i) 分配给其最近的质心。

练习1

您的任务是完成find_closest_centroids函数中的代码。

  • 此函数接受数据矩阵 X 和所有质心的位置 centroids
  • 它应输出一个一维数组 idx(它具有与 X 相同数量的元素),该数组保存每个训练示例距离最近质心的索引(取值为 { 1 , . . . , K } \{1,...,K\} {1,...,K},其中 K K K 是总质心数)。
  • 具体而言,对于每个示例 x ( i ) x^{(i)} x(i),我们设置
    c ( i ) : = j t h a t    m i n i m i z e s ∣ ∣ x ( i ) − μ j ∣ ∣ 2 , c^{(i)} := j \quad \mathrm{that \; minimizes} \quad ||x^{(i)} - \mu_j||^2, c(i):=jthatminimizes∣∣x(i)μj2,
    其中
    • c ( i ) c^{(i)} c(i) 是与 x ( i ) x^{(i)} x(i) 最接近的质心的索引(对应于起始代码中的 idx [i]),而
    • μ j \mu_j μj 是第 j j j 个质心的位置(值)。(存储在起始代码的 centroids 中)
def find_closest_centroids(x,centroids):
    # 变量idx代表每个样本点所属的最近簇(centroids)的索引值
    idx = np.zeros(x.shape[0],dtype = int)
    # 遍历所有的点
    for i in range(x.shape[0]):
        distance = []
        for j in range(centroids.shape[0]):
            # np.linaly.norm() norm:范数。默认是2,计算欧式距离 平方和开根号
            norm_ij = np.linalg.norm(x[i] - centroids[j])
            distance.append(norm_ij)
        # np.argmin返回的是最小距离那个点所对的索引
        idx[i] = np.argmin(distance)
    return idx
x = load_data()

代码解析

test_x = x[:3]
init = np.array([[3,3], [6,2], [8,5]])
idx = np.zeros(test_x.shape[0],dtype=int)
for i in range(test_x.shape[0]):
    distance = []
    for j in range(init.shape[0]):
        distance.append(np.linalg.norm(x[i]-init[j]))
        print(f"第{i+1}个数据点与第{j+1}个簇点之间的距离:{distance[j]}")
    idx[i] = np.argmin(distance)
    print(f"第{i+1}个数据点属于第{idx[i]+1}个簇点")
第1个数据点与第1个簇点之间的距离:1.981178002041907
第1个数据点与第2个簇点之间的距离:4.907925457663594
第1个数据点与第3个簇点之间的距离:6.170412024053506
第1个数据点属于第1个簇点
第2个数据点与第1个簇点之间的距离:3.2105972663230307
第2个数据点与第2个簇点之间的距离:2.820702783295523
第2个数据点与第3个簇点之间的距离:2.3499462509952416
第2个数据点属于第3个簇点
第3个数据点与第1个簇点之间的距离:3.365171876090534
第3个数据点与第2个簇点之间的距离:1.33813946654494
第3个数据点与第3个簇点之间的距离:2.373852261323399
第3个数据点属于第2个簇点

1.2 计算质心均值

给定每个点与质心的分配,算法的第二阶段重新计算了每个质心所分配到的点的平均值。

练习2

请完成下面的compute_centroids函数以重新计算每个质心的值:

  • 具体而言,对于每个质心 μ k \mu_k μk,我们设置

μ k = 1 ∣ C k ∣ ∑ i ∈ C k x ( i ) \mu_k = \frac{1}{|C_k|} \sum_{i \in C_k} x^{(i)} μk=Ck1iCkx(i)

其中

  • C k C_k Ck 是分配给质心 k k k的示例集合

  • ∣ C k ∣ |C_k| Ck 是集合 C k C_k Ck中示例的数量

  • 具体来说,如果两个示例 x ( 3 ) x^{(3)} x(3) x ( 5 ) x^{(5)} x(5)被分配给质心 k = 2 k=2 k=2,则应更新 μ 2 = 1 2 ( x ( 3 ) + x ( 5 ) ) \mu_2 = \frac{1}{2}(x^{(3)}+x^{(5)}) μ2=21(x(3)+x(5))

def compute_centroids(x,idx,k):
    m,n = x.shape
    centroids = np.zeros((k,n))
    for k in range(k):
        points = x[idx == k]
        # np.mean() 按行计算平均值
        centroids[k] = np.mean(points,axis=0)
    return centroids
m,n = test_x.shape
k_num = 3
test_centroids = np.zeros((k_num,n))
print(idx)
print(f"x:{test_x}")
for k_num in range(k_num):
    points = test_x[idx == k_num]
    print(f"第{k_num}个簇点,points:{points}")
    test_centroids[k_num] = np.mean(points,axis=0)
    print(f"簇点:{test_centroids}")
[0 2 1]
x:[[1.84207953 4.6075716 ]
 [5.65858312 4.79996405]
 [6.35257892 3.2908545 ]]
第0个簇点,points:[[1.84207953 4.6075716 ]]
簇点:[[1.84207953 4.6075716 ]
 [0.         0.        ]
 [0.         0.        ]]
第1个簇点,points:[[6.35257892 3.2908545 ]]
簇点:[[1.84207953 4.6075716 ]
 [6.35257892 3.2908545 ]
 [0.         0.        ]]
第2个簇点,points:[[5.65858312 4.79996405]]
簇点:[[1.84207953 4.6075716 ]
 [6.35257892 3.2908545 ]
 [5.65858312 4.79996405]]

2 - K-means在样本数据集上的应用

当您完成了上面两个函数(find_closest_centroidscompute_centroids)后,下一步是在一个玩具2D数据集上运行K-means算法,以帮助您理解K-means的工作原理。

  • 我们建议您查看下面的函数(run_kMeans)以了解它的工作方式。
  • 注意,代码在循环中调用了您实现的两个函数。

当您运行下面的代码时,它将产生一个可视化图形,展示算法每次迭代的进展情况。

  • 最终,您的图形应该看起来像Figure 1中显示的那样。
def run_kMeans(x,initial_centroids,max_iters =10,plot_progress = False):
    #初始化
    m, n = x.shape
    K = initial_centroids.shape[0]
    centroids = initial_centroids
    previous_centroids = centroids
    idx = np.zeros(m)
    # 运行K-means
    for i in range(max_iters):
        #输出过程
        print("K-Means iteration %d/%d" % (i, max_iters-1))
        # 对于 X 中的每个示例,将其分配给最接近的质心
        idx = find_closest_centroids(x, centroids)
        # 绘制过程
        if plot_progress:
            plot_progress_kMeans(x, centroids, previous_centroids, idx, K, i)
            previous_centroids = centroids
        # 计算新的质点
        centroids = compute_centroids(x, idx, K)
    plt.show()
    return centroids, idx
x = load_data()
initial_centroids = np.array([[3,3],[6,2],[8,5]])
K = 3
max_iters = 10

centroids, idx = run_kMeans(x, initial_centroids, max_iters, plot_progress=True)
K-Means iteration 0/9
K-Means iteration 1/9
K-Means iteration 2/9
K-Means iteration 3/9
K-Means iteration 4/9
K-Means iteration 5/9
K-Means iteration 6/9
K-Means iteration 7/9
K-Means iteration 8/9
K-Means iteration 9/9

png

3 - 随机初始化

为了使您在示例数据集的初始质心分配中看到与“图1”相同的图形,该图形的设计是这样的。在实践中,初始化质心的一个良好策略是从训练集中选择随机样本。

在此练习的这部分中,您应该理解如何实现kMeans_init_centroids函数。

  • 代码首先随机洗牌示例的索引(使用np.random.permutation())。
  • 然后,它基于索引的随机排列选择前 K K K个示例。
    • 这允许随机选择示例,而不会冒选择相同示例的风险。
def kMeans_init_centroids(x,k):
    # 先将数据随机排列
    randidx = np.random.permutation(x.shape[0])
    # 初始簇取随机排列数组前K个
    centroids = x[randidx[:k]]
    return centroids
np.random.permutation(x.shape[0])
array([ 75,  26, 162, 111, 270,  85,   4, 171, 250, 135,  25, 144, 217,
       130, 136, 104, 143, 126,  50, 196, 148,  45, 272,  10, 175,  49,
       125, 179, 221, 169, 296,   1, 282, 204, 197, 241,  78, 290, 205,
        18,  77, 189, 283,  40, 299, 247,   3,  41, 226,  74,  30,  63,
        22, 249, 281,  16, 102,  20, 147, 245, 214, 211, 201, 122,  53,
       220, 252, 218,  73, 255,  83, 229, 219, 159, 206, 181, 156, 109,
       101, 133, 216,  64, 209, 231, 132,  31,  27,  58,  59, 150,  55,
       225, 110, 149, 103,  91, 273, 105, 295,  33, 277, 224, 268, 182,
       200, 235, 262,  15, 127, 119,  86, 285,  57,  35, 165,  80, 167,
        51, 163, 173, 146,  43,   2, 198, 276,  62, 244, 120, 227, 138,
        96,  48, 236, 258, 203, 240, 199,  82, 195,  68, 246,  92, 188,
       164, 155, 153, 187, 183, 280, 141, 113, 284, 174, 260, 215, 267,
       213,  23, 112, 116, 266,  34,  99, 178, 297, 210, 137,  29,  87,
       117, 230,  21, 288, 145,  44, 191, 192, 168, 121,  60, 271,   0,
       237, 291, 251, 157,  89, 264, 242,  32, 142, 177,  39, 294, 234,
        95, 186,  61,  71,  66,  17, 129,  90, 134, 222,   7,  93,  56,
       265, 298,  52, 176, 128,  70, 152,  98, 139, 261, 208,  11, 124,
       212,  76, 228, 151, 238, 207, 278, 123, 158, 115, 223,  14, 274,
       239, 202,  42,  72,  13, 232, 289, 279, 184, 194,  19, 193,  46,
       114, 108,   9, 286, 180, 248, 154,  37, 166, 257, 292, 293, 269,
       107, 259,  79,  12, 106, 256,  97, 287, 170, 185,   5,   8,  84,
        38,  47,  94,  88,  36, 233,  28, 190, 243, 131,  81,   6, 140,
       160, 253, 172, 118,  69, 161, 254, 263,  65,  67, 275, 100,  54,
        24])

4 - K-means图像压缩

在这个练习中,你将使用K-means算法对图像进行压缩。

  • 在直接使用24位颜色表示图像的情况下 2 ^{2} 2,每个像素都表示为三个8位无符号整数(范围从0到255),指定了红色,绿色和蓝色强度值。这种编码通常称为RGB编码。
  • 我们的图片包含成千上万种颜色,在本部分中,您将把颜色数量减少到16种颜色。
  • 通过进行此缩减,可以以高效的方式表示(压缩)照片。
  • 具体而言,您只需要存储选定16种颜色的RGB值,并且对于图像中的每个像素,您现在只需要存储该位置的颜色索引(仅需要4位即可表示16种可能性)。

在本部分中,您将使用K-means算法来选择用于表示压缩图像的16种颜色。

  • 具体而言,您将将原始图像中的每个像素视为数据示例,并使用K-means算法在3维RGB空间中找到最佳聚集(聚类)像素的16种颜色。
  • 一旦您已经在图像上计算出聚类中心,您将使用16种颜色来替换原始图像中的像素。

image-20230618193852767

本练习中提供的照片归Frank Wouters所有,已获得其许可。

4.1 数据集

加载图片

首先,您将使用matplotlib读取原始图像,如下所示。

original_img = plt.imread('bird_small.png')

可视化

plt.imshow(original_img)
<matplotlib.image.AxesImage at 0x25eb49fb640>

png

如您所见,这将创建一个三维矩阵original_img,其中

  • 前两个索引标识像素位置,
  • 第三个索引表示红色、绿色或蓝色。

例如,original_img [50,33,2]给出了行50和列33处像素的蓝色强度。

处理数据

要调用run_kMeans,您需要首先将矩阵original_img转换为二维矩阵。

  • 以下代码重新塑造矩阵original_img以创建像素颜色的 m × 3 m \times 3 m×3矩阵(其中 m = 16384 = 128 × 128 m=16384 = 128\times128 m=16384=128×128
# 将所有值除以255,使所有值都在0-1范围内
original_img = original_img / 255

# 重新构造图像成为 m x 3矩阵,其中 m = 128 x 128 = 16384
# 每一行将包含红色、绿色和蓝色像素值
# 这给我们提供了我们将在K-Means上使用的数据集矩阵X_img。

X_img = np.reshape(original_img, (original_img.shape[0] * original_img.shape[1], 3))

4.2图像像素上的 K-mean

现在,运行下面的单元格以在预处理的图像上运行 K-均值。

K = 16
max_iters = 10
initial_centroids = kMeans_init_centroids(X_img,K)

centroids,idx = run_kMeans(X_img,initial_centroids,max_iters)
K-Means iteration 0/9
K-Means iteration 1/9
K-Means iteration 2/9
K-Means iteration 3/9
K-Means iteration 4/9
K-Means iteration 5/9
K-Means iteration 6/9
K-Means iteration 7/9
K-Means iteration 8/9
K-Means iteration 9/9
print("Shape of idx:", idx.shape)
print("Closest centroid for the first five elements:", idx[:5])
Shape of idx: (16384,)
Closest centroid for the first five elements: [7 6 6 7 7]

4.3 压缩图片

找到用于表示图像的前 K = 16 K=16 K=16种颜色后,现在可以使用find_closest_centroids函数将每个像素位置分配给它最接近的质心。

  • 这使您可以使用每个像素的质心赋值来表示原始图像。
  • 请注意,您已经大大减少了描述图像所需的位数。
    • 原始图像需要每个 128 × 128 128\times128 128×128像素位置的24位,因此总大小为 128 × 128 × 24 = 393 , 216 128 \times 128 \times 24 = 393,216 128×128×24=393,216位。
    • 新的表示形式需要一些开销的存储,以字典的形式存储16种颜色,每种颜色需要24位,但是图像本身只需要每个像素位置4位。
    • 因此最终使用的位数为 16 × 24 + 128 × 128 × 4 = 65 , 920 16 \times 24 + 128 \times 128 \times 4 = 65,920 16×24+128×128×4=65,920位,这相当于将原始图像压缩约6倍。
# 用索引表示图像
X_recovered = centroids[idx, :]
# 将恢复的图像重新调整为正确的维度
X_recovered = np.reshape(X_recovered, original_img.shape)

最后,您可以基于仅质心赋值来重新构建图像,以查看压缩的效果。

  • 具体而言,您可以将每个像素位置替换为分配给它的质心的均值。
  • 图3显示了我们得到的重建图像。即使结果图像保留了大部分原始特征,我们也能看到一些压缩伪影。

image-20230618193952322

fig, ax = plt.subplots(1,2, figsize=(8,8))
plt.axis('off')
# 原始
ax[0].imshow(original_img*255)
ax[0].set_title('Original')
ax[0].set_axis_off()


# 压缩
ax[1].imshow(X_recovered*255)
ax[1].set_title('Compressed with %d colours'%K)
ax[1].set_axis_off()

png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Autoware 跑 Demo(踩坑指南)

Autoware 跑 Demo&#xff08;踩坑指南&#xff09; 网上的博客和官方的教程&#xff0c;几乎都是一样的&#xff0c;但实际上跑不起来 Autoware 1.12学习整理–01–运行rosbag示例 Autoware入门学习&#xff08;三&#xff09;——Autoware软件功能使用介绍&#xff08;1/3&a…

MySQL的IF(exp1, exp2, exp3)、IFNULL(exp1, exp2)函数的用法

本章主要是讲解一下mysql的常用方法if()和ifnull()的使用 1、if(exp1, exp2, exp3) 如果表达式exp1成立&#xff0c;则返回的结果是表达式exp2&#xff0c;否则返回的是表达式exp3 案例&#xff1a;现在有一个星印类型表xingyin_type 通过这个表来介绍一下这个函数的使用 sel…

轻松掌握Seata源码分析之AT模式整体大纲流程跟踪

如下为订单和库存的实例代码&#xff0c;在事务开启处即订单服务处使用GlobalTransactional即可。当添加了异常代码使订单无法加一&#xff0c;这时减库存服务也会回滚&#xff0c;根据的就是undolog。回滚完undolog记录会被释放删除。 AT模式整体大纲流程跟踪如下&#xff1…

第37步 深度学习图像识别:CNN建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;深度学习图像识别的原理 我们思考一下&#xff0c;当你看到一张椅子的图片&#xff0c;你的大脑会告诉你这是个椅子&#xff0c;但你有没有想过&#xff1a;为什么你知道这是椅子&#xff0c;你的大脑是怎么…

【Spring Cloud 系列】Eureka控制台参数说明

【Spring Cloud 系列】Eureka控制台参数说明 前面我们在《Eureka使用详解》一文中介绍了Eureka的使用。本文将介绍Eureka控制板面各参数&#xff1a; System Status 编号名称说明1Environment环境&#xff0c;默认为test&#xff0c;该参数在实际使用过程中&#xff0c;可以不…

单目标应用:Tiki-taka算法(TTA)求解太阳能光伏模型MATLAB

一、四种太阳能光伏模型 随着石油、煤炭、天然气等不可再生能源的快速枯竭&#xff0c;以及空气环境的严重污染&#xff0c;可持续、无污染的能源供应成为热点和关键问题。风能、太阳能、水能、潮汐能等可再生能源的开发利用&#xff0c;必然在未来的可持续发展中发挥至关重要…

德国企业数据统计分析【1】-基于pandas的GENESIS ONLINE数据简单统计与柱状图可视化

引言: 德国拥有很多年销售额不超过50亿美元的中小企业,但他们却是某些细分制造、工业领域的翘楚。并且隐身于大众视野之外。此处,隐形冠军指的就是细分领域行业处于绝对领先地位并且年销售额不超过50亿美元的中小企业。这一概念是由德国著名中小企业管理学家赫尔曼西蒙创立的…

电脑开机密码忘记了怎么办?使用优盘重装系统

大家可以在网上搜索&#xff0c;其他方法。尽量找回密码。我这是因为已经很久没有使用这个电脑&#xff0c;而且c盘也没有怎么重要资料的情况下。我才选择重装系统的。 请慎重。 前期准备&#xff1a; 1、准备一个4G以上的U盘 2、备份U盘重要文件&#xff0c;制作过程中会格式…

「深度学习之优化算法」(五)差分进化算法

1. 差分进化算法简介 &#xff08;以下描述&#xff0c;均不是学术用语&#xff0c;仅供大家快乐的阅读&#xff09; 差分进化算法&#xff08;Differential Evolution Algorithm&#xff0c;DE&#xff09;是一种基于群体的进化算法&#xff0c;它模拟了群体中的个体的合作与竞…

黑马点评短信登录功能

一、基于session实现短信登录 1、发送短信验证码 流程图如下&#xff1a; 1、实现UserController下的sendCode方法&#xff1a; /*** 发送手机验证码*/PostMapping("/code")public Result sendCode(RequestParam("phone") String phone, HttpSession se…

微博粉丝清理工具丨2023年最新粉丝批量清理_微博怎么批量清理粉丝

2023年最新微博怎么批量清理粉丝&#xff1f;可能还有不少小伙伴不太清楚 接下来就为大家带来微博批量清理僵尸粉方法 有需要的朋友可以来了解一下&#xff0c;希望下文可以帮到大家 第一种&#xff1a;客服界面清粉方法 然后在客服中心界面选择修正粉丝; 最后点击一下确认就…

const修饰的成员函数

const修饰的成员函数 问题: 哪里出现编译报错了, 如何修改&#xff1f; class A { public:const int get1() const{a1 10;return a1;}private: int a1 0; }; int main() {A a;a.get1();return 0; }当时以为是a是一个非const对象&#xff0c;调用了const成员函数导致编译错误…

关于guacamole项目中的一点感悟与理解

关于guacamole项目中的一点想法 前言一、guacd模块启动相关二、一些感悟与理解参考 前言 Guacamole 是基于 Web 的 VNC 客户端&#xff0c;使用它可以通过web浏览器访问远程服务器终端并进行操作。它的基本架构如下图所示。 巧合之下&#xff0c;前段时间了解了项目中guacd模块…

构建大数据环境:Hadoop、MySQL、Hive、Scala和Spark的安装与配置

前言 在当今的数据驱动时代&#xff0c;构建一个强大的大数据环境对于企业和组织来说至关重要。本文将介绍如何安装和配置Hadoop、MySQL、Hive、Scala和Spark&#xff0c;以搭建一个完整的大数据环境。 简介 安装Hadoop 首先&#xff0c;从Apache Hadoop的官方网站下载所需的…

测试(一)

1.用户需求 可以简单理解为甲方提出的需求&#xff0c;如果没有甲方&#xff0c;那么就是终端用户使用产品时必须要完成的任务。该需求一般比较简略。 2.软件需求 或者叫功能需求&#xff0c;该需求会详细描述开发人员必须实现的软件功能(所谓的测试文档)。 大多数公司在进行…

05- c语言函数 (C语言)

一 函数的概念 1、在程序设计过程中&#xff0c;为了实现某个功能需要编写多行代码&#xff0c;例如求一个二维数组中的最大值&#xff0c;如果 该功能需要被多次使用&#xff0c;我们可以在每次使用时将原来的代码重复编写&#xff0c;但是这样未免有“凑代码”的嫌疑&#x…

大数据治理.数据储存技术

hive是基于Hadoop的一个数据仓库工具&#xff0c;用来进行数据提取、转化、加载&#xff0c;这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表&#xff0c;并提供SQL查询功能&#xff0c;能将SQL语句转…

Spark大数据处理学习笔记(3.8.3) Spark RDD典型案例-利用RDD实现分组排行榜

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/Twpwe】 文章目录 一、任务目标二、准备工作2.1 在本地创建成绩文件2.2 将成绩文件上传到HDFS上指定目录 三、完成任务3.1 在Spark Shell里完成任务3.1.1 读取成绩文件得到RDD3.1.2 利用映射算子生…

Openfire身份认证绕过漏洞复现+利用(CVE-2023-32315)

0x01 产品简介 Openfire是免费的、开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。Openfire安装和使用都非常简单&#xff0c;并利用Web进行管理。单台服务器甚至可支持上万并发用户。 0x02 漏洞概述 Openfire的管理控制台是一个基于 Web 的…

自然语言处理从入门到应用——动态词向量预训练:ELMo词向量

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 在双向语言模型预训练完成后&#xff0c;模型的编码部分&#xff08;包括输入表示层以及多层堆叠LSTM&#xff09;便可以用来计算任意文本的动态词向量表示。最自然的做法是使用两个LSTM的最后一层隐含层输出作为词的动…