python_机器学习(2)聚类算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xumeng7231488/article/details/78304810


K-means聚类算法 k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。
其处理过程如下:
1.随机选择k个点作为初始的聚类中心;
2.对于剩下的点,根据其与聚类中心的距离,将其归入最近的簇
3.对每个簇,计算所有点的均值作为新的聚类中心

4.重复2、3直到聚类中心不再发生改变

K-means的应用

数据介绍:
现有1999年全国31个省份城镇居民家庭平均每人全年消费性支出的八个主要变量数据,这八个变量分别是:食品、衣着、家庭设备用品及服务、医疗
保健、交通和通讯、娱乐教育文化服务、居住以及杂项商品和服务。利用已有数据,对31个省份进行聚类。
实验目的:
通过聚类,了解1999年各个省份的消费水平在国内的情况。
技术路线:sklearn.cluster.Kmeans

K-means实验过程:

• 使用算法: K-means聚类算法
• 实现过程:
1. 建立工程,导入sklearn相关包
import numpy as np
from sklearn.cluster import KMeans
关于一些相关包的介绍:
 NumPy是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
 使用sklearn.cluster.KMeans可以调用K-means算法进行聚类

2. 加载数据,创建K-means算法实例,并进行训练,获得标签:

import numpy as np
from sklearn.cluster import KMeans
 
 
def loadData(filePath):
    fr = open(filePath,'r+')#读写方式开大
    lines = fr.readlines()#readlines
    retData = []#各项消费信息
    retCityName = []#城市名
    for line in lines:
        items = line.strip().split(",")
        retCityName.append(items[0])
        retData.append([float(items[i]) for i in range(1,len(items))])
    return retData,retCityName
 
     
if __name__ == '__main__':
    data,cityName = loadData('city.txt')#加载数据
    km = KMeans(n_clusters=4)#创建实例
    label = km.fit_predict(data)#训练获得标签
    expenses = np.sum(km.cluster_centers_,axis=1)
    #print(expenses)
    CityCluster = [[],[],[],[]]
    for i in range(len(cityName)):
        CityCluster[label[i]].append(cityName[i])
    for i in range(len(CityCluster)):
        print("Expenses:%.2f" % expenses[i])
        print(CityCluster[i])
调用KMeans方法所需参数:
• n_clusters:用于指定聚类中心的个数
• init:初始聚类中心的初始化方法
• max_iter:最大的迭代次数
• 一般调用时只用给出n_clusters即可,init默认是k-means++,max_iter默认是300

其它参数:
• data:加载的数据
• label:聚类后各数据所属的标签
• axis: 按行求和
• fit_predict():计算簇中心以及为簇分配序号

3. 输出标签,查看结果
 将城市按照消费水平n_clusters类,消费水平相近的城市聚集在一类中
 expense:聚类中心点的数值加和,也就是平均

DBSCAN密度聚类

DBSCAN算法是一种基于密度的聚类算法:
• 聚类的时候不需要预先指定簇的个数
• 最终的簇的个数不定

DBSCAN算法将数据点分为三类:
• 核心点:在半径Eps内含有超过MinPts数目的点
• 边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内
• 噪音点:既不是核心点也不是边界点的点

DBSCAN算法流程

1.将所有点标记为核心点、边界点或噪声点;
2.删除噪声点;
3.为距离在Eps之内的所有核心点之间赋予一条边;
4.每组连通的核心点形成一个簇;
5.将每个边界点指派到一个与之关联的核心点的簇中(哪一个核心点的半径范围之内)。

DBSCAN的应用实

数据介绍:
现有大学校园网的日志数据,290条大学生的校园网使用情况数据,数据包括用户ID,设备的MAC地址,IP地址,开始上网时间,停止上网时间,上网时长,校园网套餐等。利用已有数据,分析学生上网的模式。
实验目的:
通过DBSCAN聚类,分析学生上网时间和上网时长的模式。
import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as plt
 
 
mac2id=dict()
onlinetimes=[]
f=open('TestData.txt',encoding='utf-8')
for line in f:
    mac=line.split(',')[2]
    onlinetime=int(line.split(',')[6])
    starttime=int(line.split(',')[4].split(' ')[1].split(':')[0])
    if mac not in mac2id:
        mac2id[mac]=len(onlinetimes)
        onlinetimes.append((starttime,onlinetime))
    else:
        onlinetimes[mac2id[mac]]=[(starttime,onlinetime)]
real_X=np.array(onlinetimes).reshape((-1,2))
 
X=real_X[:,0:1]
 
db=skc.DBSCAN(eps=0.01,min_samples=20).fit(X)
labels = db.labels_
 
print('Labels:')
print(labels)
raito=len(labels[labels[:] == -1]) / len(labels)
print('Noise raito:',format(raito, '.2%'))
 
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
 
print('Estimated number of clusters: %d' % n_clusters_)
print("Silhouette Coefficient: %0.3f"% metrics.silhouette_score(X, labels))
 
for i in range(n_clusters_):
    print('Cluster ',i,':')
    print(list(X[labels == i].flatten()))
     
plt.hist(X,24)



猜你喜欢

转载自blog.csdn.net/xumeng7231488/article/details/78304810