暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python学习3

原创 kayla 2023-03-20
327

class Perception:
"""使用Python语言实习感知器算法,实现二分类。"""
def __init__(self,alpha,times):
"""初始化方法。

Parameters
----------
alpha:float
学习率

times:int
最大迭代次数
"""
self.alpha = alpha
self.times = times

def step(self,z):
"""阶跃函数


Parameters
--------
z:多个值为数组类型(或者单个值为标量类型)
阶跃函数的参数,可以根据z的值,返回1或-1(这样实现二分类)

Returns
--------
value:int
如果z>=0,返回1,否则返回-1
"""

# return 1 if z>=0 else 0
return np.where(z>=0,1,-1)

def fit(self,X,y):
"""根据提供的训练数据对模型进行训练


Parameters
-----------
X:类数组类型。形状:[样本数量,特征数量]
待训练的样本数据

y:类数组类型。形状:[样本数量]
每个样本的目标值(分类)

"""
X=np.asarray(X)
y=np.asarray(y)
# 创建权重的向量,长度比特征多1,多出来的为截距
self.w_=np.zeros(1+X.shape[1])#特征数量+1为初始权重数量,初始值均为0
#创建损失列表,用来保存每次迭代后的损失值
self.loss_=[]
#循环指定的次数
for i in range(self.times):
#感知器与逻辑回归的区别,逻辑回归中,适用所有样本计算梯度然后更新权重,
#感知器中,使用单个样本,依次进行计算梯度,更新权重
loss=0
for x,target in zip(X,y):
#计算预测值
y_hat=self.step(np.dot(x,self.w_[1:])+self.w_[0])
loss += y_hat != target
#更新权重
#更新:w(j)=w(j) +学习率*(真实值-预测值) *x(j)
self.w_[0]+= self.alpha * (target-y_hat)
self.w_[1:] += self.alpha * (target-y_hat) * x
#将循环中累计的误差值增加到误差列表当中
self.loss_.append(loss)

def predict(self,X):
"""根据参数传递到样本,对数据进行预测。(1或者-1)

Parameters
============
X:类数组类型,形状为:[样本数量,特征数量]
待预测的样本特征。

Returns
------
result:数组类型
预测的结果值(分类值1或-1)
"""
return self.step(np.dot(X,self.w_[1:])+self.w_[0])class Perception:

"""使用Python语言实习感知器算法,实现二分类。"""
def __init__(self,alpha,times):
"""初始化方法。

Parameters
----------
alpha:float
学习率

times:int
最大迭代次数
"""
self.alpha = alpha
self.times = times

def step(self,z):
"""阶跃函数


Parameters
--------
z:多个值为数组类型(或者单个值为标量类型)
阶跃函数的参数,可以根据z的值,返回1或-1(这样实现二分类)

Returns
--------
value:int
如果z>=0,返回1,否则返回-1
"""

# return 1 if z>=0 else 0
return np.where(z>=0,1,-1)

def fit(self,X,y):
"""根据提供的训练数据对模型进行训练


Parameters
-----------
X:类数组类型。形状:[样本数量,特征数量]
待训练的样本数据

y:类数组类型。形状:[样本数量]
每个样本的目标值(分类)

"""
X=np.asarray(X)
y=np.asarray(y)
# 创建权重的向量,长度比特征多1,多出来的为截距
self.w_=np.zeros(1+X.shape[1])#特征数量+1为初始权重数量,初始值均为0
#创建损失列表,用来保存每次迭代后的损失值
self.loss_=[]
#循环指定的次数
for i in range(self.times):
#感知器与逻辑回归的区别,逻辑回归中,适用所有样本计算梯度然后更新权重,
#感知器中,使用单个样本,依次进行计算梯度,更新权重
loss=0
for x,target in zip(X,y):
#计算预测值
y_hat=self.step(np.dot(x,self.w_[1:])+self.w_[0])
loss += y_hat != target
#更新权重
#更新:w(j)=w(j) +学习率*(真实值-预测值) *x(j)
self.w_[0]+= self.alpha * (target-y_hat)
self.w_[1:] += self.alpha * (target-y_hat) * x
#将循环中累计的误差值增加到误差列表当中
self.loss_.append(loss)

def predict(self,X):
"""根据参数传递到样本,对数据进行预测。(1或者-1)

Parameters
============
X:类数组类型,形状为:[样本数量,特征数量]
待预测的样本特征。

Returns
------
result:数组类型
预测的结果值(分类值1或-1)
"""
return self.step(np.dot(X,self.w_[1:])+self.w_[0])

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论