其他分享
首页 > 其他分享> > 《机器学习》周志华note3

《机器学习》周志华note3

作者:互联网

聚类

聚类的概述

相似性计算

连续型属性的相似性计算方法

在这里插入图片描述

jc1-2=4/5=0.8

在这里插入图片描述

距离 0.4 0 0 0 0 1 1 1 0 1
为0的不用考虑
d1-2 = (4.4)/(6)=0.7333

kmeans原理

划分方法

import numpy as np

a = np.array([[3,4],[3,6],[7,3],[4,7],[3,8],[8,5],[4,5],[4,1],[7,4],[5,5]])

lines = ""
for i in a:
    for j in a:
        distance = np.sqrt(np.sum((i-j)**2))
        # lines += str(distance)+","
        lines += "%.2f"%distance+","
    lines += "\n"
file = open("result.csv",mode="w",encoding="utf-8")
file.write(lines)
file.close()

在这里插入图片描述
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
#获取数据集
def loadDataSet(filename):
    return np.loadtxt(filename,delimiter=',')

#取出k个中心点
def initCenters(dataset,k):
    """
    返回k个中心点
    :param dataset: 数据集
    :param k:中心点的个数
    :return:
    """
    centerIndex =  np.random.choice(len(dataset),k,replace=False)
    # print(chenterIndex)
    return dataset[centerIndex]

#计算距离公式
def distance(x,y):
    return np.sqrt(sum((x-y)**2))

#kmeans核心算法
def kmeans(dataset,k):
    """
    返回k个簇
    :param dataset:
    :param k:
    :return:
    """
    #初始化中心点
    centers = initCenters(dataset,k)  #随机的
    # centers = np.array([[4,5],[5,5]],dtype = np.float)  #指定
    n,m = dataset.shape
    #用于存储每个样本属于哪个簇
    clusters = np.full(n,np.nan)
    #迭代  flag->标志
    flag = True
    while flag:
        flag = False
        #计算所有点到簇中心点的距离
        for i in range(n):   #n是样本个数
            minDist,clustersIndex = 99999999,0
            for j in range(len(centers)):  #中心点的个数
                dist = distance(dataset[i],centers[j])   #某一点至中心点的距离
                if dist < minDist:
                    #为样本分簇
                    minDist = dist
                    clustersIndex = j
            if clusters[i] != clustersIndex:
                clusters[i] = clustersIndex  # 为这个簇
                flag = True
        # print(centers)
        # print(clusters)
        #更新簇中心
        for i in range(k):
            subdataset = dataset[np.where(clusters==i)]
            centers[i] = np.mean(subdataset,axis = 0)
    return clusters,centers

def figureShow(dataset,k,clusters,centers):
    n,m = dataset.shape
    if m>2:
        print("维度大于2")
        return 1
    #markers
    #根据簇不同 marker不同
    markers = [".",",","o","v","^","<",">"]
    colors = ["g","r","y","b"]
    for i in range(n):
        clustersIndex = clusters[i].astype(np.int)
        plt.scatter(dataset[i][0],dataset[i][1],color = colors[clustersIndex],marker = "o")

    #绘制质心
    for j in range(k):
        plt.scatter(centers[j][0],centers[j][1],marker = "^")
    plt.show()

if __name__ == "__main__":
    dataset = loadDataSet("testSet.txt")
    # print(initCenters(dataset,2))
    # print(kmeans(dataset,2))
    clusters,centers = kmeans(dataset,3)
    figureShow(dataset,3,clusters,centers)

k-medoids算法

层次方法

DBSCAN算法

基于密度的聚类,他聚类方法大都是基于对象之间的距离进行聚类,聚类结果是球状的簇。
基于密度的聚类是寻找被低密度区域分离的高密度区域。

在这里插入图片描述
将点分为:核心点、边界点、噪声或背景点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
DBSCAN运行效果好时的效果:
在这里插入图片描述

# -*- coding: utf-8 -*-
# @Time    : 2020/12/29 20:25
# @Author  : LUYX
import numpy as np
import matplotlib.pyplot as plt
import math
import random
from sklearn import datasets

#定义一个类 用于记录样本的状态信息


#距离计算公式
def distance(x,y):
    return np.sqrt(np.sum((x-y)**2))

def dbscan(dataset,minPts,eps):
    """
    :param dataset: 数据集
    :param minPts: 最少点数
    :param eps: 半径
    :return: 返回的是样本的簇的集合
    """
    n,m = dataset.shape
    #定义一个容器 用于存储样本的分类
    clusters = np.full((n,1),-1)
    #簇的类别
    k = -1
    for i in range(n):
        if clusters[i] != -1:
            continue
        #取出样本点
        p = dataset[i]
        #获取领域内的所有样本点
        subdataset = [j for j in range(n) if distance(dataset[j],p)<=eps]
        if len(subdataset) <= minPts:
            continue
        #建立簇的标记
        k += 1
        clusters[i] = k
        for j in subdataset:
            clusters[j] = k
            if j > i:
                sub = [item for item in range(n) if distance(dataset[j],dataset[item])<=eps]
                if len(sub)>=minPts:
                    # subdataset.extend(sub)
                    # subdataset = list(set(subdataset))
                    for t in sub:
                        if t not in subdataset:
                            subdataset.append(t)
    # print(clusters)
    return clusters

X1, Y1 = datasets.make_circles(n_samples=2000,factor=0.6,noise=0.05,random_state=1)
X2, Y2 = datasets.make_blobs(n_samples=500,n_features=2,centers=[[1.5,1.5]],cluster_std=[[0.1]],random_state=5)

X = np.concatenate((X1,X2))

C1 = dbscan(X,10,0.1)
print(C1)
plt.scatter(X[:,0],X[:,1],c=C1,marker='.')
plt.show()

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from scipy.spatial.distance import pdist

data_path = '.csv'

# 读取文件
data_frame = pd.read_csv(data_path, encoding='gbk')

# dbscsn
def dbscsn_cluster(x_label, y_label):
    clu = DBSCAN(eps=0.05,min_samples=1)

    X_value = data_frame[[x_label, y_label]].values
    print(type(X_value))

    clu.fit(X_value)

    print('样本所属簇编号:', clu.labels_)

    # 可视化
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    # 以簇编号作为颜色区分依据
    plt.scatter(data_frame[x_label], data_frame[y_label], c=clu.labels_)

    plt.title('DBSCAN聚类结果')
    plt.xlabel(x_label)
    plt.ylabel(y_label)
    plt.show()

if __name__ == '__main__':
    dbscsn_cluster('', '')

标签:周志华,plt,机器,note3,样本,dataset,聚类,np,clusters
来源: https://blog.csdn.net/youyou1128/article/details/111396921