【代码解析(1)】Secure Federated Matrix Factorization

DistributeMF_Full.py

import time
import copy
import numpy as np

from load_data import ratings_dict, item_id_list, user_id_list
from shared_parameter import *

# print(ratings_dict)


def user_update(single_user_vector, user_rating_list, item_vector):
    """
    :param single_user_vector:
    :param user_rating_list:
    :param item_vector:
    :return:
    函数的作用: 更新user_vector和gradient
    """
    gradient = np.zeros([len(item_vector), len(single_user_vector)])
    # gradient矩阵初始化,行为item数,列为user数、
    # too many values to unpack (expected 2)
    for item_id, rate, _ in user_rating_list:
        error = rate - np.dot(single_user_vector, item_vector[item_id])
        # 对于用户user,一个交互记录就更新一次向量
        single_user_vector = single_user_vector - lr * (-2 * error * item_vector[item_id] + 2 * reg_u * single_user_vector)
        gradient[item_id] = error * single_user_vector
    # print(single_user_vector)
    # print('00000000000')
    # print(gradient)

    return single_user_vector, gradient


def loss():
    loss = []
    # User updates
    for i in range(len(user_id_list)):
        # user_id_list: ['1', '4', '5', '6', '7', '8', '10']
        for r in range(len(ratings_dict[user_id_list[i]])):
            # len(ratings_dict[user_id_list[i]])表示有几个交互记录
            # too many values to unpack (expected 2)
            # 因为后面一句返回三个值,前面只有两个变量接收,所以要加一个'_'
            item_id, rate, _ = ratings_dict[user_id_list[i]][r]

            error = (rate - np.dot(user_vector[i], item_vector[item_id])) ** 2
            loss.append(error)
    return np.mean(loss)


if __name__ == '__main__':

    # Init process
    # 初始化用户矩阵和item矩阵
    # np.random.normal()从正态高斯分布中抽取随机样本作为矩阵的填充值。
    user_vector = np.random.normal(size=[len(user_id_list), hidden_dim])
    # print(user_vector)
    item_vector = np.random.normal(size=[len(item_id_list), hidden_dim])

    start_time = time.time()

    for iteration in range(max_iteration):

        print('###################')
        t = time.time()

        # Step 2 User updates
        gradient_from_user = []
        for i in range(len(user_id_list)):
            """
                更新用户矩阵的每一个用户行
                以及gradient矩阵,gradient的行为item,列为user
            """
            user_vector[i], gradient = user_update(user_vector[i], ratings_dict[user_id_list[i]], item_vector)
            """
                遍历完一个用户的所有交互记录将最终的gradient存入gradient_from_user
            """
            gradient_from_user.append(gradient)
        # print(gradient_from_user) 列表

        '''
            item的更新源于g的值
            g的值是User update来的
            妙啊!!
        '''
        # Step 3 Server update
        tmp_item_vector = copy.deepcopy(item_vector)
        # print(item_vector)
        # tmp_item_vector存储一下item_vector更新之前的值
        for g in gradient_from_user:
            item_vector = item_vector - lr * (-2 * g + 2 * reg_u * item_vector)

        # 拟合条件,更新后的矩阵与原始矩阵(每个矩阵,每一行值都是不一样的因为这次是正态分布值)的差值的平均小于0.0004

        if np.mean(np.abs(item_vector - tmp_item_vector)) < 1e-4:
            print('Converged')
            break

        print('Time', time.time() - t, 's')

        print('loss', loss())

    print('Converged using', time.time() - start_time)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Federated learning是一种分布式机器学习方法,它允许在不共享数据的情况下训练模型。以下是一个简单的Python代码示例,用于实现基本的federated learning: 1. 客户端代码: ```python import tensorflow as tf import numpy as np # 加载本地数据 def load_data(): # 加载本地数据 return x_train, y_train # 定义客户端模型 def create_model(): model = tf.keras.models.Sequential([ tf.keras.layers.Dense(10, activation='relu', input_shape=(784,)), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) return model # 客户端训练 def train_client(model, x_train, y_train): model.fit(x_train, y_train, epochs=5, batch_size=32) return model # 客户端评估 def evaluate_client(model, x_test, y_test): loss, acc = model.evaluate(x_test, y_test) return acc # 加载本地数据 x_train, y_train = load_data() # 创建客户端模型 model = create_model() # 客户端训练 model = train_client(model, x_train, y_train) # 客户端评估 acc = evaluate_client(model, x_test, y_test) # 将模型上传到服务器 model_weights = model.get_weights() ``` 2. 服务器代码: ```python import tensorflow as tf import numpy as np # 加载本地数据 def load_data(): # 加载本地数据 return x_test, y_test # 定义全局模型 def create_global_model(): model = tf.keras.models.Sequential([ tf.keras.layers.Dense(10, activation='relu', input_shape=(784,)), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) return model # 更新全局模型 def update_global_model(global_model, client_models): # 计算客户端模型的平均权重 client_weights = [model.get_weights() for model in client_models] avg_weights = np.mean(client_weights, axis=) # 更新全局模型的权重 global_model.set_weights(avg_weights) return global_model # 评估全局模型 def evaluate_global_model(global_model, x_test, y_test): loss, acc = global_model.evaluate(x_test, y_test) return acc # 加载本地数据 x_test, y_test = load_data() # 创建全局模型 global_model = create_global_model() # 更新全局模型 global_model = update_global_model(global_model, client_models) # 评估全局模型 acc = evaluate_global_model(global_model, x_test, y_test) ``` 这是一个非常简单的federated learning实现,它只涉及一个客户端和一个服务器。在实际应用中,可能会涉及多个客户端和多个服务器,以及更复杂的模型和训练过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值