记录学习 python-机器学习 02

K-means聚类算法

K-means算法以k为参数,把n个对象分成k个簇,使得簇内具有较高的相似度,而簇间的相似度较低。 1.随机选择k个点作为初始的聚类中心。2.对于剩下的点,根据其与聚类中心的距离,将其归入最近的簇 3.对每个簇,计算所有点的均值作为新的聚类中心 4.重复前面的步骤,直到聚类中心不再发生改变

应用:

数据集:1999年全国31个省份城镇居民家庭平均每人全年消费性支出的八个主要变量数据,这八个变量分别是:食品,衣着,家庭设备用品及服务,医疗保健,交通和通讯,娱乐教育文化服务,居住以及杂项商品和服务。利用已有数据对31个省份聚类。

import numpy as np
from sklearn.cluster import KMeans
#加载数据,创建K-means算法实例,并进行训练,获得标签
if__name__=='__main__':
    data,cityName =loadData('city.txt')
    km = KMeans(n_clusters=3)
    label=km.fit_predict(data)  
#label是聚类后各数据所属的标签 data是所要加载的数据 fit_predict()计算簇中心以及为簇分配序号
    expenses = np.sum(km.cluster_centers_,axis)
#print(expenses)
    CityCluster = [[],[],[]]   #将城市按label分成设定的簇
    for i in range(len(cityName)):
        CityCluster[label[i]].append(cityName[i]) #将城市按label分成设定的簇
    for i in range(len(CityCluster)):
        print("Expenses:%.2f" % expenses[i])   #将每个簇的平均花费输出
        print(CityCluster[i])
def loadDate(filePath):
    fr = open(filePath,'r+')   #r+ 是以读写的方式打开文件
    lines = fr.readines()   #一次性读取整个文件
    retData = []   #存储城市的各项消费信息
    retCityName = []   #存储城市名称
    for line in lines:
        items = line.strip().split(',')
        retCityName.append(items[0])
        retData.append([float(items[1]) for i in range(1,len(items))])
        return retData,retCityName
        

调用K-Means方法所需要参数:1.n_clusters:用于指定聚类中心的个数 2.init:初始聚类中心初始化方法 3.max_iter:最大迭代次数      一般调用时只用给出n_clusters即可,init默认是k-means++,max_iter默认是300

2.DBSCAN算法及应用

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

DBSCAN算法将数据点分为三类:

  1. 核心点:在半径Eps内含有超过MinPts数目的点
  2. 边界点:在半径Eps内点的数量xiaoyuMINPts,但是落在核心点的邻域内
  3. 噪音点:既不是核心点也不是边界点

DBSCAN算法流程:

  1. 将所有点标记为核心点、边界点或噪音点
  2. 删除噪声点
  3. 为距离在Eps之内的所有核心点之间赋予一条边
  4. 每组连通的核心点形成一个簇
  5. 将每个边界点指派到一个与之相关联的核心点的簇中(哪一个核心点的半径范围内)
#实例  计算学生上网时间和上网
1.建立工程 导入sklearn相关包
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')
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(starttimes,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_
#调用DBSCAN方法进行训练,labels为每个数据的簇标签
print('Labels:')
print(labels)
raito = len(labels[labels[:] == -1])/len(labels)
print('Noise raito:',format(raito,'.2%'))
#打印数据被记上的标签,计算标签为-1,即噪声数据的比例
n_clusters_ = len(set(labels)) - (1 if -1 in label else 0)

print('Estimated number of clusters: %d' % n_clusters_)
print("Silhouette Coefficient: %0.3f" % metrics.sihouette_score(X,labels))
#计算簇的个数并打印,评价聚类效果
for i in range(n_clusters_):
    print('Cluster ',i,':')
    print(list(X[label == i].flatten()))
#打印标号以及各簇内数据

DBSCAN主要参数包括:1.eps:两个样本被看作邻居节点的最大距离 2.min_samples:簇的样本数 3.metric:距离计算方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值