感知器算法代码(python实现)

感知器算法代码(python实现)

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split


def load_data():
    path = 'cmc_0_2.csv'
    data = pd.read_csv(path)
    X = data.iloc[:, :-2]
    y = data.iloc[:, -1]
    return X, y


def perceptron(dataArr, labelArr, iter=50):
    '''
    :param dataArr: 训练数据
    :param labelArr: 标签
    :param iter: 迭代次数,默认值为50
    :return: 训练好的w和b
    '''
    # 将数据转换成矩阵形式(在机器学习中因为通常都是向量的运算,转换称矩阵形式方便运算)
    # 转换后的数据中每一个样本的向量都是横向的
    dataMat = np.mat(dataArr)

    # 将标签转换成矩阵,之后转置(.T为转置)。
    # 转置是因为在运算中需要单独取label中的某一个元素,如果是1xN的矩阵的话,无法用label[i]的方式读取
    # 对于只有1xN的label可以不转换成矩阵,直接label[i]即可,这里转换是为了格式上的统一
    labelMat = np.mat(labelArr).T

    # 获取数据矩阵的大小,为m*n
    m, n = np.shape(dataMat)
    # 创建初始权重w,b
    w = np.zeros((1, np.shape(dataMat)[1]))
    b = 0
    # 初始学习率
    lr = 0.001

    for k in range(iter):
        # 对于每一个样本进行梯度下降
        for i in range(m):
            # 获取当前样本的向量
            xi = dataMat[i]
            yi = labelMat[i]
            if -1*yi * (w * xi.T + b) >= 0:
                w = w + lr * yi * xi
                b = b + lr * yi
        # print('Round %d:%d training' % (k, iter))
    return w, b


def test(dataArr, labelArr, w, b):
    '''
    测试准确率
    :param dataArr:测试集
    :param labelArr: 测试集标签
    :param w: 训练获得的权重w
    :param b: 训练获得的偏置b
    :return: 正确率
    '''
    dataMat = np.mat(dataArr)
    labelMat = np.mat(labelArr).T
    m, n = np.shape(dataMat)
    # 错误样本数计数
    errorCnt = 0
    # 遍历所有测试样本
    for i in range(m):
        xi = dataMat[i]
        yi = labelMat[i]
        # 获得运算结果
        result = -1 * yi * (w * xi.T + b)
        # 如果-yi(w*xi+b)>=0,说明该样本被误分类,错误样本数加一
        if result >= 0: errorCnt += 1
    acc = 1 - (errorCnt / m)

    return acc


if __name__ == '__main__':
    X, y = load_data()
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)

    w, b = perceptron(X_train, y_train, iter=1000)
    test_acc = test(X_test, y_test, w, b)
    print(w,b)
    print(test_acc)

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Rosenblatt感知器算法是一种二元分类算法,它可以根据给定的训练数据集,学习到一个超平面,将数据集分为两个部分。 以下是用Python实现Rosenblatt感知器算法代码和结果: ``` import numpy as np class Perceptron: def __init__(self, learning_rate=0.1, num_iterations=100): self.learning_rate = learning_rate self.num_iterations = num_iterations def fit(self, X, y): n_samples, n_features = X.shape self.weights = np.zeros(n_features + 1) X = np.c_[X, np.ones(n_samples)] for _ in range(self.num_iterations): for i in range(n_samples): if y[i] * np.dot(X[i], self.weights) <= 0: self.weights += self.learning_rate * y[i] * X[i] def predict(self, X): n_samples, _ = X.shape X = np.c_[X, np.ones(n_samples)] y_pred = np.sign(np.dot(X, self.weights)) return y_pred ``` 我们可以用以下代码测试这个算法: ``` from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score X, y = make_blobs(n_samples=1000, centers=2, n_features=2, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) perceptron = Perceptron() perceptron.fit(X_train, y_train) y_pred = perceptron.predict(X_test) print("Accuracy:", accuracy_score(y_test, y_pred)) ``` 输出结果为: ``` Accuracy: 1.0 ``` 可以看到,这个算法在这个数据集上取得了100%的准确率。 需要注意的是,Rosenblatt感知器算法只适用于线性可分的数据集。对于非线性可分的数据集,我们需要使用其他的分类算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值