感知机python自编码
栗子:在掷硬币实验中估计出现正面向上的概率θ(西塔)。
word版的推导过程,资源链接如下:
https://download.csdn.net/download/weixin_37200373/11974264
极大似然是根据样本的信息对θ求的估计
贝叶斯估计不仅有样本信息还有先验信息。
1)先验:根据统计历史上的经验、常识当下事件发生的概率;
2)似然:当下事件由果及因发生的概率;
3)后验:当下事件由因及果发生的概率。
先验概率分布,即关于某个变量 p 的概率分布p(θ) ;对于结果 x ,在参数集合 θ 上的似然,就是在给定这些参数值的基础上,观察到的结果的概率 L(θ|x)=p(x|θ) ;后验概率是关于参数 θ 在给定的证据信息 X 下的概率: p(θ|x) 。后验概率定义如下:p(θ|x)=p(x|θ)p(θ)/p(x)。
一。Γ\GammaΓ分布
指数分布是两次事件发生的时间间隔
Γ\GammaΓ分布是n倍的指数分布
即,Γ\GammaΓ分布表示发生n次(α\alphaα次)事件的时间间隔的概率分布。
其实 Γ\GammaΓ分布 就是Possion分布在正实数集上的连续化版本
问题:已知数据集D服从概率分布P,P中参数未知。
极大似然估计目标:未知参数θ使得数据集D(x1,x2…xn)发生的概率最大。max P(D/θ)(未知参数θ是一个定值)
而贝叶斯估计目标:数据集D(x1,x2…xn)发生的情况下,哪一个θ发生的概率最大。max P(θ/D)(未知参数θ本身服从一定的概率分布)
等于0代表是直线,如果是大于0是+1,如果是小于0的是-1;
判断错误的点到直线的距离
点到直线的距离计算:
那么所有误分类点的总距离:
然后最小化:
因为|W|没有x和b所以等价于:
这点是误分类点:
更新w和b:旋转和平移
更新完后会得到新的直线:
继续找出误分类的点去更新直线直到没有误分类的点;
最后找到的直线可能并不是唯一确定的,可能决定于它选的初始值以及误分类点的顺序;
每一次只通过一个误分类点来更新直线,那我选择不同的误分类点导致不同的结果;
当训练集中没有误分类点的时候,输出w和b就可以确定一条直线了;
假设空间由:
决定而不是:
学习率的取值在0和1之间,越靠近1说明我的直线向误分类点移动程度都比较大;
算法2.2相比算法2.1可以提前算出x的内积,提前减少负担;
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Nov 15 10:05:18 2019
@author: Anne
"""
import numpy as np
import matplotlib.pyplot as plt
class MyPerceptron:
def __init__(self):
#选出初始值w0,b0以及学习率l_rate
self.w = None
self.b = 0
self.l_rate = 1
def fit(self,X_train,y_train):
#用样本点的特征数量更新初始w,如x1 = (3,3)T,有两个特征,self.w = [0,0]
self.w = np.zeros(X_train.shape[1])#初始化数据集
i = 0
#然后遍历数据集
#如果存在无分类点yi(w.xi+b)<=0(误分类点有两种情况-yi(wx+b)>0另一种情况:yi(wxi+b)<0书上27页有的):
#w = w+l_rateyixi
#b = b+l_rate.yi
#在更新平面的时候误分类点需要重新去判定
#如果判定是被正确分类了就i+1,这里i+1表示进行下一个点的判定,直到所有的点都被正确分类了,这时的i就等于X_train.shape[0]
while i<X_train.shape[0]:
X = X_train[i]
y = y_train[i]
if y*(np.dot(self.w,X)+self.b) <= 0:
self.w = self.w + self.l_rate*np.dot(y,X)
self.b = self.b + self.l_rate*y
i = 0#如果是误判点,从头进行检测
else:
i+=1
def draw(X,w,b):
#生产分离超平面上的两点
X_new=np.array([[0], [6]])
y_predict=-b-(w[0]*X_new)/w[1]
#绘制训练数据集的散点图
plt.plot(X[:2,0],X[:2,1],"g*",label="1")
plt.plot(X[2:,0], X[2:,0], "rx",label="-1")
#绘制分离超平面
plt.plot(X_new,y_predict,"b-")
#设置两坐标轴起止值
plt.axis([0,6,0,6])
#设置坐标轴标签
plt.xlabel('x1')
plt.ylabel('x2')
#显示图例
plt.legend()
#显示图像
plt.show()
#主函数
def main():
# 构造训练数据集
X_train=np.array([[3,3],[4,3],[1,1]])
y_train=np.array([1,1,-1])
# 构建感知机对象,对数据集继续训练
perceptron=MyPerceptron()
perceptron.fit(X_train,y_train)
print(perceptron.w)
print(perceptron.b)
# 结果图像绘制
draw(X_train,perceptron.w,perceptron.b)
if __name__=="__main__":
main()
py文件下载地址:https://download.csdn.net/download/weixin_37200373/11987967
word版贝叶斯估计推导过程文件下载地址:
https:///download.csdn.net/download/weixin_37200373/11974264
sklearn里感知机:
from sklearn.linear_model import Perceptron
import numpy as np
X_train = np.array([[3, 3], [4, 3], [1, 1]])
y = np.array([1, 1, -1])
perceptron=Perceptron()
perceptron.fit(X_train,y)
print("w:",perceptron.coef_,"\n","b:",perceptron.intercept_,"\n","n_iter:",perceptron.n_iter_)
res=perceptron.score(X_train,y)
print("correct rate:{:.0%}".format(res))
其他问题:
Q1:学习率对迭代过程和最终结果有无影响?
当w,b的初始值均为0的话没有影响,因为w和b都是0,更新的时候w和b都是倍速(学习率)可以同时去掉学习率没有影响;
但是w和b的初始值不为0的话,就会有影响了;