机器学习基础知识点①:Kmeans、LR、SVM、朴素贝叶斯

1、Kmeans

  • 1、定义距离,定义初始质心
  • 2、循环计算每个点到每个质心的距离,然后确定每个点属于的类别(距离最小的),并记录该点到该点质心的距离
  • 3、确认每类下的点,然后计算这一类点的平均值,并把这个值确立为该类的新质心
  • 4、如果所有数据都确定了属于某一类(不再更新),则分类完成
import numpy as np
# 选取k个质心
def make_cent(data, k):
    L = data.shape[0]
    zhixin = []
    for i in range(k):
        r = np.random.randint(0, L)
        zhixin.append(data[r])
    return zhixin


# 欧式距离
def distance(x, y):
    return np.sqrt(np.sum(np.power(x-y, 2)))


def clustering(data, k):
    # data: N * m的矩阵,代表N个样本点,每个点的维度为m
    N = data.shape[0]  # 样本点N
    data_cluster = np.zeros((N, 2))  # [类别,距离]
    zhixin = make_cent(data, k)  # 质心
    flag = True  # flag标志控制,所有簇中心点都不变时停止循环

    while flag:
        flag = False
        for i in range(N):
            min_index = -1
            min_dist = float('inf')
            # 计算其与S中各个质心的距离,判断将样本点分配质心所属的类
            for j in range(k):
                cur_dist = distance(zhixin[j], data[i])
                if cur_dist < min_dist:
                    min_dist = cur_dist
                    min_index = j

            # 终止条件:flag标志控制,所有簇中心点都不变时停止循环
            if data_cluster[i, 0] != min_index:
                flag = True
            data_cluster[i] = min_index, min_dist  # [类别,距离]

        # 寻找第cent号质心
        for cent in range(k):
            cluster_list = []  # 存放当前类
            for idx, p in enumerate(data_cluster[:, 0]):
                if p == cent:
                    cluster_list.append((data[idx]).tolist())
            # 更新对应类的簇中心,将质心设置为该类所有样本点的均值
            zhixin[cent] = (np.mean(cluster_list, axis=0)).tolist()

    return data_cluster[:, 0]  # 一个 N * 1 的一维向量,代表进行聚类之后各个点所属的类id

生成数据

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs
#聚类生成器

X, y = make_blobs(n_samples=200,#是待生成的样本的总数
                  n_features=2,#是每个样本的特征数
                  centers=4,#表示类别数
                  cluster_std=1,#表示每个类别的方差
                  center_box=(-10.0, 10.0),#边界框
                  shuffle=True,#默认就是true,可以不写
                  random_state=1);#随机数种子

print(X[0])
print(X.shape)
print(y[0])

plt.figure(figsize=(6,4),dpi=144)
plt.xticks(())
plt.yticks(())
plt.scatter(X[:, 0], X[:, 1], c=y, marker='o');
data_cluster = clustering(X, 4)
print(data_cluster.shape)
print(data_cluster)

 

1、样本不平衡的解决方法?

1)上采样和子采样;2)修改权重(修改损失函数);3)集成方法:bagging,类似随机森林、自助采样;4)多任务联合学习;

2、交叉熵函数系列问题?与最大似然函数的关系和区别?

1)交叉熵损失函数的物理意义:用于描述模型预测值与真实值的差距大小;

2)最小化交叉熵的本质就是对数似然函数的最大化

3)对数似然函数的本质就是衡量在某个参数下,整体的估计和真实情况一样的概率,越大代表越相近;而损失函数的本质就是衡量预测值和真实值之间的差距,越大代表越不相近。

3、逻辑回归与线性回归是什么关系?

逻辑回归(Logistic Regression)与线性回归(Linear Regression)都是一种广义线性模型(generalized linear model)。逻辑回归假设因变量 y 服从伯努利分布,而线性回归假设因变量 y 服从高斯分布。 因此与线性回归有很多相同之处,去除Sigmoid映射函数的话,逻辑回归算法就是一个线性回归。可以说,逻辑回归是以线性回归为理论支持的,但是逻辑回归通过Sigmoid函数引入了非线性因素,因此可以轻松处理0/1分类问题。

4、SVM和LR的区别与联系?

  • 对非线性表达上,逻辑回归只能通过人工的特征组合来实现,而SVM可以很容易引入非线性核函数来实现非线性表达,淡然也可以通过特征组合。
  • 逻辑回归产出的是概率值,而SVM只能产出是正类还是负类,不能产出概率。
  • 逻辑回归的损失函数是log loss,而SVM使用的是hinge loss
  • SVM主要关注的是“支持向量”,也就是和分类最相关的少数点,即关注局部关键信息;而逻辑回归是在全局进行优化的。这导致SVM天然比逻辑回归有更好的泛化能力,防止过拟合。
    损失函数的优化方法不同,逻辑回归是使用梯度下降来求解对数似然函数的最优解;SVM使用SMO方法,来求解条件约束损失函数的对偶形式。
  • 处理的数据规模不同。LR一般用来处理大规模的学习问题。如十亿级别的样本,亿级别的特征。(SVM是二次规划问题,需要计算m阶矩阵)
  • svm 更多的属于非参数模型,而logistic regression 是参数模型,本质不同。其区别就可以参考参数模型和非参模型的区别。

它们的目标都是减少“错误率”。SVM通过寻找最佳划分超平面来减少错误率,相应的损失函数是hinge函数;对数几率回归通过最大化样本输出到正确分类的概率来减少错误率,相应的损失函数是负对数似然。它们的正则化项都是L2正则。其他的区别都是损失函数不同的副产品。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值