“Fidelius示例教程”的版本间差异

来自典枢
跳到导航 跳到搜索
(格式修改)
(修改k-means算法介绍)
第1行: 第1行:
您可以通过本页面了解如何在 Fidelius 中运行一个示例程序。
您可以通过本页面了解如何在 Fidelius 中运行一个示例程序。


= 基于 Iris 数据集的 K-Means 聚类算法 =
= 基于 Iris 数据集的 K-Means 聚类算法 =
基于Iris数据集的K-Means聚类是机器学习中一个非常经典的学习示例,这里我们介绍一下如何在Fidelius中实现这个例子。
基于 Iris 数据集的 K-Means 聚类是机器学习中一个非常经典的学习示例,这里我们介绍一下如何在 Fidelius 中实现这个例子。


== Iris鸢尾花数据集 ==
== Iris 鸢尾花数据集 ==


Iris 鸢尾花数据集内包含 3 类分别为山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica),共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度。
Iris 鸢尾花数据集内包含 3 类鸢尾花,分别为山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica),共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度。


*sepallength:萼片长度
*sepallength:萼片长度
第51行: 第51行:




== K-Means聚类算法 ==
== K-Means 聚类算法 ==
聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。
K 均值聚类(K-Means)是最著名的划分聚类算法,简洁和高效使得他成为所有聚类算法中最广泛使用的。其认为两个目标的距离越近,其相似度越大。


K均值聚类(K-Means)是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目K,K由用户指定,
算法步骤:
k均值算法根据某个距离函数反复把数据分入K个聚类中。


K-Means算法通常使⽤肘部法则来选择K值。肘部法则考察聚类后全体样本的误差平⽅和SSE,将SSE随K值的变化由快速下降转变为缓慢变化的拐点处的K值,作为最佳聚类簇数。
# 选择初始化的 k 个样本作为初始聚类中心 a = a<sub>1</sub>, a<sub>2</sub>, ... a<sub>k</sub>;
# 针对数据集中每个样本 x<sub>i</sub> 计算它 k 个聚类中心的距离并将其分到距离最小的聚类中心所对应的类中;
# 针对每个类别 a<sub>j</sub>,重新计算它的聚类中心,即属于该类的所有样本的质心;
# 重复上面 2 3 两步操作,直到达到某个中止条件(迭代次数、最小误差变化等)。


肘部法则选择K值的依据:随着聚类数K的增⼤,样本划分会更加精细,每个簇的聚合程度会逐渐提⾼,那么误差平⽅和SSE⾃然会逐渐变⼩。且当K⼩于真实聚类数时,由于K的增⼤会⼤幅增加每个簇的聚合程度,故SSE的下降幅度会很⼤;当K达到真实聚类数时,再增加K所得到的聚合程度,回报就会迅速变⼩,所以SSE的下降幅度会骤减,然后随着K值的继续增⼤⽽趋于平缓。也就是说SSE与K之间的关系就像⼿肘的形状,这个肘部对应的K值就是数据的真实聚类数。
K-Means算法通常使⽤肘部法则来选择 K 值。肘部法则考察聚类后全体样本的误差平⽅和 SSE,将 SSE 随 K 值的变化由快速下降转变为缓慢变化的拐点处的 K 值,作为最佳聚类簇数。
 
肘部法则选择 K 值的依据:随着聚类数 K 的增⼤,样本划分会更加精细,每个簇的聚合程度会逐渐提⾼,那么误差平⽅和 SSE ⾃然会逐渐变⼩。且当 K ⼩于真实聚类数时,K 的增⼤会⼤幅增加每个簇的聚合程度,故 SSE 的下降幅度会很⼤;当 K 达到真实聚类数时,再增加 K 所得到的聚合程度,回报就会迅速变⼩,所以 SSE 的下降幅度会骤减,然后随着K值的继续增⼤⽽趋于平缓。也就是说 SSE 与 K 之间的关系就像⼿肘的形状,这个肘部对应的K值就是数据的真实聚类数。


使⽤K-Means对数据集iris进⾏聚类分析:加载iris数据集,按照4个特征,使⽤肘部法则确定最佳的K值,然后使⽤KMeans类进⾏聚类,最后可视化聚类结果。
使⽤K-Means对数据集iris进⾏聚类分析:加载iris数据集,按照4个特征,使⽤肘部法则确定最佳的K值,然后使⽤KMeans类进⾏聚类,最后可视化聚类结果。
第65行: 第69行:
[[文件:kmeans.png|600px|center]]
[[文件:kmeans.png|600px|center]]


== 在Fidelius中运行K-Means ==
== 在 Fidelius 中运行 K-Means ==


1.准备 iris 数据集的封存数据
1.准备 iris 数据集的封存数据
第71行: 第75行:
注意:--data-url为 iris 数据集的文件路径。
注意:--data-url为 iris 数据集的文件路径。


2.为数据提供方生成 Secp256k1 密钥对,密钥对生成在$HOME/.yeez.key/路径下
2.为数据提供方生成 Secp256k1 密钥对,密钥对生成在 $HOME/.yeez.key/ 路径下


   $ keymgr_tool --create
   $ keymgr_tool --create
第79行: 第83行:
   $ keymgr_tool --sign $DATA_HASH --sign.hex --sign.private-key $SEALED_PRIVATE_KEY
   $ keymgr_tool --sign $DATA_HASH --sign.hex --sign.private-key $SEALED_PRIVATE_KEY


注意:$DATA_HASH为步骤1中输出文件<nowiki>(iris.sealed.output)</nowiki>中的data_id字段,$SEALED_PRIVATE_KEY 为步骤2中密钥对文件的private_key字段。
注意: $DATA_HASH 为步骤1中输出文件<nowiki>(iris.sealed.output)</nowiki>中的 data_id 字段,$SEALED_PRIVATE_KEY 为步骤2中密钥对文件的 private_key 字段。


4.为数据使用方生成 Secp256k1 密钥对,数据使用方可以不依赖于 SGX 环境生成密钥对
4.为数据使用方生成 Secp256k1 密钥对,数据使用方可以不依赖于 SGX 环境生成密钥对
第93行: 第97行:
   $ yterminus --dhash $DATA_HASH --tee-pubkey $PROVIDER_PUBLIC_KEY --use-param 123 --param-format text --use-enclave-hash $ENCLAVE_HASH --output iris_param.json --use-privatekey-file iris.key.json
   $ yterminus --dhash $DATA_HASH --tee-pubkey $PROVIDER_PUBLIC_KEY --use-param 123 --param-format text --use-enclave-hash $ENCLAVE_HASH --output iris_param.json --use-privatekey-file iris.key.json


注意:$DATA_HASH为步骤1中输出文件(iris.sealed.output)中的data_id字段, $PROVIDER_PUBLIC_KEY为步骤2中密钥对文件的public_key字段,$ENCLAVE_HASH为步骤5中输出文件info.json的enclave-hash字段。
注意:$DATA_HASH 为步骤1中输出文件(iris.sealed.output)中的 data_id 字段, $PROVIDER_PUBLIC_KEY 为步骤2中密钥对文件的 public_key 字段,$ENCLAVE_HASH 为步骤5中输出文件 info.json 的 enclave-hash 字段。


7.在 iris 数据集上运行 K-Means 算法
7.在 iris 数据集上运行 K-Means 算法
第105行: 第109行:
   $ yterminus --decrypt-hex $ENCRYPTED_RESULT --use-privatekey-file iris.key.json --output result.output
   $ yterminus --decrypt-hex $ENCRYPTED_RESULT --use-privatekey-file iris.key.json --output result.output


注意:$ENCRYPTED_RESULT为步骤7中输出文件iris.result.encrypted的encrypted-result字段。
注意:$ENCRYPTED_RESULT为步骤7中输出文件 iris.result.encrypted 的 encrypted-result 字段。

2022年11月30日 (三) 03:03的版本

您可以通过本页面了解如何在 Fidelius 中运行一个示例程序。

基于 Iris 数据集的 K-Means 聚类算法

基于 Iris 数据集的 K-Means 聚类是机器学习中一个非常经典的学习示例,这里我们介绍一下如何在 Fidelius 中实现这个例子。

Iris 鸢尾花数据集

Iris 鸢尾花数据集内包含 3 类鸢尾花,分别为山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica),共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度。

  • sepallength:萼片长度
  • sepalwidth:萼片宽度
  • petallength:花瓣长度
  • petalwidth:花瓣宽度

以上四个特征的单位都是厘米(cm)


Iris pic.15.png

Iris数据集部分展示如下:

sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
5 5.4 3.9 1.7 0.4 Iris-setosa
6 4.6 3.4 1.4 0.3 Iris-setosa
7 5.0 3.4 1.5 0.2 Iris-setosa
8 4.4 2.9 1.4 0.2 Iris-setosa
9 4.9 3.1 1.5 0.1 Iris-setosa


K-Means 聚类算法

K 均值聚类(K-Means)是最著名的划分聚类算法,简洁和高效使得他成为所有聚类算法中最广泛使用的。其认为两个目标的距离越近,其相似度越大。

算法步骤:

  1. 选择初始化的 k 个样本作为初始聚类中心 a = a1, a2, ... ak;
  2. 针对数据集中每个样本 xi 计算它 k 个聚类中心的距离并将其分到距离最小的聚类中心所对应的类中;
  3. 针对每个类别 aj,重新计算它的聚类中心,即属于该类的所有样本的质心;
  4. 重复上面 2 3 两步操作,直到达到某个中止条件(迭代次数、最小误差变化等)。

K-Means算法通常使⽤肘部法则来选择 K 值。肘部法则考察聚类后全体样本的误差平⽅和 SSE,将 SSE 随 K 值的变化由快速下降转变为缓慢变化的拐点处的 K 值,作为最佳聚类簇数。

肘部法则选择 K 值的依据:随着聚类数 K 的增⼤,样本划分会更加精细,每个簇的聚合程度会逐渐提⾼,那么误差平⽅和 SSE ⾃然会逐渐变⼩。且当 K ⼩于真实聚类数时,K 的增⼤会⼤幅增加每个簇的聚合程度,故 SSE 的下降幅度会很⼤;当 K 达到真实聚类数时,再增加 K 所得到的聚合程度,回报就会迅速变⼩,所以 SSE 的下降幅度会骤减,然后随着K值的继续增⼤⽽趋于平缓。也就是说 SSE 与 K 之间的关系就像⼿肘的形状,这个肘部对应的K值就是数据的真实聚类数。

使⽤K-Means对数据集iris进⾏聚类分析:加载iris数据集,按照4个特征,使⽤肘部法则确定最佳的K值,然后使⽤KMeans类进⾏聚类,最后可视化聚类结果。

Kmeans.png

在 Fidelius 中运行 K-Means

1.准备 iris 数据集的封存数据

 $ data_provider --data-url /path/to/ypc/bin/iris.data --plugin-path /usr/local/lib/libiris_reader.so --sealed-data-url iris.sealed --output iris.sealed.output --sealer-path /usr/local/lib/edatahub.signed.so

注意:--data-url为 iris 数据集的文件路径。

2.为数据提供方生成 Secp256k1 密钥对,密钥对生成在 $HOME/.yeez.key/ 路径下

 $ keymgr_tool --create

3.数据提供方使用 Secp256k1 的私钥签名 iris 数据集的数据哈希

 $ keymgr_tool --sign $DATA_HASH --sign.hex --sign.private-key $SEALED_PRIVATE_KEY

注意: $DATA_HASH 为步骤1中输出文件(iris.sealed.output)中的 data_id 字段,$SEALED_PRIVATE_KEY 为步骤2中密钥对文件的 private_key 字段。

4.为数据使用方生成 Secp256k1 密钥对,数据使用方可以不依赖于 SGX 环境生成密钥对

 $ yterminus --gen-key  --no-password  --output iris.key.json

5.获取 K-Means 算法的算法哈希

 $ ydump --enclave /usr/local/lib/iris_parser.signed.so --output info.json

6.加密 K-Means 算法的输入参数

 $ yterminus --dhash $DATA_HASH --tee-pubkey $PROVIDER_PUBLIC_KEY --use-param 123 --param-format text --use-enclave-hash $ENCLAVE_HASH --output iris_param.json --use-privatekey-file iris.key.json

注意:$DATA_HASH 为步骤1中输出文件(iris.sealed.output)中的 data_id 字段, $PROVIDER_PUBLIC_KEY 为步骤2中密钥对文件的 public_key 字段,$ENCLAVE_HASH 为步骤5中输出文件 info.json 的 enclave-hash 字段。

7.在 iris 数据集上运行 K-Means 算法

 $ GLOG_logtostderr=1 fid_analyzer --sealed-data-url iris.sealed --sealer-path /usr/local/lib/edatahub.signed.so --parser-path /usr/local/lib/iris_parser.signed.so --keymgr /usr/local/lib/keymgr.signed.so --source-type json --param-path iris_param.json --result-path iris.result.encrypted --check-data-hash $DATA_HASH

注意:$DATA_HASH为步骤1中输出文件(iris.sealed.output)中的data_id字段。

8.解密分析结果

 $ yterminus --decrypt-hex $ENCRYPTED_RESULT --use-privatekey-file iris.key.json --output result.output

注意:$ENCRYPTED_RESULT为步骤7中输出文件 iris.result.encrypted 的 encrypted-result 字段。