【机器学习实战】9、利用K-means算法对未标注数据分组

2023-10-27

这里写图片描述

簇识别:

簇识别给出了聚类结果的含义,假定有一些数据,簇识别会告诉我们这些簇到底都是些什么。

聚类与分类的区别:

分类的目标事先已知,但是聚类的类别没有事先定义,故聚类也称无监督分类。

10.1 K-均值聚类算法

这里写图片描述

K-均值是发现给定数据集的k个簇的算法,簇个数k是用户给定的,每一个簇通过其质心(centroid),即簇中所有点的中心来描述。

K-均值算法工作流程:

1)随机确定k个初始点作为质心
2)将数据集中的每个点分配到一个簇中,即为每个点找到距离其最近的质心,并将其分配给该质心所对应的簇,该步骤完成后,每个簇的质心更新为该簇所有点的平均值。

伪代码:

随机创建K个质心为起始点  
当任意一个点的簇分配结果发生变化时  
    对每一个数据点  
         对每个质心  
              计算数据点和之心之间的距离  
         将数据点分配到距离最近的簇中  
    对每个簇,计算所有点的均值更新质心

具体做法:

1、 随机选取k个聚类质心点(cluster centroids)为 μ 1 , μ 2 , . . . , μ k ∈ R n \mu_1,\mu_2,...,\mu_k\in R^n μ1,μ2,...,μkRn

2、 重复下面过程直到收敛
{
对于每一个样例i,计算其应该属于的类别 c ( i ) : = a r g m i n j ∣ ∣ x ( i ) − μ j ∣ ∣ 2 c^{(i)}:=arg min_j||x^{(i)}-\mu_{j}||^2 c(i):=argminj∣∣x(i)μj2
,对于每一个类 j,重新计算该类的质心
这里写图片描述
}

K 是我们事先给定的聚类数, c ( i ) c^{(i)} c(i) 代表样例i与k个类中距离最近的那个类, c ( i ) c^{(i)} c(i)的值是1到k中的一个。质心 μ j \mu_j μj 代表我们对属于同一个类的样本中心点的猜测,拿星团模型来解释就是要将所有的星星聚成k个星团,首先随机选取k个宇宙中的点(或者k个星星)作为k个星团的质心.

  • 第一步:对于每一个星星计算其到k个质心中每一个的距离,然后选取距离最近的那个星团作为 c ( i ) c^{(i)} c(i),这样经过第一步每一个星星都有了所属的星团;

  • 第二步:对于每一个星团,重新计算它的质心 μ j \mu_j μj(对里面所有的星星坐标求平均)。重复迭代第一步和第二步直到质心不变或者变化很小。

一般流程:

这里写图片描述

下图展示了对n个样本点进行K-means聚类的效果,这里k取2。

这里写图片描述

K-means面对的第一个问题是如何保证收敛,前面的算法中强调结束条件就是收敛,可以证明的是K-means完全可以保证收敛性。

收敛性:

首先定义畸变函数:

这里写图片描述

J 函数表示每个样本点到其质心的距离平方和。K-means是要将J调整到最小。假设当前J没有达到最小值,那么首先可以固定每个类的质心 μ j \mu_j μj,调整每个样例的所属的类别 c ( i ) c^{(i)} c(i)来让J函数减少,同样,固定 c ( i ) c^{(i)} c(i),调整每个类的质心 μ j \mu_j μj也可以使J减小。这两个过程就是内循环中使J单调递减的过程。当J递减到最小时, μ \mu μ c c c也同时收敛。(在理论上,可以有多组不同的clip_image018[7]和c值能够使得J取得最小值,但这种现象实际上很少见)。

由于畸变函数J是非凸函数,意味着我们不能保证取得的最小值是全局最小值,也就是说k-means对质心初始位置的选取比较敏感,但一般情况下k-means达到的局部最优已经满足需求。但如果你怕陷入局部最优,那么可以选取不同的初始值跑多遍k-means,然后取其中最小的J对应的 μ \mu μ c c c 输出。

K-均值聚类支持函数:

from numpy import *

def loadDataSet(fileName):
    """
    加载数据集
    :param fileName: 文件名称
    :return:
    """
    dataMat=[]
    fr=open(fileName)
    for line in fr.readlines():
        curLine=line.strip().split('\t')
        # map函数的主要功能是  
        # 对一个序列对象中的每一个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表  
        # 这里从文件中读取的信息是字符型,通过map函数将其强制转化为浮点型
        frtLine=map(float,curLine)
        dataMat.append(frtLine)
    return dataMat

def distEclud(vecA,vecB):
    """
    计算两个向量间的距离
    :param vecA:
    :param vecB:
    :return:
    """
    #np.power(x1, 2):数组x1的元素求2次方
    return sqrt(sum(power(vecA-vecB,2)))

def randCent(dataSet,k):
    """
    随机构建初始质心
    :param dataSet: 数据集
    :param k: k个随机质心
    :return:
    """
    #求列数
    n=shape(dataSet)[1]
    #初始化质心
    centroids=mat(zeros(k,n))
    for j in range(n):
        #求每一维数据的最大值和最小值,保证随机选取的质心在边界内
        minJ=min(dataSet[:,j])
        maxJ=max(dataSet[:,j])
        rangeJ=float(maxJ-minJ)
        centroids[:,j]=minJ+rangeJ*random.rand(k,1)
    return centroids

数据集:testSet.txt

#################################################
# kmeans: k-means cluster
# Author : zouxy
# Date   : 2013-12-25
# HomePage : http://blog.csdn.net/zouxy09
# Email  : zouxy09@qq.com
#################################################

from numpy import *
import time
import matplotlib.pyplot as plt


# calculate Euclidean distance
def euclDistance(vector1, vector2):
    return sqrt(sum(power(vector2 - vector1, 2)))


# init centroids with random samples
def initCentroids(dataSet, k):
    numSamples, dim = dataSet.shape
    centroids = zeros((k, dim))
    for i in range(k):
        index = int(random.uniform(0, numSamples))
        centroids[i, :] = dataSet[index, :]
    return centroids


# k-means cluster
def kmeans(dataSet, k):
    numSamples = dataSet.shape[0]
    # first column stores which cluster this sample belongs to,
    # second column stores the error between this sample and its centroid
    clusterAssment = mat(zeros((numSamples, 2)))
    clusterChanged = True

    ## step 1: init centroids
    centroids = initCentroids(dataSet, k)

    while clusterChanged:
        clusterChanged = False
        ## for each sample
        for i in range(numSamples):
            minDist = 100000.0
            minIndex = 0
            ## for each centroid
            ## step 2: find the centroid who is closest
            for j in range(k):
                distance = euclDistance(centroids[j, :], dataSet[i, :])
                if distance < minDist:
                    minDist = distance
                    minIndex = j

            ## step 3: update its cluster
            if clusterAssment[i, 0] != minIndex:
                clusterChanged = True
                clusterAssment[i, :] = minIndex, minDist ** 2

        ## step 4: update centroids
        for j in range(k):
            pointsInCluster = dataSet[nonzero(clusterAssment[:, 0].A == j)[0]]
            centroids[j, :] = mean(pointsInCluster, axis=0)

    print('Congratulations, cluster complete!')
    return centroids, clusterAssment


# show your cluster only available with 2-D data
def showCluster(dataSet, k, centroids, clusterAssment):
    numSamples, dim = dataSet.shape
    if dim != 2:
        print("Sorry! I can not draw because the dimension of your data is not 2!")
        return 1

    mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']
    if k > len(mark):
        print("Sorry! Your k is too large! please contact Zouxy")
        return 1

    # draw all samples
    for i in range(numSamples):
        markIndex = int(clusterAssment[i, 0])
        plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])

    mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']
    # draw the centroids
    for i in range(k):
        plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize=12)

    plt.show()

if __name__=='__main__':
    ## step 1: load data
    print("step 1: load data...")
    dataSet = []
    fileIn = open('testSet.txt')
    for line in fileIn.readlines():
        lineArr = line.strip().split('\t')
        dataSet.append([float(lineArr[0]), float(lineArr[1])])

    ## step 2: clustering...
    print( "step 2: clustering...")
    dataSet = mat(dataSet)
    k = 4
    centroids, clusterAssment = kmeans(dataSet, k)

    ## step 3: show the result
    print("step 3: show the result...")
    showCluster(dataSet, k, centroids, clusterAssment)

结果:

这里写图片描述

不同的类型用不同的颜色来表示,大菱形是对应类的均值质心点。

由于基本K均值聚类算法质心选择的随机性,其聚类的结果一般比较随机,一般不会很理想,最终结果往往出现自然簇无法区分的情况,为避免此问题,下面介绍二分K均值聚类算法。

质心:

centroids, clusterAssment
[[-3.53973889 -2.89384326]
 [ 3.54988221 -2.50520707]
 [ 1.27051487 -2.7993025 ]
 [-0.02298687  2.99472915]] 

10.2 使用后处理来提高聚类性能

k是用户自定义的参数,但是无法确定k的选取是否正确,如何才能判断生成的簇效果是否好呢,每个点的误差是点到簇质心的距离平方值。

这里写图片描述

上图中簇的分配结果值没有那么准确,k-均值算法收敛但是聚类效果差的原因是,k-均值算法收敛到了局部最小值,而非全局最小值。

一种用于度量聚类效果的指标是SSE(Sum of Squared Error,误差平方和),对应clusterAssment矩阵的第一列之和,SSE值越小表示数据点越接近于其质心,聚类效果越好。因为对误差取了平方,因此更加重视那些远离中心的点,一种肯定可以降低SSE值的方法是增加簇的个数,但是这违背了聚类的目标,聚类的目标是在不增加簇的情况下,提高簇的质量。

如何对图10-2的结果进行改进,可以对生成的簇进行后处理,一种方法是将具有最大SSE值的簇划分为两个簇。

为了保持簇的总数不变,可以将某两个簇进行合并。

如何合并:

1)合并最近的质心

通过计算所有质心之间的距离,合并两个距离最近的点。

2)合并两个使得SSE增幅最小的质心

10.3 二分K-均值算法

该算法首先将所有的点当成一个簇,然后将该簇一分为二。之后选择其中一个簇进行划分,选择哪一个簇进行划分取决于对其划分是否可以最大程度降低SSE的值。不断重复该过程,直到达到用户所需要的簇个数为止。

伪代码:

将所有的点看成一个簇
当簇数目小于k时
   对每一个簇
        计算总误差
        在给定的簇上面进行二分k-均值聚类
        计算一分为二之后的总误差
    选择使得误差最小的那个簇进行划分

代码:

#################################################
# kmeans: k-means cluster
# Author : zouxy
# Date   : 2013-12-25
# HomePage : http://blog.csdn.net/zouxy09
# Email  : zouxy09@qq.com
#################################################

from numpy import *
import time
import matplotlib.pyplot as plt


# calculate Euclidean distance
def euclDistance(vector1, vector2):
    return sqrt(sum(power(vector2 - vector1, 2)))


# init centroids with random samples
def initCentroids(dataSet, k):
    numSamples, dim = dataSet.shape
    centroids = zeros((k, dim))
    for i in range(k):
        index = int(random.uniform(0, numSamples))
        centroids[i, :] = dataSet[index, :]
    return centroids


# k-means cluster
def kmeans(dataSet, k):
    numSamples = dataSet.shape[0]
    # first column stores which cluster this sample belongs to,
    # second column stores the error between this sample and its centroid
    clusterAssment = mat(zeros((numSamples, 2)))
    clusterChanged = True

    ## step 1: init centroids
    centroids = initCentroids(dataSet, k)

    while clusterChanged:
        clusterChanged = False
        ## for each sample
        for i in range(numSamples):
            minDist = 100000.0
            minIndex = 0
            ## for each centroid
            ## step 2: find the centroid who is closest
            for j in range(k):
                distance = euclDistance(centroids[j, :], dataSet[i, :])
                if distance < minDist:
                    minDist = distance
                    minIndex = j

            ## step 3: update its cluster
            if clusterAssment[i, 0] != minIndex:
                clusterChanged = True
                clusterAssment[i, :] = minIndex, minDist ** 2

        ## step 4: update centroids
        for j in range(k):
            pointsInCluster = dataSet[nonzero(clusterAssment[:, 0].A == j)[0]]
            centroids[j, :] = mean(pointsInCluster, axis=0)


    return centroids, clusterAssment


# bisecting k-means cluster
def biKmeans(dataSet, k):
    numSamples = dataSet.shape[0]
    # first column stores which cluster this sample belongs to,
    # second column stores the error between this sample and its centroid
    clusterAssment = mat(zeros((numSamples, 2)))

    # step 1: the init cluster is the whole data set
    centroid = mean(dataSet, axis=0).tolist()[0]
    centList = [centroid]
    for i in range(numSamples):
        clusterAssment[i, 1] = euclDistance(mat(centroid), dataSet[i, :]) ** 2

    while len(centList) < k:
        # min sum of square error
        minSSE = 100000.0
        numCurrCluster = len(centList)
        # for each cluster
        for i in range(numCurrCluster):
            # step 2: get samples in cluster i
            pointsInCurrCluster = dataSet[nonzero(clusterAssment[:, 0].A == i)[0], :]

            # step 3: cluster it to 2 sub-clusters using k-means
            centroids, splitClusterAssment = kmeans(pointsInCurrCluster, 2)

            # step 4: calculate the sum of square error after split this cluster
            splitSSE = sum(splitClusterAssment[:, 1])
            notSplitSSE = sum(clusterAssment[nonzero(clusterAssment[:, 0].A != i)[0], 1])
            currSplitSSE = splitSSE + notSplitSSE

            # step 5: find the best split cluster which has the min sum of square error
            if currSplitSSE < minSSE:
                minSSE = currSplitSSE
                bestCentroidToSplit = i
                bestNewCentroids = centroids.copy()
                bestClusterAssment = splitClusterAssment.copy()

        # step 6: modify the cluster index for adding new cluster
        bestClusterAssment[nonzero(bestClusterAssment[:, 0].A == 1)[0], 0] = numCurrCluster
        bestClusterAssment[nonzero(bestClusterAssment[:, 0].A == 0)[0], 0] = bestCentroidToSplit

        # step 7: update and append the centroids of the new 2 sub-cluster
        centList[bestCentroidToSplit] = bestNewCentroids[0, :]
        centList.append(bestNewCentroids[1, :])

        # step 8: update the index and error of the samples whose cluster have been changed
        clusterAssment[nonzero(clusterAssment[:, 0].A == bestCentroidToSplit), :] = bestClusterAssment


    return mat(centList), clusterAssment


# show your cluster only available with 2-D data
def showCluster(dataSet, k, centroids, clusterAssment):
    numSamples, dim = dataSet.shape
    if dim != 2:
        print("Sorry! I can not draw because the dimension of your data is not 2!")
        return 1

    mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']
    if k > len(mark):
        print("Sorry! Your k is too large!")
        return 1

    # draw all samples
    for i in range(numSamples):
        markIndex = int(clusterAssment[i, 0])
        plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])

    mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']
    # draw the centroids
    for i in range(k):
        plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize=12)

    plt.show()

if __name__=='__main__':
    #################################################
    # kmeans: k-means cluster
    # Author : zouxy
    # Date   : 2013-12-25
    # HomePage : http://blog.csdn.net/zouxy09
    # Email  : zouxy09@qq.com
    #################################################

    from numpy import *
    import time
    import matplotlib.pyplot as plt

    ## step 1: load data
    print("step 1: load data...")
    dataSet = []
    fileIn = open('testSet2.txt')
    for line in fileIn.readlines():
        lineArr = line.strip().split('\t')
        dataSet.append([float(lineArr[0]), float(lineArr[1])])

    ## step 2: clustering...
    print( "step 2: clustering...")
    dataSet = mat(dataSet)
    k = 3
    centroids, clusterAssment = biKmeans(dataSet, k)

    ## step 3: show the result
    print("step 3: show the result...")
    showCluster(dataSet, k, centroids, clusterAssment)

结果:

这里写图片描述

10.4 总结

1)优点:

  • 计算时间段,速度快
  • 容易解释

2)缺点:

  • 1.收敛太慢
  • 2.算法复杂度高O(nkt)
  • 3.不能发现非凸形状的簇,或大小差别很大的簇
  • 4.需样本存在均值(限定数据种类)
  • 5.需先确定k的个数
  • 6.对噪声和离群点敏感
  • 7.最重要是结果不一定是全局最优,只能保证局部最优。

3)改进算法:

  • k-means++等
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【机器学习实战】9、利用K-means算法对未标注数据分组 的相关文章

  • 2024年华为OD机试真题-小明找位置-Java-OD统一考试(C卷)

    题目描述 小朋友出操 按学号从小到大排成一列 小明来迟了 请你给小明出个主意 让他尽快找到他应该排的位置 算法复杂度要求不高于nLog n 学号为整数类型 队列规模 lt 10000 输入描述 1 第一行 输入已排成队列的小朋友的学号 正整
  • 华为OD机试2024年最新题库(C++)

    我是一名软件开发培训机构老师 我的学生已经有上百人通过了华为OD机试 学生们每次考完试 会把题目拿出来一起交流分享 重要 2024年1月 5月 考的都是OD统一考试 C卷 题库已经整理好了 命中率95 以上 这个专栏使用 C 解法 问1 考
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 华为OD机试真题-分配土地-Python-OD统一考试(C卷)

    题目描述 从前有个村庄 村民们喜欢在各种田地上插上小旗子 旗子上标识了各种不同的数字 某天集体村民决定将覆盖相同数字的最小矩阵形的土地的分配给为村里做出巨大贡献的村民 请问 此次分配土地 做出贡献的村民中最大会分配多大面积 输入描述 第一行
  • 华为OD机试2024年最新题库(Python)

    我是一名软件开发培训机构老师 我的学生已经有上百人通过了华为OD机试 学生们每次考完试 会把题目拿出来一起交流分享 重要 2024年1月 5月 考的都是OD统一考试 C卷 题库已经整理好了 命中率95 以上 这个专栏使用 Python解法
  • 矩阵基本操作2

    题目描述 问题描述 将方阵 n 行n列 n lt 100 置成下三角矩阵 主对角线右上角数字全部清零 输入格式 第一行输入n 接下来的n行每行n列 表示矩阵的数值 用空格隔开 输出格式 n行n列下三角矩阵 每个数字3个占位符 左对齐 输入样
  • 【牛客周赛Round 27】题目讲解

    题目一 小红的二进制删数字 小红拿到了一个二进制字符串 s 她可以删掉其中的一些字符 使得最终该字符串为一个2的幂 即可以表示为 2 k 形式的数 小红想知道 自己最少删几个字符可以达成 请你编写一个函数返回这个答案 具体思路 看到这道题目
  • AI在广告中的应用——预测性定位和调整

    营销人员的工作就是在恰当的时间将适合的产品呈现在消费者面前 从而增加他们购买的可能性 随着时间的推移 营销人员能够深入挖掘越来越精准的客户细分市场 他们不仅具备了实现上述目标的能力 而且这种能力还在呈指数级提升 在AI技术帮助下 现在的营销
  • 【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 有 无策略奖励 2 2 训练结果1
  • 『力扣刷题本』:逆波兰表达式求值

    大家好久不昂 最近 1 个多月罗根一直在备考期末 文章发的很少 现在已经放寒假啦 学习自然也不能拉下 毕竟 4 月份就要去参加蓝桥杯了 先给自己定个小目标 日更 2 篇 咳咳 下面马上开始讲题 一 题目 给你一个字符串数组 tokens 表
  • 2024年华为OD机试真题-虚拟游戏理财-Python-OD统一考试(C卷)

    题目描述 在一款虚拟游戏中生活 你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局 现有一家Bank 它提供有若干理财产品m 风险及投资回报不同 你有N 元 进行投资 能接受的总风险值为X 你要在可接受范围内选择最优的投资方式获得最大回报
  • 【一种新的Burton-Miller型奇异边界方法(BM-SBM)】用于声学设计灵敏度分析,2D和3D声学设计灵敏度分析的奇异边界方法研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 2D 2 2 3D
  • SOM(自组织映射)和 K 均值有什么区别?

    stackoverflow中只有一个与此相关的问题 更多的是关于哪个更好 我只是不太明白其中的区别 我的意思是它们都使用向量 这些向量被随机分配给集群 它们都使用不同集群的质心来确定获胜的输出节点 我的意思是 差异到底在哪里 在 K 均值中
  • 对一维数据进行最佳聚类? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有人有一篇论文解释如何CKmeans 1d dp http cran r project org
  • 如何使用 Python 查找我的数据属于哪个集群?

    我刚刚对我的数据运行了 PCA 然后运行了 K 均值聚类算法 运行算法后我得到了 3 个聚类 我试图找出我的输入属于哪些集群 以便收集有关输入的一些定性属性 我的输入是客户 ID 用于聚类的变量是某些产品的支出模式 下面是我为 K 均值运行
  • 使轮廓图对于 k 均值清晰易读

    我正在尝试为 k 均值聚类制作轮廓图 但条形几乎看不见 我怎样才能使这个图表清晰易读 示例代码 require cluster X lt EuStockMarkets kmm lt kmeans X 8 D lt daisy X plot
  • Apache Spark MLLib - 使用 IDF-TF 向量运行 KMeans - Java 堆空间

    我正在尝试从 大 文本文档集合 TF IDF 向量 在 MLLib 上运行 KMeans 文档通过 Lucene 英语分析器发送 稀疏向量由 HashingTF transform 函数创建 无论我使用的并行程度如何 通过合并函数 KMea
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • Javascript 中的 k 均值聚类实现? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要 k means 聚类算法的 Javascript 实现 我只有一维数据 很少超过 100 个项目
  • 高维数据的ELKI Kmeans聚类任务失败错误

    我有 60000 个文档 我在其中处理过gensim得到一个60000 300的矩阵 我将其导出为csv文件 当我导入这个时ELKI环境和运行Kmeans聚类 我遇到以下错误 Task failed de lmu ifi dbs elki

随机推荐

  • sql语句中where一定要放在group by 之前

    sql语句中where一定要放在group by 之前 分组查询出来的结果是根据第一个被查询出来的数据结果作为结果的 所以如果在查询的时候需要加入条件 那么就一定要在分组之前把条件加进去 select litigant name count
  • Apache安全漏洞

    Apache安全漏洞 1 Apache中间件介绍 Apache是世界使用排名第一的Web服务器软件 它可以运行在几乎所有广泛使用的计算机平台上 由于其跨平台和安全性被广泛使用 是最流行的Web服务器端软件之一 它快速 可靠并且可通过简单的A
  • MySQL-多表查询

    多表查询 1 简介 2 笛卡尔现象 3 分类 4 sql92标准 4 1 等值连接 4 12 为表起别名 4 13 两个表的顺序可调换 4 14 加筛选 4 15 加分组 4 16 加排序 4 17 实现三表连接 4 2 非等值连接 4 3
  • NumPy的np.random.rand()用法

    np random rand 是NumPy库中的函数 用于生成在 0 1 区间内均匀分布的随机数 可以接受多个整数参数 用于指定生成数组的形状 生成一个随机标量 import numpy as np random scalar np ran
  • win10计算机找不到家庭组,Win10 家庭版 没有家庭组 这个选项,如何设置局域网 - Microsoft Community...

    您好 了解到您Windows 家庭版没有家庭组的问题 请问您当前系统版本是Windows10 1803的吗 将电脑更新到 Windows 10 版本 1803 之后 家庭组已从 Windows 10 版本 1803 中删除 家庭组将不会显示
  • ERC20(发币)

    目录 基本介绍 代币标准的目的 ERC20代币标准 最小单元 可选单元 solidity 0 6 0版本以后的不同点 实战代码展示 发币 基本介绍 ERC 旨在建立使应用程序和合约更容易相互交互的约定 与 ETH 以太坊的原生加密货币 不同
  • c++ vector 自定义排序的问题

    如果要自己定义STL容器的元素类最好满足STL容器对元素的要求 必须要求 1 Copy构造函数 2 赋值 操作符 3 能够销毁对象的析构函数 另外 1 可用的缺省构造函数 序列型容器必须 用于初始化元素 2 操作符定义 用于判断相等 3 l
  • AIStudio PaddleDetection Picodet 增量训练自己数据

    1 拷贝PaddleDetection https gitee com paddlepaddle PaddleDetection git 2 安装依赖 pip install r requirements txt 3 Vott制作自己的数据
  • ReentrantLock实现原理

    ReentrantLock主要利用CAS CLH队列来实现 它支持公平锁和非公平锁 两者的实现类似 ReentrantLock的基本实现可以概括为 先通过CAS尝试获取锁 如果此时已经有线程占据了锁 那就加入CLH队列并且被挂起 当锁被释放
  • Android中对服务器发送http请求

    当我们需要和服务器进行交互的时候 需要对远程服务器发送请求 接下来我会概述一下android中okhttp的用法 public class HttpUtil 发送Http请求类 每次发送Http请求调用该方法 通过okhttp3发送请求 用
  • 【编写高质量代码:改善Java程序的151个建议】第9章:多线程和并发___建议125~131

    建议125 优先选择线程池 建议126 适时选择不同的线程池来实现 Java线程池原理及实现 建议127 lock与synchronized是不一样的 直接上代码 package OSChina Multithread import jav
  • selenium:select下拉框

    以下两种导的包没有任何本质区别 ui包就是调用Select包中的select方法 from selenium webdriver support select import Select from selenium webdriver su
  • Excel 数据透视表如何累积求和?

    选择数据区域 插入数据透视表 将 区域 与 组别 分别拖放至 行 将 销售数量 分两次拖放至 值 字段 设置计算类型为 求和 如图所示 选择第二个 销售数量 鼠标右键单击后 在弹出的快捷菜单中依次选择 值显示 按某一字段汇总 选项 在弹出的
  • java进阶篇--Docker 有什么优点?使用时需要注意什么问题?

    Docker 从 2013 年发展到现在 它的普及率已经可以和最常用的 MySQL 和 Redis 并驾齐驱了 从最初偶尔出现在面试中 到现在几乎成为面试中必问的问题之一 如果再不了解 Docker 相关的知识点 可能就会与自己心仪的职位擦
  • LSTM的加速算法:QRNN和SRU

    LSTM介绍及加速原理 LSTM的公式可以表示如下所示 其中分别表示输入门 输出门 遗忘门 对LSTM还不熟悉的同学可以先阅读 理解LSTM网络或者直接阅读Christopher Olah 的原博文 Understanding LSTM N
  • 第一周工作周报-5

    部 门 理工大学 姓 名 邓辉波 入 职 时 间 7 18 本周已完成工作内容及总结 1 学习了HTML CSS的基础知识 2 学习了Photoshop的一些简单的知识 3 完成了javascript的第一部分内容的学习 4 制作了第一张静
  • ThinkPHP6 API开发前后端分离用户信息保存在后端的方法

    今天在做项目的时候有一个问题就是Session在开发API的情况下官方是不推荐用的 那么问题来了 用户信息怎么保存呢 下面来记录一下我的写法 首先我用的是JWT插件对token进行生成及验证 话不多说 撸起袖子搞起来 首先写登录文件 我的文
  • layui的弹框弹框不自动关闭

    前言 layui的弹框相比较vue的来说 用法是有很多不一样的 官方 layui弹框 layui弹框2 实现效果 一级弹框点击X 后 不关闭一级弹框 弹出二级弹框 实现代码 核心不退出代码 函数里面加了 return false 1级弹框方
  • 常用排序算法哪个效率更高之从理论到实践

    前面整理了一篇关于排序算法的基础类库 基本排序算法类SortHelper 这里我们来看看这几个算法哪个效率更高一点呢 1 先从理论来看看这几个算法 1 冒泡排序法 基本思想 两两比较待排序数据元素的大小 发现两个数据元素的次序相反时即进行交
  • 【机器学习实战】9、利用K-means算法对未标注数据分组

    文章目录 10 1 K 均值聚类算法 10 2 使用后处理来提高聚类性能 10 3 二分K 均值算法 10 4 总结 簇识别 簇识别给出了聚类结果的含义 假定有一些数据 簇识别会告诉我们这些簇到底都是些什么 聚类与分类的区别 分类的目标事先