人工智能原理自学(一)——Rosenblatt感知器模型与梯度下降算法

第一讲——一元一次函数感知器:如何描述直觉

Rosenblatt感知器模型

朴素但又意义非凡

第一个神经元模型——MCCulloch-Pitts模型,Rosenblat感知器模型正是让这个最简单的神经元模型拥有自我调整的能力

输入x
y = wx
标准答案 - y = 误差
w + α * 误差 * x = 新w
w = 新w

代码实现

import dataset
from matplotlib import pyplot as plt
xs,ys = dataset.get_beans(100)
print(xs)
print(ys)
#配置图像
plt.title("Size-Toxicity Function",fontsize = 12)#设置图像名称
plt.xlabel("Bean Size")
plt.ylabel("Toxicity")
plt.scatter(xs,ys )
plt.show()
w = 0.5
for j in range(100)
	for i in range (100)
		x = xs[i]
		y = ys[i]
		y_pre =  w* x
		error = y - y_pre
		alpha = 0.05
		w = w + alpha * error * x
		
y_pre = w * xs 
print(y_pre)
plt.plot(xs,y_pre)
plt.show()

使用了两个for循环嵌套以提高训练次数,训练结果如下:
在这里插入图片描述

第二讲 方差代价函数——知错

现代神经网络的实现方式
事物出现的频率,收敛于它的概率

代价函数(Cost Function) ——当参数w取不同值时,对环境中的问题数据预测时产生不同的误差error。反过来,利用代价函数最低点的w值,把它放回到预测函数中,这时候预测函数也就很好的完成了对数据的拟合
在这里插入图片描述
代码实现:

import dataset
import matplotlib.pyplot as plt
import numpy as np

xs,ys = dataset.get_beans(100)

w = 0.100
 

# plot the figure
plt.title ("Size-Toxicity Function",fontsize = 12)
plt.xlabel("Bean size")
plt.ylabel("Toxicity")
plt.scatter(xs,ys)
y_pre = w* xs
plt.plot(xs,y_pre)
plt.show()


es = (ys - y_pre)**2
sum_e = np.sum(es)
sum_e = (1/100) * sum_e
print(sum_e)
ws = np.arange(0,3,0.1)
es = []
for w in ws:
	y_pre = w * xs
	y_pre = w * xs
	e = (1/100) * np.sum((ys - y_pre)**2)
	es.append(e)

plt.plot(ws,es)
plt.show()

w_min = np.sum(xs * ys) / np.sum(xs * xs)
y_pre = w_min * xs
plt.title("Size-Toxcity Function Final",fontsize = 12)
plt.xlabel("Bean Size")
plt.ylabel("Toxcity")
plt.scatter(xs,ys)
plt.plot(xs,y_pre)
plt.show() 

梯度下降(一)

根据error的代数式可以看出,error的大小其实是一个以w为自变量的开口向上的抛物线函数,因此可以通过数据点(x,y)处erroe函数的梯度值来动态调整w的值。常见有:全局梯度下降(并行计算,计算量大)、随机梯度下降(不能并行计算)。mini batch —— mini批量梯度下降则结合了两者的优点,每次从样本中抽取100~200个数据进行梯度下降。
y = w * x函数模型代码实现:

import dataset
import matplotlib.pyplot as plt
import numpy as np

xs,ys = dataset.get_beans(100)

w = 0.100
 

# plot the figure
plt.title ("Size-Toxicity Function",fontsize = 12)
plt.xlabel("Bean size")
plt.ylabel("Toxicity")
plt.scatter(xs,ys)

w = 0.1 
y_pre = w * xs
for _ in range(100):
	for i in range(100):
		x = xs[i]
		y = ys[i]
		# a= x ^ 2
		# b = -2*x*y
		# c = y^2
		k = 2*(x**2)*w + (-2*x*y)
		alpha = 0.1
		w = w -alpha*k
		plt.clf()
		plt.scatter(xs,ys)
		plt.xlim(0,1)
		plt.ylim(0,1.2)
		y_pre = w * xs
		plt.plot(xs,y_pre)
		plt.pause(0.1)

梯度下降(二)

在(一)中基于与y=wx的函数模型推算出的梯度下降模型,并不能满足二维空间平面中的所有散点,即:y=wx的函数模型限制了预测直线在空间中的自由移动,只有一个 旋转自由度,因此将函数模型“升维”为y = wx + b形式,即相应的error变为error(w,b)的二元函数,因此通过三维图像表示如下:
error值的三维曲面形态
那么接下来就是同样利用梯度下降的思维找到曲面的最低点,就是问题的最优解:
在这里插入图片描述
基于梯度下降思路以及方差代价函数的神经元模型如下所示:
在这里插入图片描述高维梯度下降算法代码实现:

import dataset
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D 
xs,ys = dataset.get_beans(100)
w = 0.100
b = 100
y_pre = w * xs + b
# plot the figure
plt.title ("Size-Toxicity Function",fontsize = 12)
plt.xlabel("Bean size")
plt.ylabel("Toxicity")
plt.scatter(xs,ys)
plt.plot(xs	,y_pre)
plt.show()

for _ in range(500):
	for i in range(100):
		x = xs[i]
		y = ys[i]
		dw = 2 * x**2*w + 2*x*b - 2*x*y
		db = 2 * b + 2* x *w - 2*y
		alpha = 0.02
		w = w - alpha * dw
		b = b - alpha * db
	plt.clf()
	plt.scatter(xs,ys)
	y_pre = w * xs + b
	plt.xlim(0,1)
	plt.ylim(0,1.2)
	plt.plot(xs,y_pre)
	plt.pause(0.01)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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感知器算法只适用于线性可分的数据集。对于非线性可分的数据集,我们需要使用其他的分类算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值