• [技术干货] K-Means鸢尾花聚类实验
    一、实验目的了解聚类算法和K-Means的基本概念了解如何使用MindSpore进行K-Means聚类实验二、实验内容与实验步骤环境搭建数据预处理模型建立与训练模型评估 这是一个完整的实验步骤,我们首先根据手册实现基础实验——鸢尾花聚类实验,接着改动实验中K的数值以及质心的选值来测试创新设计。三、实验环境华为云ModelArtsMindSpore 1.364位电脑四、实验过程与分析环境搭建 创建OBS桶按照pdf进行对应配置,接着新建文件夹K-Means并上传代码文件、配置文件与数据文件。​ 接下来创建训练任务,配置与pdf一致,不同的地方是输入参数需要写data_url,输出参数随意写。​ 均完成后就可以开启训练任务了。下面开始分析本次实验的代码。数据预处理 在头文件配置MindSpore的运行环境,包括运行模式和目标设备,以便后续进行神经网络的训练或推理操作,接着打开导入的Iris数据集并查看部分数据。在打开数据之前也要线适配训练作业。import os import csv import random import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import mindspore as ms from mindspore import context, Tensor, nn from mindspore.ops import operations as ops context.set_context(mode=context.PYNATIVE_MODE, device_target="Ascend") import argparse parser = argparse.ArgumentParser() parser.add_argument('--data_url', required=True, default=None, help='Location of data.') args, unknown = parser.parse_known_args() import moxing # src_url形如's3://OBS/PATH',为OBS桶中数据集的路径,dst_url为执行容器中的路径,两者皆为目录/皆为文件 moxing.file.copy_parallel(src_url=os.path.join(args.data_url, 'iris.data'), dst_url='iris.data') def create_dataset(data_path): with open(data_path) as csv_file: data = list(csv.reader(csv_file, delimiter=',')) label_map = { 'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2 } X = np.array([[float(x) for x in s[2:-1]] for s in data[:150]], np.float32) Y = np.array([label_map[s[-1]] for s in data[:150]], np.int32) return X,Y模型建立与训练​ 使用K-means聚类算法将Iris数据集分为3个簇。首先加载数据,随机选择3个数据点作为初始的簇中心,然后进行100次迭代,计算每个数据点到簇中心的距离,将数据点分配到距离最近的簇,然后更新簇的中心位置。最终,它计算了聚类的准确率,将聚类结果可视化,以便分析聚类效果。# 设置K值为3。iris数据集有三类花 # 实际上是分类任务,因为已经给了堆大小了 # 迭代次数25 k=3 generations = 100 x,y = create_dataset('./iris.data') num_pts = len(x) num_feats = len(x[0]) data_points = Tensor(x) cluster_labels = np.zeros(num_pts) # 先随机选择iris数据集中的三个数据点作为每个堆的中心点 rand_starts = np.array([x[np.random.choice(len(x))] for _ in range(k)]) centroids = Tensor(rand_starts)​ 接下来是具体每一个部分的实现代码。首先是计算每个数据点到每个簇中心点的欧氏距离,并将数据点分配到距离最近的簇中,返回每个数据点所属的簇的标签。def calculate(): # 计算每个数据点到每个中心点的欧氏距离 # 这里是将数据点都放入矩阵,直接按矩阵进行运算 reshape = ops.Reshape() tile = ops.Tile() reduce_sum = ops.ReduceSum(keep_dims=False) square = ops.Square() argmin = ops.Argmin() centroid_matrix = reshape(tile(centroids, (num_pts, 1)), (num_pts, k, num_feats)) point_matrix = reshape(tile(data_points, (1, k)), (num_pts, k, num_feats)) distances = reduce_sum(square(point_matrix - centroid_matrix), 2) centroid_group = argmin(distances) return centroid_group​ 计算每个簇的平均距离,以更新簇的中心点位置。它首先通过 ops.UnsortedSegmentSum计算每个数据点到所属簇的距离总和,并使用 ops.OnesLike计算每个簇的数据点数量。然后,通过将总和除以数量,得到新的中心点位置,并使用 ops.Assign更新簇的中心点。这个过程循环执行,不断迭代,以优化簇的中心点,从而改善聚类效果。# 计算三个堆的平均距离更新堆中新的中心点 unsorted_segment_sum = ops.UnsortedSegmentSum() ones_like = ops.OnesLike() def data_group_avg(group_ids, data): # 分组求和 sum_total = unsorted_segment_sum(data, group_ids, 3) #计算堆大小 num_total = unsorted_segment_sum(ones_like(data), group_ids, 3) #求距离均值 avg_by_group = sum_total/num_total return avg_by_group assign = ops.Assign()​ 执行K-means聚类算法训练过程,在每轮循环中,计算每个数据点的所属簇,重新计算簇的中心点位置,更新簇的中心点,然后计算每个簇中的数据点数量。这个循环用于不断优化簇的中心点,直到满足停止条件# 遍历循环训练,更新每组分类的中心点 for i in range(generations): print('Calculating gen {}'.format(i)) centroid_group = calculate() means = data_group_avg(centroid_group, data_points) centroids = assign(ms.Parameter(centroids, name='w'), means) cluster_labels = assign(ms.Parameter(Tensor(cluster_labels,ms.int64),name='w'), centroid_group) centroid_group_count = assign(ms.Parameter(Tensor(cluster_labels,ms.int64),name='w'), centroid_group).asnumpy() group_count = [] # print(centroid_group_count) for ix in range(k): group_count.append(np.sum(centroid_group_count==ix)) print('Group counts: {}'.format(group_count))模型评估​ 计算每个簇中数据点属于最频繁出现的类别,通过比较聚类结果和Iris数据集中的真实标签来计算每个簇的准确率,最终输出整体的准确率,以评估聚类算法的性能。# 输出准确率。 # 聚类结果和iris数据集中的标签进行对比 centers, assignments = centroids, cluster_labels.asnumpy() def most_common(my_list): return(max(set(my_list), key=my_list.count)) label0 = most_common(list(assignments[0:50])) label1 = most_common(list(assignments[50:100])) label2 = most_common(list(assignments[100:150])) group0_count = np.sum(assignments[0:50]==label0) group1_count = np.sum(assignments[50:100]==label1) group2_count = np.sum(assignments[100:150]==label2) accuracy = (group0_count + group1_count + group2_count)/150. print('Accuracy: {:.2}'.format(accuracy)) reduced_data = x reduced_centers = means​ 最后可视化呈现K-means聚类的结果。首先绘制不同花类别的数据点,每个类别使用不同的图标符号表示,然后在图上标出了聚类的中心点位置。这样的可视化有助于直观地理解数据点的分布和聚类效果,以及簇的中心位置。# 设置图例 symbols = ['o'] label_name = ['Setosa', 'Versicolour', 'Virginica'] for i in range(3): temp_group = reduced_data[(i*50):(50)*(i+1)] plt.plot(temp_group[:, 0], temp_group[:, 1], symbols[0], markersize=8, label=label_name[i]) # 绘图 plt.scatter(reduced_centers[:, 0].asnumpy(), reduced_centers[:, 1].asnumpy(), marker='x', s=169, linewidths=3,color='red', zorder=10) plt.title('K-means clustering on Iris Dataset\n' 'Centroids are marked with white cross') plt.legend(loc='lower right') plt.show() print('Successful !!!')​ 下面是输出结果,准确性达到0.95,但是很奇怪的没有输出图像,询问一圈发现大家都无法输出,于是尝试修改代码,感觉代码没问题,上网查询后发现可能是OBS的功能限制,想输出图像需要一大堆迂回操作,于是把代码拿到notebook中训练发现能成功输出图像,质心的位置与三种类别基本一致。五、实验结果与总结尝试不同的初始质心取值 于是直接手动选择三个初始质心并且把质心放入Tensor迭代。initial_centroids = np.array([ # 手动选择三个初始质心 [5.1, 3.5], [6.5, 3.2], [6.0, 2.7] ],np.float32) # 将初始质心放入Tensor print(initial_centroids) centroids = Tensor(initial_centroids) print(centroids)​ 输出结果发现准确率不变依然是0.95,且质心的位置基本不变,所以最终的输出结果与最初的质心位置选择应该关系不大,因此我们的初始质心可以采用随机选择的方法。选择不同的k值​ 例如选择k=2,发现准确性只有0.99,因为确实是有2个簇,也挺符合。k = 2​ 选择k=4,发现准确性显著降低为0.78.对K-Means 算法的认识​ K-Means算法是一种常用的无监督学习算法,用于将数据点分成K个簇,其中K是用户指定的参数。算法通过不断迭代,将数据点分配到最近的质心,然后重新计算质心,直至收敛为止。K-means算法受到K值的选择、初始质心的随机性和数据分布的影响,需要谨慎调整参数以获得最佳聚类结果。该算法适用于聚类分析、数据压缩和特征选择等领域,但在处理非凸分布和噪声较多的数据时可能表现不佳。因此,K-means算法的性能和稳定性取决于数据的特点和算法参数的选择。六、附录 主要源码为main.py,修改基本是小范围修改因此不附录新文件。
  • [问题求助] spark集群如何在没有hadoop的情况下读写OBS?
    在没有hadoop的情况下,PySpark API从OBS桶中读取数据,再转为RDD。请问如何实现?以下代码报错:No FileSystem for scheme "obs",是不是spark没有安装配置hadoop就不能读写OBS?from pyspark import SparkConffrom pyspark.sql import SparkSessionconf = SparkConf()conf.set("spark.app.name", "read and write OBS")conf.set("spark.security.credentials.hbase.enabled", "true")conf.set("spark.hadoop.fs.obs.access.key", ak)conf.set("spark.hadoop.fs.obs.secret.key", sk)conf.set("spark.hadoop.fs.obs.endpoint", "http://xxx")spark = SparkSession.builder.config(conf=conf).getOrCreate()df = spark.read.json('obs://bucket_name/xxx.json')df.coalesce(2).write.json("obs://bucket_name/", "overwrite")
  • OBS的优势
    OBS的优势数据稳定,业务可靠:OBS支撑华为手机云相册,数亿用户访问,稳定可靠。通过跨区域复制、AZ之间数据容灾、AZ内设备和数据冗余、存储介质的慢盘/坏道检测等技术方案,保障数据持久性高达99.9999999999%,业务连续性高达99.995%,远高于传统架构。图1 五级可靠性架构保证数据稳定,业务可靠多重防护,授权管理:OBS通过可信云认证,让数据安全放心。支持多版本控制、敏感操作保护、服务端加密、防盗链、VPC网络隔离、访问日志审计以及细粒度的权限控制,保障数据安全可信。千亿对象,千万并发:OBS通过智能调度和响应,优化数据访问路径,并结合事件通知、传输加速、大数据垂直优化等,为各场景下用户的千亿对象提供千万级并发、超高带宽、稳定低时延的数据访问体验。图2 千亿对象,千万并发的数据访问体验简单易用,便于管理:OBS支持标准REST API、多版本SDK和数据迁移工具,让业务快速上云。无需事先规划存储容量,存储资源和性能可线性无限扩展,不用担心存储资源扩容、缩容问题。OBS支持在线升级、在线扩容,升级扩容由华为云实施,客户无感知。同时提供全新的POSIX语言系统,应用接入更简便。数据分层,按需使用:提供按量计费和包年包月两种支付方式,支持标准、低频访问、归档数据、深度归档数据(受限公测)独立计量计费,降低存储成本。
  • [问题求助] web直传一直报403AccessDenied
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?><Error><Code>AccessDenied</Code><Message>Invalid according to Policy: Policy Condition failed: ["eq", "$content-type", "text/plain"]</Message><RequestId>0000018C38E6782ECAA64C4522FE4BB8</RequestId><HostId>5GGJHhqASjbXJ+k5y+QpsE/YZpMjjDdkEKWhRBCXpV7N9dlgKNYRY0MFxWzVxlUg</HostId></Error>服务端是按照文档上生成的签名
  • [问题求助] go 下载指定obs文件
    1.私有桶下载obs指定文件技术文档在哪里
  • OBS对象存储服务
    OBS对象存储服务即为Object Storage Service,简称OBS。这是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力。对象是OBS中数据存储的基本单位,一个对象实际是一个文件的数据与其相关属性信息的集合体,包括Key、Metadata、Data三部分。对象的储存和传统的储存不一样,他的储存是讲所有的文件储存到统一层级下,是非树型的结构,是属于单一平面的结构。这里存放的地方叫作——桶。OBS系统和单个桶都没有总数据容量和对象/文件数量的限制,为用户提供了超大存储容量的能力,适合存放任意类型的文件,适合普通用户、网站、企业和开发者使用。OBS是一项面向Internet访问的服务,提供了基于HTTP/HTTPS协议的Web服务接口,用户可以随时随地连接到Internet,通过OBS管理控制台或各种OBS工具访问和管理存储在OBS中的数据。此外,OBS支持SDK和OBS API接口,可使用户方便管理自己存储在OBS上的数据,以及开发多种类型的上层业务应用。对象存储是一种新兴的存储范式,与传统的块存储和文件存储相比具有许多优势。它将数据以对象的形式存储,每个对象包含数据、元数据和唯一的标识符。对象存储的主要特点包括:高可靠性:华为云上的对象存储提供了多重数据冗余和故障容忍机制,确保数据的高可用性和持久性。数据会自动在不同的物理设备和数据中心之间进行复制和备份,以应对设备故障或自然灾害等风险。高可扩展性:对象存储可以轻松地扩展以适应不断增长的数据量。华为云的对象存储使用分布式架构,可以无缝地横向扩展,同时保持良好的性能和稳定性,无需用户关注底层的硬件和基础架构。强大的访问控制:华为云对象存储支持灵活的访问控制策略,用户可以根据需要定义不同的权限和访问策略。这使得用户能够更好地保护数据安全,并确保只有授权的用户可以访问和修改数据。快速数据检索:对象存储提供了快速的数据检索能力,可以根据对象的唯一标识符进行快速访问。用户可以通过简单的API调用或Web界面进行数据的上传、下载和管理,同时支持数据的元数据搜索和标签检索,提高了数据的可用性和利用价值。经济高效:华为云对象存储采用了按需付费的模式,用户只需根据实际使用量支付费用,避免了高额的固定成本。此外,对象存储还具有较低的维护成本,用户无需关心硬件设备的购买和维护,可以专注于数据的管理和分析。
  • [开发环境] 百模千态】求助从obs下载微调代码,无法把所有微调代码下载下来
    求助从obs下载微调代码,无法把所有微调代码下载下来,有些会自动跳过,都后面就会环境乱了
  • [开发环境] 【百模千态 no module named mindpet】
    运行微调代码时找不到mindpet模块
  • [问题求助] OBS4种访问控制有什么区别,分别在什么时候用哪种规则
    OBS4种访问控制有什么区别(桶策略、桶ACLs、CORS规则、防盗链)分别在什么时候用哪种规则
  • [问题求助] OBS怎么进行备份和灾难恢复
    OBS怎么进行备份和灾难恢复
  • [问题求助] OBS的实现原理是什么,为什么不用数据库存储
    OBS的实现原理是什么,为什么不用数据库存储
  • [问题求助] 如果一个用户在下载OBS的某个文件,同时另一个用户开始修改那个文件,那么下载的用户会下载失败吗
    如果一个用户在下载OBS的某个文件,同时另一个用户开始修改那个文件,那么下载的用户会下载失败吗(还是会把修改后的下载下来)
  • [问题求助] OBS的SDK在下载之前会判断本地剩余空间吗?如果剩余空间小于文件大小就不下载
    OBS的SDK在下载之前会判断本地剩余空间吗?如果剩余空间小于文件大小就不下载
  • [问题求助] 使用OBS下载文件时,如果下载到一半中断了,OBS下载的文件占用空间是文件总大小,还是下载多少占多少
    使用OBS下载文件时,如果下载到一半中断了,OBS下载的文件占用空间是文件总大小,还是下载多少占多少
  • [问题求助] OBS在上传和下载对象时,是否有对数据进行加密
    OBS在上传和下载对象时,是否有对数据进行加密
总条数:1277 到第
上滑加载中