统计学习方法

1.统计学习笔记

久闻李航老师的这本统计学习方法的大名,苦于数学基础停留在本科期末考试70分的水平,战战兢兢,最近种草人工智能,多方研究从这本书开始再好不过了,于是硬着头皮上了,发现概念并没有非常晦涩难懂,详细的笔记没有来得及记录,下面给出两个不错的笔记的链接。

有一定引申的笔记

比较遵循原著的笔记

2.算法Python实现

实现前只作简单介绍,理解不到位的地方,求大神指点,此外入门语言是JAVA,python只知道一些基础语法,写的比较丑陋,勿喷。

2.1感知机

感知机(二类分类)根据已有的输入和输出(输出只有1或-1),计算得到分离超平面S(wx+b),其中w是S的法向量,b是S的截距。然后通过S对位置的输入给出预测的输出分类结果。

2.1.1原始感知机算法

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D


def loadData():
    """
        加载数据
        eg:
        1   1   -1
        0   1   -1
        3   3   1
        4   3   1
        2   0.5 -1
        3   2   1
        4   4   1
        1   2   -1
        3   3   1
        3   4   1
        3   1   -1
        0.5 3   1
        2   2   -1
        3   1.8 -1
        1   3.5 1
        0.5 2.5 -1
    """
    data = np.loadtxt('testSet.txt')
    dataMat = data[:, 0:2]
    labelMat = data[:, 2]
    return dataMat, labelMat


def sign(val):
    if val >= 0:
        return 1
    else:
        return -1


def trainPerceptron(dataMat, labelMat, eta):
    """
        训练模型
        eta: learning rate(可选步)
    """
    m, n = dataMat.shape
    weight = np.zeros(n)
    bias = 0

    flag = True
    while flag:
        for i in range(m):
            if np.any(labelMat[i] * (np.dot(weight, dataMat[i]) + bias) <= 0):
                weight = weight + eta * labelMat[i] * dataMat[i].T
                bias = bias + eta * labelMat[i]
                print("weight, bias: ", end="")
                print(weight, end="  ")
                print(bias)
                flag = True
                break
            else:
                flag = False

    return weight, bias


# 可视化展示分类结果
def plotResult(dataMat, labelMat, weight, bias):
    fig = plt.figure()
    axes = fig.add_subplot(111)

    type1_x = []
    type1_y = []
    type2_x = []
    type2_y = []
    for i in range(len(labelMat)):
        if (labelMat[i] == -1):
            type1_x.append(dataMat[i][0])
            type1_y.append(dataMat[i][1])

        if (labelMat[i] == 1):
            type2_x.append(dataMat[i][0])
            type2_y.append(dataMat[i][1])

    type1 = axes.scatter(type1_x, type1_y, marker='x', s=20, c='red')
    type2 = axes.scatter(type2_x, type2_y, marker='o', s=20, c='blue')

    y = (0.1 * -weight[0] / weight[1] + -bias / weight[1], 4.0 * -weight[0] / weight[1] + -bias / weight[1])
    axes.add_line(Line2D((0.1, 4.0), y, linewidth=1, color='blue'))

    plt.xlabel('X')
    plt.ylabel('Y')

    plt.show()


def _init_():
    dataMat, labelMat = loadData()
    weight, bias = trainPerceptron(dataMat, labelMat, 1)
    plotResult(dataMat, labelMat, weight, bias)
    return weight, bias

2.1.2运行结果

结果图

2.2k近邻法

k近邻法(基本分类或回归法),根据训练数据输入的对应输出,将数据进行分类。输入新的向量X时,找出已有数据的k个最靠近X的点,判断这些点中最多的类型为T,则新输入预测的对应类型为T。求最近距离时一般会用到kd树,优化检索。kd树的创建和检索过程请查看相关资料。

2.2.1k邻近算法

由于导入训练数据和可视化代码类似这里省略

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

# 根据输入测试实例进行k-近邻分类
def classify(in_x, data_set, labels, k):
    data_set_size = data_set.shape[0]
    diff_mat = np.tile(in_x, (data_set_size, 1)) - data_set
    sq_diff_mat = diff_mat ** 2
    sq_distances = sq_diff_mat.sum(axis=1)
    distances = sq_distances ** 0.5
    sorted_dist_indicies = distances.argsort()
    class_count = {}
    for i in range(k):
        vote_ilabel = labels[sorted_dist_indicies[i]]
        class_count[vote_ilabel] = class_count.get(vote_ilabel, 0) + 1
    sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)
    return sorted_class_count[0][0]

def _init_(x, k):
    dataMat, labelMat = loadData('testSet.txt')
    in_x = x
    plotResult(dataMat, labelMat, in_x)
    result = int(classify(in_x, dataMat, labelMat, k))
    return result

2.2.2运行结果

类别1黑色,类别2绿色,类别3黄色,新数据是红色叉叉

结果图

简单的测试结果如下:

训练数据:[3,5] k值:1 结果:3

训练数据:[3,5] k值:5 结果:2

训练数据:[3,5] k值:15 结果:1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容