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]returnX, 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.001for k inrange(iter):
# 对于每一个样本进行梯度下降
for i inrange(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 inrange(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)
感知器算法代码(python实现)import numpy as npimport pandas as pdfrom sklearn.model_selection import train_test_splitdef load_data(): path = 'cmc_0_2.csv' data = pd.read_csv(path) X = data.iloc...