慕课Python机器学习应用-代码实现(详细注释+数据集)

课程链接:Python机器学习应用_北京理工大学_中国大学MOOC(慕课)

学习和实现的算法有KmeansDBSCAN,数据集是自己在网上搜集的,在我的资源区提供免费下载。

Kmeans算法:

1、数据介绍(city.txt,资源区提供免费下载):
现有1999年全国31个省份城镇居民家庭平均每人全年消费性支出的八个主要变量数据,这八个变量分别是:
食品、衣着、家庭设备用品及服务、医疗保健、交通和通讯、娱乐教育文化服务、居住以及杂项商品和服务。
利用已有数据,对31个省份进行聚类。

2、实验目的:
通过聚类(技术路线:sklearn.cluster.Kmeans),了解1999年各个省份的消费水平在国内的情况


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

其他:
因初始的k个点是随机选择的,所以每次的运行结果不一定相同
可以修改参数中的k值以及CityCluster中的列表数,本算法k=3

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

import numpy as np
from sklearn.cluster import KMeans

def loadData(filePath):
    # 打开文件流,如果没有第二个参数,会报编码错误
    fr = open(filePath, 'r+', encoding='utf_8')
    # 按行读取整个文件,返回的是列表
    lines = fr.readlines()
    # 将读入的数据进行拆分,分为数据和城市名
    retData = []
    retCityName = []
    # 遍历列表
    for line in lines:
        # 去除字符串首尾的空格或者回车,并使用“,”进行分割
        items = line.strip().split(",")
        # 每行的开头是城市名称
        retCityName.append(items[0])
        # 将数据组合成一个列表,并且强制转换类型为float浮点型
        retData.append([float(items[i]) for i in range(1, len(items))])
        # 返回城市数据(二维列表)和城市名(一维列表)
    return retData, retCityName


# 加载数据,创建K-means算法实例,并进行训练,获得标签
if __name__ == '__main__':
    # 调用加载数据的方法,获取城市数据以及城市名称
    data, cityName = loadData('city.txt')
    # 创建指定簇数量的KMeans对象实例
    km = KMeans(n_clusters=3)
    # 加载数据,进行训练,获得标签,总共是3个簇,就是3个标签,将给31个数据,每个数据都打上0-2的标签
    label = km.fit_predict(data)
    # print(label)
    # 计算出每一个簇形成的所有的行内的数据,计算出该簇内的数据的和
    # axis为1是压缩成列,即将每一行的元素相加,将矩阵压缩为一列
    # cluster_centers_:求每簇的质心坐标,即每个簇中求各列的平均值
    expenses = np.sum(km.cluster_centers_, axis=1)
    # print(km.cluster_centers_)
    # print(expenses)
    # 总共是3个标签,3个集合,按照打上的标签将城市名进行分类
    CityCluster = [[], [], []]
    # 遍历所有的标签,并将对应的城市根据标签加上对应的簇中
    for i in range(len(cityName)):
        CityCluster[label[i]].append(cityName[i])
        # 遍历所有的簇中心的数量,总共就只有3个,进行打印输出
    for i in range(len(CityCluster)):
        print("Expenses:%.2f" % expenses[i])
        print(CityCluster[i])

DBSCA算法:(后续会有详细注释)

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)
plt.show()

你可能感兴趣的:(笔记,python,机器学习,学习)