无监督学习之K-means聚类、DBSCAN算法实验

一、实验报告
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二、代码如下
(1)K-Means算法:

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import time
from pylab import *
t1_X = time.time();
#创建5个随机的数据集
x_1=append(randn(500,1)+3.6,randn(500,1)+2.5,axis=1)
x_2=append(randn(500,1)+2,randn(500,1)-3.6,axis=1)
x_3=append(randn(500,1)-0.9,randn(500,1)+3.6,axis=1)
x_4=append(randn(500,1)-5,randn(500,1)-5,axis=1)
x_5=append(randn(500,1),randn(500,1),axis=1)
# 把5个数据集合并成 (2500,2)大小的数组data
data=append(x_1,x_2,axis=0)
data=append(data,x_3,axis=0)
data=append(data,x_4,axis=0)
data=append(data,x_5,axis=0)
plot(x_1[:,0],x_1[:,1],'oc',markersize=0.8)
plot(x_2[:,0],x_2[:,1],'og',markersize=0.8)
plot(x_3[:,0],x_3[:,1],'ob',markersize=0.8)
plot(x_4[:,0],x_4[:,1],'om',markersize=0.8)
plot(x_5[:,0],x_5[:,1],'oy',markersize=0.8)
kmeans_X=KMeans(n_clusters=5,random_state=0)
t0_X = time.time();
k=kmeans_X.fit(data)
X_time = time.time() - t0_X;
print(" time is %.2f ms"%(X_time))
t=k.cluster_centers_ # 获取数据中心点
plot(t[:,0],t[:,1],'r*',markersize=16) # 显示这5个中心点,五角星标记
ans_1 = ans_2 = ans_3 = ans_4 = ans_5 = 0
label_pred=kmeans_X.labels_
for i in [1,2,3,4,5]:
    ans1 = ans2 = ans3 = ans4 = ans5 = 0
    if i == 1:
        x = x_1
    if i == 2:
        x = x_2
    if i == 3:
        x = x_3
    if i == 4:
        x = x_4
    if i == 5:
        x = x_5
    for e in x:
        if(e in data[label_pred == 0]):
            ans1 = ans1 + 1
        if(e in data[label_pred == 1]):
            ans2 = ans2 + 1
        if(e in data[label_pred == 2]):
            ans3 = ans3 + 1
        if(e in data[label_pred == 3]):
            ans4 = ans4 + 1
        if(e in data[label_pred == 4]):
            ans5 = ans5 + 1
    ans = ans1
    if ans < ans2:
        ans = ans2
    if ans < ans3:
        ans = ans3
    if ans < ans4:
        ans = ans4
    if ans < ans5:
        ans = ans5
    if i == 1:
        ans_1 = ans
    if i == 2:
        ans_2 = ans
    if i == 3:
        ans_3 = ans
    if i == 4:
        ans_4 = ans
    if i == 5:
        ans_5 = ans
print((ans_1+ans_2+ans_3+ans_4+ans_5)/2500)
plt.show()
X_time = time.time() - t1_X;
print(X_time)

(2)DBSCAN算法:

import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from sklearn import datasets
from sklearn.cluster import DBSCAN

iris = datasets.load_iris()
X = iris.data[:, :4]

print(X.shape)
# 绘制数据分布图

dbscan = DBSCAN(eps=0.4, min_samples=4)
dbscan.fit_predict(X)
label_pred = dbscan.labels_

color = ["red", "blue", "green", "gray", "black"]
marker = ['o', '*', '+', ]
for i in range(max(label_pred)):
    x = X[label_pred == i]
    print(len(x))
    plt.scatter(x[:, 2], x[:, 3], c=color[i % 5], marker=marker[i % 3], label='class' + str(i + 1) + '-' + str(len(x)))

x1 = X[label_pred == 3]
print(len(x1))
plt.scatter(x1[:, 2], x1[:, 3], c=color[-1], marker=marker[-1])
x = X[label_pred == -1]
print(len(x))
plt.scatter(x[:, 2], x[:, 3], c=color[-1], marker=marker[-1], label='noise' + '-' + str(len(x) + len(x1)))


plt.legend(loc=2)
plt.show()


  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: k-meansdbscan都是常用的聚类算法k-means算法是一种基于距离的聚类算法,它将数据集划分为k个簇,每个簇的中心点是该簇中所有点的平均值。该算法的优点是简单易懂,计算速度快,但需要预先指定簇的数量k,且对初始中心点的选择敏感。 dbscan算法是一种基于密度的聚类算法,它将数据集中的点分为核心点、边界点和噪声点三类。核心点是指在半径为ε内至少有MinPts个点的点,边界点是指在半径为ε内不足MinPts个点但与核心点相邻的点,噪声点是指既不是核心点也不是边界点的点。该算法的优点是不需要预先指定簇的数量,能够发现任意形状的簇,但对于不同密度的簇效果可能不同,且需要设置合适的参数ε和MinPts。 ### 回答2: K-meansDBSCAN都是常用的聚类算法K-means算法是一种基于中心点的聚类算法,其目标是将数据点划分到不同的簇中,使得同一簇内的数据点彼此相似度高,不同簇间的数据点相似度低。算法工作流程如下: 1. 随机选择K个初始中心点; 2. 将各个数据点分配给最近的中心点,形成K个簇; 3. 对于每个簇,计算其中所有数据点的平均值,将该平均值作为新的中心点; 4. 重复步骤2和步骤3,直到簇的中心点不再发生变化或达到预设迭代次数。 K-means算法的优点是简单易懂、计算时间短,对于大规模数据也有不错的效果。但是其缺点也比较明显,如需要指定簇的数量,且对于空间形状不规则的数据或噪声数据处理效果较差。 DBSCAN算法是一种基于密度的聚类算法,其核心思想是将密度相连的数据点划分为一个簇中,将稀疏区域中的数据点划分为噪声数据。算法工作流程如下: 1. 选择一个数据点,检查其邻域内是否有足够多的数据点,如果有足够多的数据点,则将该数据点作为核心点; 2. 核心点的邻域内所有的点组成一个簇,将所有邻域内密度不足的点视为噪声数据,未被分配簇的点到簇中; 3. 扫描所有未被访问的点,如果该点被一个簇访问,则将其加入该簇中。 DBSCAN算法的优点是可以发现任意形状的簇,不需要指定簇的数量,而且可以有效处理噪声数据。但是其缺点也比较明显,如容易受到密度相差悬殊的数据分布影响,计算时间随着数据规模的增大而呈指数增长。 综上,两种算法各有优缺点,需要根据应用场景选择合适的算法。 ### 回答3: K-meansDBSCAN是常用的聚类算法,它们可以用于将数据集中的数据对象分组成不同的簇。虽然K-meansDBSCAN都是聚类算法,但它们之间有很多的区别。 K-means是一种迭代算法,其原理是将所有数据对象划分为K个簇,在每次迭代中,计算每个簇的中心点,并将与中心点最近的数据对象划分到该簇中。然后重新计算每个簇的中心点,并再次将数据对象划分到最近的簇中,直到收敛为止。K-means算法简单且易于理解,但需要人工对簇的数量做出选择。 DBSCAN是一种基于密度的聚类算法,它的核心思想是,一个簇是由相互密集连接的数据对象组成的,而簇与簇之间的密度差别较大。DBSCAN算法的过程是首先选取一个未被访问的数据对象,然后找出该对象的密度可达的所有数据对象,将它们归为一个簇,并递归地找出这些簇的邻居,直到所有的数据对象都被归为一个簇或者标记为噪声点。DBSCAN算法不需要人工指定簇的数量,因此比K-means更加灵活和自适应。 总之,K-meansDBSCAN算法聚类过程中采用了不同的原理和策略,各有其适用的场景。K-means适用于数据分布比较规则和簇的数量明确的情况下,而DBSCAN适用于数据分布不规则、簇的数量不确定或者簇的密度变化不同的情况下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值