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

第二章 感知机

二分类模型

源代码出处: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()

你可能感兴趣的:(机器学习)