IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 机器学习-SVM-SMO算法求解 -> 正文阅读

[数据结构与算法]机器学习-SVM-SMO算法求解

挖个坑先

参考书籍为机器学习实践,之后会做详细解释

?
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
import torch
import time
iris =datasets.load_iris()
def get_data():
    fig = plt.figure()
    x, y1 =datasets.make_circles(n_samples=100, factor=0.1, noise=0.1)
    plt.scatter(x[:, 0], x[:, 1], marker='o', c=y1)
    plt.pause(2)

    return x,y1


def process(_x):
    '''
    映射到高维核空间
    :param data_point:
    :param data_noise:
    :return:
    '''
    Z = np.zeros([100, 3])
    # 二项式映射
    # X[:,0] = _x[:,0]**2
    # X[:, 1] = math.sqrt(2)*_x[:,0]*_x[:,1]
    # X[:,2] = _x[:,1]**2

    # 高斯核映射
    Z[:, 0] = np.exp(-(_x[:, 0] ** 2)) * np.exp(-(_x[:, 1] ** 2))
    Z[:, 1] = 2 * _x[:, 0] * _x[:, 1] * np.exp(-(_x[:, 0] ** 2)) * np.exp(-(_x[:, 1] ** 2))
    Z[:, 2] = 2 * _x[:, 0] ** 2 * _x[:, 1] ** 2 * np.exp(-(_x[:, 0] ** 2)) * np.exp(-(_x[:, 1] ** 2))

    return Z




def selectJ(i,samples_num):
    j=i
    while j==i:
        j=int(np.random.uniform(0,samples_num))

    return  j

def clipAlpha(L,H,alpha):
    if alpha>H:
        alpha= H
    if alpha<L:
        alpha=L
    return  alpha

#C是软间隔的惩罚参数,越大对错误分类惩罚越大
def smo(dataIn,classLabel,C,toler,maxIter):
    dataMat = np.mat(dataIn)
    labelMat = np.mat(classLabel).T
    b = 0
    m, n = np.shape(dataMat)  # 样本数量为m
    alpha = np.mat(np.zeros((m, 1)))
    itera = 0
    while itera < maxIter:
        alphaPairChange = 0
        for i in range(m):
            if i == 1:
                time.sleep(0.01)
            gx_i = float(np.multiply(alpha, labelMat).T * (dataMat * dataMat[i, :].T)) + b
            Ei = gx_i - float(labelMat[i])
            if (labelMat[i] * Ei < -toler and alpha[i] < C) or (
                    labelMat[i] * Ei > toler and alpha[i] > 0):  # 和书上kkt不一样为什么?
                j = selectJ(i, m)
                gx_j = float(np.multiply(alpha, labelMat).T * (dataMat * dataMat[j, :].T)) + b
                Ej = gx_j - float(labelMat[j])
                alpha_i_old = alpha[i].copy()
                alpha_j_old = alpha[j].copy()
                print(i, itera, gx_i, gx_j,b,np.sum(alpha))
                time.sleep(0.01)
                if labelMat[i] != labelMat[j]:
                    L = max(0, alpha[j] - alpha[i])
                    H = min(C, C + alpha[j] - alpha[i])
                else:
                    L = max(0, alpha[j] + alpha[i] - C)
                    H = min(C, alpha[j] + alpha[i])
                if L==H:
                    print('L==H')
                    continue
                eta=2.0*dataMat[i,:]*dataMat[j,:].T-dataMat[i,:]*dataMat[i,:].T-dataMat[j,:]*dataMat[j,:].T#什么东西这是?epsilon
                print(eta)
                if eta>=0:
                    print('eta>=0')#why????????????
                    continue

                alpha[j] -= labelMat[j] * (Ei - Ej) / eta  # +or->>>>
                alpha[j] = clipAlpha(L, H, alpha[j])
                if abs(alpha[j] - alpha_j_old) < 0.00001:
                    print('j not moving enough')
                    continue
                alpha[i] += labelMat[j] * labelMat[i] * (alpha_j_old - alpha[j])
                b1 = b - Ei - labelMat[i] * (alpha[i] - alpha_i_old) * dataMat[i, :] * dataMat[i, :].T - labelMat[
                    j] * (alpha[j] - alpha_j_old) * dataMat[i, :] * dataMat[j, :].T
                b2 = b - Ej - labelMat[i] * (alpha[i] - alpha_i_old) * dataMat[i, :] * dataMat[j, :].T - labelMat[
                    j] * (alpha[j] - alpha_j_old) * dataMat[j, :] * dataMat[j, :].T
                if alpha[i] > 0 and alpha[i] < C:
                    b = b1
                elif alpha[j] > 0 and alpha[j] < C:
                    b=b2
                else:
                    b=(b1+b2)/2.0
                alphaPairChange+=1
                print(("iter{},i:{},pairchange{}".format(itera,i,alphaPairChange)))
        if (alphaPairChange==0):
            itera+=1
        else:
            itera=0
        print('iteration{},m{}'.format(itera,i))

    return b,alpha
#
# x0,y0=get_data()
# x=process(x0)
# print(x)
##线性可分

np.random.seed(0)
x=np.random.random((100,2))
x[:50,:]+=0.8
x[50:,:]-=0.8
print
y=np.array([0]*100)
y[:50]+=1
y[50:]-=1
print('y{}'.format(y))
plt.scatter(x[:50,0],x[:50,1],c='r')
plt.scatter(x[50:,0],x[50:,1],c='g')
# plt.pause(3)
b,alpha=smo(dataIn=x,classLabel=y,C=0.6,toler=0.001,maxIter=40)
print(b,alpha)
# w=alpha*y*x.T
#画出分割面
for i in range(100):
    if alpha[i]>0.0:
        print(x[i],y[i])
        plt.scatter(x[i,0], x[i, 1], c='y')

plt.pause(10)






























?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 19:01:27  更:2022-04-22 19:06:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:39:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码