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正则。其他的区别都是损失函数不同的副产品。