《统计学习方法》学习笔记 (第二章)

第二章 感知机

二分类模型

源代码出处:https://github.com/fengdu78/lihang-code/blob/master/code/第2章 感知机(Perceptron)/Iris_perceptron.ipynb

f ( x ) = s i g n ( w ∗ x + b ) f(x) = sign(w*x + b) f(x)=sign(wx+b)
损失函数 L ( w , b ) = − Σ y i ( w ∗ x i + b ) L(w, b) = -\Sigma{y_{i}(w*x_{i} + b)} L(w,b)=Σyi(wxi+b)

算法:
随即梯度下降法 Stochastic Gradient Descent
随机抽取一个误分类点使其梯度下降。

w = w + η y i x i w = w + \eta y_{i}x_{i} w=w+ηyixi
b = b + η y i b = b + \eta y_{i} b=b+ηyi

当实例点被误分类,即位于分离超平面的错误侧,则调整w, b的值,使分离超平面向该无分类点的一侧移动,直至误分类点被正确分类。

  • iris数据集(鸢尾花数据集)

数据集中属性feature_names包括四个:Sepal.Length(花萼长度)、Sepal.Width(花萼宽度)、Petal.Length(花瓣长度)、Petal.Width(花瓣宽度),特征值都为正浮点数,单位为厘米。
iris.target为目标值,目标值为鸢尾花的分类(Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),Iris Virginica(维吉尼亚鸢尾))。

拿出iris数据集(鸢尾花数据集)中两个分类的数据和[sepal length,sepal width]作为特征。

  • Pandas

Pandas,是python的一个数据分析包,Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表,单元格可以存放数值、字符串等。
pd.DataFrame(data,index,columns):其中第一个参数是存放在DataFrame里的数据,第二个参数index是行名(行索引),第三个参数columns是列名(列索引);
value_counts():计算series里面相同数据出现的频率(次数);
iloc取数据:iloc[行位置,列位置],可以把冒号改成几列列名,只取满足条件的某几列数据。

  • Matplotlib中的scatter()函数
scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)

x,y:大小为(n,)的输入数据,即将绘制散点图的数组
s:标量或者是一个数组大小为(n,),可选的参数, 点数^ 2
c:颜色,可选。默认是蓝色’b’,表示的是标记的颜色,或者可以是一个表示颜色的字符,或者是一个长度为n的表示颜色的序列等
marker:标记的样式,默认的是’o’
cmap:colormap实体或者是一个colormap的名字,cmap仅仅当c是一个浮点数数组的时候才使用
norm:Normalize实体来将数据亮度转化到0-1之间,也是只有c是一个浮点数的数组的时候才使用vmin,vmax:实数,当norm存在的时候忽略。用来进行亮度数据的归一化
alpha:实数,0-1之间
linewidths:标记点的长度

#二分类 f(x) = sign(w*x + b)
import pandas as pd 
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
%matplotlib inline
#load data 
iris = load_iris()
df = pd.DataFrame(iris.data,columns=iris.feature_names)
df['label'] = iris.target

df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
df.label.value_counts()
#画两分类散点图
plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')
plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()

data = np.array(df.iloc[:100, [0, 1, -1]])
X, y = data[:,:-1], data[:,-1]
y = np.array([1 if i == 1 else -1 for i in y])

自己定义模型

#数据线性可分,二分类数据,此处为一元一次线性方程
class Model:
    def __init__(self):
        self.w = np.ones(len(data[0])-1,dtype=np.float32)
        self.b = 0
        self.l_rate = 0.1
        # self.data = data
        
    def sign(self,x,w,b):
        y = np.dot(x,w) + b
        return y
    
    #随机梯度下降法
    def fit(self,X_train,y_train):
        is_wrong = False
        while not is_wrong:
            wrong_count = 0
            for d in range(len(X_train)):
                X = X_train[d]
                y = y_train[d]
                if y * self.sign(X,self.w,self.b)<=0:
                    self.w = self.w + self.l_rate*np.dot(y,X)
                    self.b = self.b + self.l_rate*y
                    wrong_count += 1
                    
            if wrong_count == 0:
                    is_wrong = True
        return 'Perceptron Model!'
                
    def score(self):
        pass
perceptron = Model()
#使用训练数据进行训练
perceptron.fit(X, y)
x_points = np.linspace(4, 7,10)
y_ = -(perceptron.w[0]*x_points + perceptron.b)/perceptron.w[1]
plt.plot(x_points, y_)

plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')
plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()

scikit-learn Perceptron 定义一个感知器

from sklearn.linear_model import Perceptron
clf = Perceptron(fit_intercept=False,n_iter=1000, shuffle=False)
#使用训练数据进行训练
clf.fit(X, y)
#得到训练结果,权重矩阵
print(clf.coef_)
# 截距 
print(clf.intercept_)
x_ponits = np.arange(4, 8)
y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1]
plt.plot(x_ponits, y_)

plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')
plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在人工智能研究中,状态空间法是一种基于解空间的问题表示和求解方法。该方法通过在可能的解空间内寻找一个解来求解问题。状态空间法以状态和算符为基础来表示和求解问题。在传统人工智能问题中,复杂的求解技术都离不开表示与搜索这两个方面的内容,其中状态空间表示是其中的一个重要概念。状态空间法采用试探搜索方法,在某个可能的解空间内寻找一个解来求解问题。图解人工智能第二章学习笔记中可能会涉及到状态空间法的概念和问题状态描述。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [人工智能及其应用——第二章学习笔记(上)](https://blog.csdn.net/JallinRicher/article/details/122752897)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [《人工智能及其应用》课程笔记(二)第2章 知识表示方法](https://blog.csdn.net/qq_46485137/article/details/122101559)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值