class MyPerceptron: def __init__(self): self.w = np.ones(len(data[0]) - 1, dtype=np.float32) self.b = 0 self.l_rate = 0.1 # self.data = data def sign(self, x, w, b): y = np.dot(x, w) + b return y def fit(self, X_train, y_train): is_wrong = False while not is_wrong: wrong_count = 0 for d in range(len(X_train)): X = X_train[d] y = y_train[d] if y * self.sign(X, self.w, self.b) <= 0: self.w = self.w + self.l_rate * np.dot(y, X) self.b = self.b + self.l_rate * y wrong_count += 1 if wrong_count == 0: is_wrong = True return 'My Perceptron Model!' def score(self): pass
时间: 2024-02-10 15:35:24 浏览: 26
这段代码是一个简单的感知器(Perceptron)模型的实现。感知器是一种二分类的线性分类模型,它通过计算输入特征与权重的线性组合,并加上一个偏置项,将结果通过一个阈值函数(sign函数)映射到输出类别上。在这段代码中,模型的参数包括权重(w)、偏置项(b)和学习率(l_rate),fit方法用于训练模型,score方法用于评估模型的准确率。感知器模型在机器学习的早期曾经非常流行,但是它只能处理线性可分的数据集,对于非线性可分的数据集表现不佳。
相关问题
class Client(object): def __init__(self, conf, public_key, weights, data_x, data_y): self.conf = conf self.public_key = public_key self.local_model = models.LR_Model(public_key=self.public_key, w=weights, encrypted=True) #print(type(self.local_model.encrypt_weights)) self.data_x = data_x self.data_y = data_y #print(self.data_x.shape, self.data_y.shape) def local_train(self, weights): original_w = weights self.local_model.set_encrypt_weights(weights) neg_one = self.public_key.encrypt(-1) for e in range(self.conf["local_epochs"]): print("start epoch ", e) #if e > 0 and e%2 == 0: # print("re encrypt") # self.local_model.encrypt_weights = Server.re_encrypt(self.local_model.encrypt_weights) idx = np.arange(self.data_x.shape[0]) batch_idx = np.random.choice(idx, self.conf['batch_size'], replace=False) #print(batch_idx) x = self.data_x[batch_idx] x = np.concatenate((x, np.ones((x.shape[0], 1))), axis=1) y = self.data_y[batch_idx].reshape((-1, 1)) #print((0.25 * x.dot(self.local_model.encrypt_weights) + 0.5 * y.transpose() * neg_one).shape) #print(x.transpose().shape) #assert(False) batch_encrypted_grad = x.transpose() * (0.25 * x.dot(self.local_model.encrypt_weights) + 0.5 * y.transpose() * neg_one) encrypted_grad = batch_encrypted_grad.sum(axis=1) / y.shape[0] for j in range(len(self.local_model.encrypt_weights)): self.local_model.encrypt_weights[j] -= self.conf["lr"] * encrypted_grad[j] weight_accumulators = [] #print(models.decrypt_vector(Server.private_key, weights)) for j in range(len(self.local_model.encrypt_weights)): weight_accumulators.append(self.local_model.encrypt_weights[j] - original_w[j]) return weight_accumulators
这段代码看起来是一个客户端的类实现,其中包含了初始化函数和本地训练函数。初始化函数接受一些参数,包括全局配置conf、公钥public_key、权重weights、数据x和数据y。在初始化函数中,使用公钥public_key和权重weights创建一个加密的逻辑回归模型local_model,并将数据x和y保存在类实例中。
本地训练函数local_train接受一个权重参数weights,并将其设置为local_model的加密权重。在函数中,使用随机梯度下降算法对模型进行训练,其中每次迭代从数据集中随机选择一个batch_size大小的样本进行训练。在计算梯度时,使用加密权重对样本进行预测,并使用公钥对-1进行加密,然后计算损失函数的梯度并进行加密。最后,使用学习率lr对加密权重进行更新,并将更新的权重返回给调用者。
需要注意的是,本地训练函数中使用了加密的权重和加密的梯度进行计算,以确保数据隐私不会被泄露。
用zhengqi_train.txt 实现二元逻辑回归手写实现和调库实现包含准确率
好的,我来回答你的问题。
首先,二元逻辑回归是一种分类算法,适用于二分类问题。在本次实现中,我们使用 `zhengqi_train.txt` 数据集,该数据集是一个回归问题,因此我们需要将其转化为二分类问题。我们可以将数据集中的每个样本的 `target` 值与一个阈值进行比较,将大于阈值的样本归为一类,小于等于阈值的样本归为另一类。这里我们选择将阈值设为数据集中 `target` 值的中位数。
接下来,我们可以使用手写实现和调库实现两种方式来进行二元逻辑回归的实现。
1. 手写实现
首先,我们需要将数据集拆分为训练集和测试集。这里我们选择将数据集的前80%作为训练集,后20%作为测试集。
```python
import pandas as pd
import numpy as np
# 读取数据集
data = pd.read_csv('zhengqi_train.txt', sep='\t')
# 将数据集中的target值与中位数进行比较,将大于中位数的样本归为一类,小于等于中位数的样本归为另一类
threshold = np.median(data['target'])
data['label'] = (data['target'] > threshold).astype(int)
# 将数据集拆分为训练集和测试集
train_data = data[:int(len(data)*0.8)]
test_data = data[int(len(data)*0.8):]
```
接下来,我们可以定义二元逻辑回归的模型和损失函数。这里我们采用梯度下降法来求解损失函数的最小值。
```python
# 定义sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义二元逻辑回归模型
class LogisticRegression:
def __init__(self, lr=0.01, max_iter=10000, tol=1e-4):
self.lr = lr # 学习率
self.max_iter = max_iter # 最大迭代次数
self.tol = tol # 收敛阈值
def fit(self, X, y):
# 给X添加一列全为1的列,用于计算截距
X = np.hstack((np.ones((X.shape[0], 1)), X))
# 初始化权重
self.w = np.zeros((X.shape[1], 1))
# 梯度下降求解最优权重
for i in range(self.max_iter):
# 计算预测值
y_pred = sigmoid(np.dot(X, self.w))
# 计算损失函数值
loss = -np.mean(y*np.log(y_pred) + (1-y)*np.log(1-y_pred))
# 计算梯度
grad = np.dot(X.T, (y_pred-y)) / X.shape[0]
# 更新权重
self.w -= self.lr * grad
# 判断是否收敛
if np.sum(np.abs(grad)) < self.tol:
break
def predict(self, X):
# 给X添加一列全为1的列,用于计算截距
X = np.hstack((np.ones((X.shape[0], 1)), X))
# 计算预测值
y_pred = sigmoid(np.dot(X, self.w))
# 将概率值转换为类别标签
y_pred = (y_pred > 0.5).astype(int)
return y_pred
```
接下来,我们可以使用训练集来训练我们的模型,并使用测试集来评估模型的性能。
```python
# 定义模型和损失函数
lr = LogisticRegression(lr=0.1, max_iter=10000, tol=1e-4)
# 训练模型
lr.fit(train_data.iloc[:, :-2].values, train_data.iloc[:, -1].values)
# 预测测试集
y_pred = lr.predict(test_data.iloc[:, :-2].values)
# 计算准确率
acc = np.mean(y_pred == test_data.iloc[:, -1].values)
print('准确率:', acc)
```
2. 调库实现
除了手写实现外,我们还可以使用sklearn库中的LogisticRegression类来实现二元逻辑回归。
```python
from sklearn.linear_model import LogisticRegression
# 将数据集拆分为训练集和测试集
train_data = data[:int(len(data)*0.8)]
test_data = data[int(len(data)*0.8):]
# 初始化模型
lr = LogisticRegression()
# 训练模型
lr.fit(train_data.iloc[:, :-2].values, train_data.iloc[:, -1].values)
# 预测测试集
y_pred = lr.predict(test_data.iloc[:, :-2].values)
# 计算准确率
acc = np.mean(y_pred == test_data.iloc[:, -1].values)
print('准确率:', acc)
```
以上就是手写实现和调库实现二元逻辑回归的过程,并计算出了模型的准确率。