Python机器学习之聚类算法应用实例

本文为中国大学MOOC网礼欣、嵩天《Python机器学习应用》学习笔记

一、K-means算法分析31省市消费水平

在这里插入图片描述
在这里插入图片描述
代码:

import numpy as np
from sklearn.cluster import KMeans
 
def loadData(filePath):
    fr = open(filePath,'r+') # 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')  #利用loadData方法读取数据
    km = KMeans(n_clusters=4)  #创建实例
    label = km.fit_predict(data) #label为聚类后各数据所属的标签
    #调用Kmeans() fit_predict()方法进行计算簇中心以及为簇分配序号(0,1,2,3,)
    expenses = np.sum(km.cluster_centers_,axis=1) #axis表示按行求和,返回值为列表
    #横向计算每个城市的总开销,并把它归类到相应的簇里面。然后对每个簇进行求平均数。得到expense[i]i从03
    #print(expenses)
    CityCluster = [[],[],[],[]]     #将城市按label分成设定的簇
    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])   #输出每个簇的城市名

二、DBSCAN密度聚类分析大学生上网

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(DBSCAN密度聚类所依据为曼哈顿距离)

在这里插入图片描述
1.上网时间

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]   #读取每条数据中的mac地址,开始上网时间,上网时长,line.split(',')为第三个元素
    onlinetime=int(line.split(',')[6])  #读取的数据默认为字符串,上网时长 1558
    starttime=int(line.split(',')[4].split(' ')[1].split(':')[0])  #2014-07-20 22:44:18.540000000
    if mac not in mac2id:  #mac2id是一个字典,其key为mac地址,value为对应mac地址的上网时长和开始上网时间
        mac2id[mac]=len(onlinetimes)
        onlinetimes.append((starttime,onlinetime))  #将一个元组作为元素添加到列表中
    else:
        onlinetimes[mac2id[mac]]=[(starttime,onlinetime)]  #更新
real_X=np.array(onlinetimes).reshape((-1,2))  #np.array(onlinetimes)为一个矩阵  [    22   1558]
 
#调用DBSCAN算法进行训练,labels为每个数据的簇标签
X=real_X[:,0:1]  #[22]  取二维矩阵的第0(1-1)维
db=skc.DBSCAN(eps=0.01,min_samples=20).fit(X) 
labels = db.labels_
#打印数据被记上的标签,计算标签为-1(噪声数据)的比例
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)
plt.show()  #绘制直方图

2.上网时长

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]   #读取每条数据中的mac地址,开始上网时间,上网时长,line.split(',')为第三个元素
    onlinetime=int(line.split(',')[6])  #读取的数据默认为字符串,上网时长 1558
    starttime=int(line.split(',')[4].split(' ')[1].split(':')[0])  #2014-07-20 22:44:18.540000000
    if mac not in mac2id:  #mac2id是一个字典,其key为mac地址,value为对应mac地址的上网时长和开始上网时间
        mac2id[mac]=len(onlinetimes)
        onlinetimes.append((starttime,onlinetime))  #将一个元组作为元素添加到列表中
    else:
        onlinetimes[mac2id[mac]]=[(starttime,onlinetime)]  #更新
real_X=np.array(onlinetimes).reshape((-1,2))  #np.array(onlinetimes)为一个矩阵  [    22   1558]

#调用DBSCAN算法进行训练,labels为每个数据的簇标签
X=np.log(1+real_X[:,1:])  #[22]  取二维矩阵的第1,并对其进行取对数操作 [ 7.35179987]
db=skc.DBSCAN(eps=0.14,min_samples=10).fit(X) 
labels = db.labels_

#打印数据被记上的标签,计算标签为-1(噪声数据)的比例
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,':')
    count=len(X[labels==i])
    mean=np.mean(real_X[labels==i][:,1])
    std=np.std(real_X[labels==i][:,1])  #计算标准差
    print('\t number of sample:',count)
    print('\t mean of sample:',format(mean,'.1f')) #设置浮点数精度
    print('\t std of sample:',format(std,'.1f'))

     
plt.hist(X,24)
plt.show()  #绘制直方图

小技巧:
在这里插入图片描述
左边的数据不适应于聚类分析,对其进行对数变换后,或可使其变得适用于聚类分析。

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
层次聚类算法是一种无监督学习算法,用于将相似的数据点分组成不同的聚类。它的应用非常广泛,例如在图像分割、文本聚类、生物信息学等领域都有应用。 以下是一个层次聚类算法应用实例: 假设我们有一组图书的目录数据,我们想要将相的图书进行聚类。我们可以使用层次聚类算法来实现这个目。 首先,我们需要计算图书之间的相似度。可以使用一些相似度度量方法,例如余弦相似度或欧氏距离。 然后,我们可以使用层次聚类算法来将相似的图书进行聚类。层次聚类算法的主要思想是将每个数据点视为一个单独的聚类,然后逐步合并相似的聚类,直到达到预设的阈值。 具体的实现可以使用Java或Python等编程语言。在Java中,可以使用Weka等机器学习库来实现层次聚类算法。在Python中,可以使用scikit-learn等库来实现。 以下是一个使用Python实现层次聚类算法的示例代码: ```python from sklearn.cluster import AgglomerativeClustering import numpy as np # 假设我们有一组图书的特征向量数据 data = np.array([[1, 2], [2, 3], [3, 4], [8, 7], [9, 8], [10, 9]]) # 创建层次聚类模型 model = AgglomerativeClustering(n_clusters=2) # 进行聚类 clusters = model.fit_predict(data) # 输出每个数据点所属的聚类 print(clusters) ``` 这段代码将数据分为两个聚类,并输出每个数据点所属的聚类

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值