无监督学习---K-means算法和DBSCAN算法

无监督学习:

只有特征值,没有目标值(聚类:划分类别)。对于一份没有标签的数据, 有监督算法就会无从下手, 聚类算法能够将数据进行大致的划分, 最终让每一个数据点都有一个固定的类别。

算法分类:聚类k-means,降维算法;异常检测、可视化。

K-means算法:

未对数据集进行标记。就可以对数据集进行有效的聚类分类。

K-means算法原理:

第①步: 拿到数据集后, 可能不知道每个数据样本都属于什么类别, 此时需要指定一个K值, 明确想要将数据划分成k堆。 
第②步: 既然想划分成k堆, 需要找k个能够代表每个堆的中心的点(也称质心, 就是数据各个维度的均值坐标点) , 但是划分前并不知道每个堆的中心点在哪个位置, 所以需要随机初始化k个坐标点。
第③步: 选择k个中心点后, 就要在所有数据样本中进行遍历, 看看每个数据样本应当属于哪个
堆。 对每个数据点分别计算其到k个中心点之间的距离, 离哪个中心点近, 它就属于哪一堆。 距离值可以自己定义, 一般情况下使用欧氏距离。

第④步: 第②步找的中心点是随机选择的, 经过第③步, 每一个数据都有各自的归属, 由于中心点。
是每个堆的代表, 所以此时需要更新k个堆各自的中心点。 做法很简单, 分别对不同归属的样本数据计算其中心位置, 计算结果变成新的中心点。

第⑤步: 数据点究竟属于哪一堆? 其衡量标准是看这些数据点离哪个中心点更近, 第④步已经更新了中心点的位置, 每个数据的所属也会发生变化, 此时需要重新计算各个数据点的归属, 计算距离方式相同。
第⑥步: 至此, 样本点归属再次发生变化, 所以需要重新计算中心点, 总之, 只要数据所属发生变化, 每一堆的中心点也会发生改变。
第⑦步: 接下来就是重复性工作, 反复进行迭代, 不断求新的中心点位置, 然后更新每一个数据点所属, 最终, 当中心点位置不变, 也就是数据点所属类别固定下来时, 就完成了K-means算法, 也就得到每一个样本点的最终所属类别。

K-means涉及的参数:

  1. K值的确定。 K值决定了待分析的数据会被划分成几个簇。
  2. 质心的选择。
  3. 距离的度量。
  4. 评估方法。

K-means算法的优缺点:

优点:简单、快速、可解释性强。

缺点:K值是难以估计的,初始质心点选择需要改进。

#手写数字识别数据集:
import warnings
warnings.filterwarnings("ignore")
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.cluster import KMeans,DBSCAN #聚类

X,y=load_digits(return_X_y=True)
# print(X)
# print(y)
x_train,x_test,y_train,y_test=train_test_split(X,y)

log_reg=LogisticRegression()

log_reg.fit(x_train,y_train)
res1=log_reg.score(x_test,y_test)

print("使用逻辑回归:",res1)

"""使用预处理的方式
"""
from sklearn.pipeline import Pipeline

#使用预处理的方式:
pipline=Pipeline([
    ("kmeans",KMeans(n_clusters=55)), #先使用k_means进行聚类
    ("log_reg",LogisticRegression()),
])

pipline.fit(x_train,y_train)
res2=pipline.score(x_test,y_test)
print("使用聚类预处理的方式:",res2)


"""
使用网格搜索进行寻找k的最优值:
"""
from sklearn.model_selection import GridSearchCV

#设置参数k的范围:
param_grid=dict(kmeans__n_clusters=range(2,100))

grid_clf=GridSearchCV(pipline,param_grid,cv=3,verbose=2) #verbose是完成度;
grid_clf.fit(x_train,y_train)

#最好的参数:
print(grid_clf.best_params_)
# print(grid_clf.best_score_)
# print(grid_clf.best_estimator_)
#进行模型评分:
res3=grid_clf.score(x_test,y_test)
print("进行网格搜索的结果:",res3)
使用逻辑回归: 0.9711111111111111
使用聚类预处理的方式: 0.9688888888888889
{'kmeans__n_clusters': 97}
进行网格搜索的结果: 0.9688888888888889

DBSCAN算法:

DBSCAN(Density-Based Spatial Clustering of Applications with Noise) 算法常用于异常检测, 它的注意力放在离群点上。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值