TowardsDataScience 博客中文翻译 2020(二十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

改善你的绘图的 4 种方法

原文:https://towardsdatascience.com/4-ways-to-improve-your-plotly-graphs-517c75947f7e?source=collection_archive---------5-----------------------

使用 Plotly 的 Python 库提升您的数据可视化技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 艾萨克

注:发布后,我注意到 Plotly 的 embeds in Medium 存在一些问题。因此,您需要点击链接来查看图表的外观。为了更好的阅读体验,请看我的网站 上的 原版。

最近几周,我一直在使用 Dash 和 Plotly 开发一个应用程序。如果你想快速得到一些东西,这些工具是很棒的。但是,像往常一样,没有神奇的make_beautiful_graphs参数可以默认设置为True

如果你想在你的应用程序中有漂亮的和定制的可视化效果,你需要花一些时间在 Plotly 的图形属性的广泛列表上玩。我想拥有比默认外观更好的东西,所以我查阅了 Plotly 的文档、我拥有的旧代码片段和堆栈溢出问题。

这不是我第一次发现自己这样做。然而,这一次我决定跟踪我在用 Plotly 制作图表时经常做的事情。这样,下次我就不需要阅读相同的文档或浏览相同的堆栈溢出问题了。

在本文中,我列出了我在使用 Plotly 构建数据可视化时经常做的事情。放心,我在数据相关岗位工作过一段时间,所以你不会发现如何制作 3D 饼状图之类离谱的东西。虽然这些改进是基于一个例子,但我经常看到其他人应用类似的想法。

我将重点放在适用于大多数基本图表的实用而简单的改进上:散点图、折线图、条形图和一些统计图。在这里你会发现像删除网格线这样的事情,而不是像为你的 4D 等高线图选择最佳颜色这样的事情。

首先,我将简要介绍如何使用 Plotly 构建图形。接下来,我将提供一个改进列表及其背后的原因。最后,我将给出我发现在使用 Plotly 和其他绘图库时有用的其他建议。

如何使用 Plotly 制作图形

关于 Plotly 的内部运作,你需要知道三件事:

首先,在 Plotly 中制作图表本质上是填充一个 Python 字典。这本字典通常被称为

二、字典中有两个键:布局和*数据。布局中,*你定义了图形的外观,如排版、标题和轴。在 data 键中,您设置将要绘制的轨迹的值和信息。这可能类似于 X 的[1,2,3],Y 的[5,3,9]和条形图类型。

最后,一旦您填充了字典,它就会被序列化(转换)成一个 JSON 结构。然后,Plotly JavaScript 库使用这个结果数据结构来绘制图表。

就是这样。

那么,如何做出一个

做这件事有多种方法。最底层的方法是使用 Python 字典,最高层的方法是使用 Plotly Express 接口*。我倾向于使用一个叫做图形构造器*的中级接口。比使用 Python 字典更容易调试,比 Plotly Express 更灵活。

使用图形构造器制作图形的代码如下:

import plotly.graph_objects as go
import numpy as np
np.random.seed(42)

# Simulate data
returns = np.random.normal(0.01, 0.2, 100)
price = 100 * np.exp(returns.cumsum())
time = np.arange(100)

# Generate graph using Figure Constructor
layout = go.Layout(
    title="Historic Prices",
    xaxis_title="time",
    yaxis_title="price"
)

fig = go.Figure(
    data=go.Scatter(x=time, y=price),
    layout=layout
)   
fig.show()

这是结果图:

[## 历史价格|由 Dylanjcastillo 制作的散点图| plotly

编辑描述

chart-studio.plotly.com](https://chart-studio.plotly.com/~dylanjcastillo/627/#/)

改进列表

以下是我通常用来改善 Plotly 图形的一系列事情:

  • #1:去除网格线和背景色
  • #2:保持图表颜色一致
  • #3:使用峰值线来比较数据点
  • #4:移除浮动菜单,禁用缩放并调整点击行为

#1:去除网格线和背景色

网格线是穿过图表以显示坐标轴刻度的线。它们帮助查看者快速可视化未标记数据点所代表的值。然而,在处理交互式图形时,网格线不是很有用。您可以将鼠标悬停在数据点上并查看其值。因此,在使用 Plotly 时,我通常会删除网格线。‌

你可以这样做:

import plotly.graph_objects as go
import numpy as np
np.random.seed(42)

# Simulate data
returns = np.random.normal(0.01, 0.2, 100)
price = 100 * np.exp(returns.cumsum())
time = np.arange(100)

layout = go.Layout(
    title="Historic Prices",
    plot_bgcolor="#FFF",  # Sets background color to white
    xaxis=dict(
        title="time",
        linecolor="#BCCCDC",  # Sets color of X-axis line
        showgrid=False  # Removes X-axis grid lines
    ),
    yaxis=dict(
        title="price",  
        linecolor="#BCCCDC",  # Sets color of Y-axis line
        showgrid=False,  # Removes Y-axis grid lines    
    )
)

fig = go.Figure(
    data=go.Scatter(x=time, y=price),
    layout=layout
)   
fig.show()

这就是 looks:‌

[## 历史价格|由 Dylanjcastillo 制作的散点图| plotly

编辑描述

plotly.com](https://plotly.com/~dylanjcastillo/627/)

使用类别时,人们通常喜欢做两件事。首先,他们想给每个组分配一些特定的颜色。例如,如果您正在分析美国的选举结果,您可能希望使用特定的蓝色和红色变体来识别民主党和共和党。

#2:在 graphs‌保持一致的颜色

第二,您希望这种颜色在所有图表中保持一致。例如,如果您正在分析一些现实世界中的公司,您可能希望使用它们与众不同的颜色来绘制它们的价格,但在分析它们的回报时也是如此。

以下是如何使用 Plotly 实现这一点:

import plotly.graph_objects as go
import numpy as np
np.random.seed(42)

# Simulate data
returns_A = np.random.normal(0.01, 0.2, 100)
returns_B = np.random.normal(0.01, 0.2, 100)
returns = np.append(returns_A, returns_B)

prices_A = 100 * np.exp(returns_A.cumsum())
prices_B = 100 * np.exp(returns_B.cumsum())
prices = np.append(prices_A, prices_B)

companies = ["A"] * 100 + ["B"] * 100
time = np.append(np.arange(100), np.arange(100))

df = pd.DataFrame({
    "company": companies,
    "time": time,
    "price": prices,
    "returns": returns
})

# Build graph
COLORS_MAPPER = {
    "A": "#38BEC9",
    "B": "#D64545"
}

layout = go.Layout(
    title="Performance of A vs. B",    
    plot_bgcolor="#FFFFFF",
    barmode="stack",
    xaxis=dict(
        domain=[0, 0.5],
        title="time",
        linecolor="#BCCCDC",
    ),
    yaxis=dict(
        title="price",
        linecolor="#BCCCDC"
    ),
    xaxis2=dict(
        domain=[0.6, 1],
        title="returns",
        linecolor="#BCCCDC",
    ),
    yaxis2=dict(
        anchor="x2",
        linecolor="#BCCCDC"
    )
)

data = []
for company,col in COLORS_MAPPER.items():
    time = df.loc[df.company == company, "time"]
    price = df.loc[df.company == company, "price"]
    returns = df.loc[df.company == company, "returns"]
    line_chart = go.Scatter(
        x=time,
        y=price,
        marker_color=col,  # Defines specific color for a trace
        legendgroup=company,  # Groups traces belonging to the same group in the legend 
        name=company
    )
    histogram = go.Histogram(
        x=returns,
        marker_color=col,  # Defines specific color for a trace
        legendgroup=company,  # Groups traces belonging to the same group in the legend 
        xaxis="x2", 
        yaxis="y2",
        showlegend=False
    )
    data.append(line_chart)
    data.append(histogram)

fig = go.Figure(data=data, layout=layout)
fig.show()

上面的代码片段允许您在处理共享相同类别的多个图表时保持一致的颜色。关键部分是COLOR_MAPPER字典及其在添加新轨迹时的使用。这本字典是您将在图表中使用的类别和颜色的映射。

每当你添加一个轨迹到一个图中,你可以通过从COLOR_MAPPER字典中获得正确的颜色来分配给marker_color属性。

结果图看起来像 follows:‌

[## Dylanjcastillo 制作的 A 与 B |散点图的性能| plotly

编辑描述

plotly.com](https://plotly.com/~dylanjcastillo/671/)

#3:使用峰值线来比较数据点

尖线是悬停在数据上时出现的垂直线或水平线。这对于比较折线图和散点图中的值很有用。这就是你如何使用 Plotly 添加这些:

import plotly.graph_objects as go
import numpy as np
np.random.seed(42)

# Simulate data
returns_A = np.random.normal(0.01, 0.2, 100)
returns_B = np.random.normal(0.01, 0.2, 100)
returns = np.append(returns_A, returns_B)

prices_A = 100 * np.exp(returns_A.cumsum())
prices_B = 100 * np.exp(returns_B.cumsum())
prices = np.append(prices_A, prices_B)

companies = ["A"] * 100 + ["B"] * 100
time = np.append(np.arange(100), np.arange(100))

df = pd.DataFrame({
    "company": companies,
    "time": time,
    "price": prices,
    "returns": returns
})

# Build graph
layout = go.Layout(
    title="Performance of A vs. B",    
    plot_bgcolor="#FFFFFF",
    hovermode="x",
    hoverdistance=100, # Distance to show hover label of data point
    spikedistance=1000, # Distance to show spike
    xaxis=dict(
        title="time",
        linecolor="#BCCCDC",
        showspikes=True, # Show spike line for X-axis
        # Format spike
        spikethickness=2,
        spikedash="dot",
        spikecolor="#999999",
        spikemode="across",
    ),
    yaxis=dict(
        title="price",
        linecolor="#BCCCDC"
    )
)

data = []
for company in ["A", "B"]:
    time = df.loc[df.company == company, "time"]
    price = df.loc[df.company == company, "price"]
    returns = df.loc[df.company == company, "returns"]
    line_chart = go.Scatter(
        x=time,
        y=price,
        name=company
    )
    data.append(line_chart)

fig = go.Figure(data=data, layout=layout)
fig.show()

这是结果图:

[## Dylanjcastillo 制作的 A 与 B |散点图的性能| plotly

编辑描述

plotly.com](https://plotly.com/~dylanjcastillo/700/)

#4:移除浮动菜单,禁用缩放并调整点击行为

我不太喜欢默认情况下自动添加到图表中的浮动菜单。它让图形看起来,但是我很少看到人们使用它。它有如此多的选项,以至于对于第一次看图表的人来说很困惑。通常,我会移除它。

另外,我喜欢重新定义另外两个用户交互参数。我更喜欢限制用户放大和更改单击图例中的轨迹的行为的能力。在 Plotly 中,默认情况下,如果您想单独检查一个轨迹,您必须双击该轨迹,而不是只单击它。这不是很直观,所以我倾向于颠倒这种行为。

这是您应用这些更改的方式:

import plotly.graph_objects as go
import numpy as np
np.random.seed(42)

# Simulate data
returns_A = np.random.normal(0.01, 0.2, 100)
returns_B = np.random.normal(0.01, 0.2, 100)
returns = np.append(returns_A, returns_B)

prices_A = 100 * np.exp(returns_A.cumsum())
prices_B = 100 * np.exp(returns_B.cumsum())
prices = np.append(prices_A, prices_B)

companies = ["A"] * 100 + ["B"] * 100
time = np.append(np.arange(100), np.arange(100))

df = pd.DataFrame({
    "company": companies,
    "time": time,
    "price": prices,
    "returns": returns
})

# Build graph
layout = go.Layout(
    title="Performance of A vs. B",    
    plot_bgcolor="#FFFFFF",
    legend=dict(
        # Adjust click behavior
        itemclick="toggleothers",
        itemdoubleclick="toggle",
    ),
    xaxis=dict(
        title="time",
        linecolor="#BCCCDC",
    ),
    yaxis=dict(
        title="price",
        linecolor="#BCCCDC"
    )
)

data = []
for company in ["A", "B"]:
    time = df.loc[df.company == company, "time"]
    price = df.loc[df.company == company, "price"]
    returns = df.loc[df.company == company, "returns"]
    line_chart = go.Scatter(
        x=time,
        y=price,
        name=company
    )
    data.append(line_chart)

fig = go.Figure(data=data, layout=layout)
fig.show(config={"displayModeBar": False, "showTips": False}) # Remove floating menu and unnecesary dialog box

这是结果图:

[## Dylanjcastillo 制作的 A 与 B |散点图的性能| plotly

编辑描述

plotly.com](https://plotly.com/~dylanjcastillo/716/)

其他建议

我发现有三件事对学习如何更好地实现数据可视化很有用:

  1. 从你的听众那里获得反馈:这并不总是可能的。但是如果可以的话,总是优先考虑从那些将使用你的数据可视化的人那里获得输入。如果你在一个仪表板上工作,你应该做的第一件事是理解你的仪表板解决什么问题。然后看到用户与之交互。对你的时间有最高的投资回报率。
  2. 查看 Cole Knaflic 的用数据讲故事:如果你想提高你的数据可视化设计技能,这是一本很棒的书。它提供了许多实用的建议和引人注目的用例。
  3. plotty 的图参考:习惯 plotty 的图参考和 plotty 的文档。你会经常用到它。总的来说,Plotly 的文档非常优秀。

结束语

我希望这些想法对你有用。可能会有一些事情和你没有共鸣,或者其他你觉得缺失的事情。如果是这样的话,请在下面的评论中告诉我。我很乐意更新这个并添加其他有价值的建议。

你可以在这里找到我写的其他文章,或者如果你想了解我正在做的事情,你可以在 TwitterLinkedIn 上关注我。

本文原载于 我的博客

在新冠肺炎期间用数据引导的 4 种方法

原文:https://towardsdatascience.com/4-ways-to-lead-with-data-during-covid-19-7693d5bd6c94?source=collection_archive---------78-----------------------

定义疫情期间数据领导者的角色

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Philip Steury 摄影

在新冠肺炎疫情期间,数据领导者的角色变得更加重要。随着企业面临新的和不可预见的挑战,数据已成为决策的重要支柱。在这些强大的管道和原始见解背后,首席数据官(CDO)、首席信息官(CIO)和其他数据领导者肩负着推动企业战略的任务。

我们采访了 SAP 的企业数据战略和转型负责人 Maria Villar,以更好地了解数据领导者在这一动荡时期对其组织的影响。在她数十年的职业生涯中,Maria 亲眼见证了高质量数据对于设定明确的优先事项和在不确定性面前引导组织变革的价值。她甚至在 YouTube 上讲授一门关于这个主题的热门课程,即结果驱动的数据策略大师课。在我们的谈话中,Maria 分享了一些有用的想法和问题,作为面对新冠肺炎的数据领导者,我们应该问自己。

1。成为新冠肺炎响应团队的一员。

许多组织组建了所谓的快速反应小组来应对这一前所未有的时刻。如果你还不是其中一员,那就努力争取一个席位,因为你的组织希望利用内部和外部数据来了解业务变化,并做出明智的回应。尤其是现在有大量的数据涌入,其中一些数据位于常规模式之外,因此更加需要了解这些数据,并将其与业务对新冠肺炎的响应联系起来。以下是向你的团队提出的一些问题,以确保你在非常时期以及当事情(希望最终)恢复正常时,能抓住这些联系:

  • 我们了解数据的来源以及它们之间的联系吗?
  • 我们有合适的数据质量吗?否则,在我们对新冠肺炎响应产生影响之前,需要进行数据质量补救。
  • 我们数据的有效来源在哪里?我们应该如何将它整合到我们的仪表板和响应中?
  • 我们需要额外的信息来源吗?这将从何而来?

你对数据了解得越多,回答这些基本问题的能力越强,你就能更好地为公司服务。没有这些基本面,你会无所适从。

2。把这些点联系起来。

在危机时期,更重要的是做出数据驱动的决策——好时光有时会隐藏糟糕的决策和糟糕的流程。因此,这个具有挑战性的时刻实际上可以成为您更广泛的组织的一个主要学习机会,因为他们可以切实看到“盲目飞行”和使用高质量数据之间的价值。但是,数据素养是一项技能,这意味着你和你的团队需要帮助教育公司的其他人做出决策。当你思考如何在推动决策的过程中带领组织前进时,请考虑以下问题。

  • 我们应该使用什么样的可视化技术来负责任地表示数据?
  • 我们如何根据这些数据做出决策?
  • 我们试图解决的问题是什么?为了做出明智的决策,我们需要哪些信息?

仅仅告诉组织数据在哪里,或者把数据放在盘子里端上来是不够的;相反,专注于将点点滴滴联系起来,这样每个人都明白如何正确使用数据,并能充分理解(好的)数据是如何为王的。

3。保持战略重点。

当响应事件发生时,从战略数据的角度对其进行评估是很重要的——但是太容易陷入事件的紧迫性中。如果您了解您的实际数据差距,并努力构建可重用、可预测的数据流程,运营和技术将能够更好地应对未来的问题。

  • 首先,有策略地应对出现的数据问题。我们现在需要做什么来解决这些问题?
  • 然后,转回来做一个事后分析:如果将来发生这种情况,我们需要建立什么样的能力?

4。强调数据伦理。

随着数据在危机等转折点成为组织决策的中心,从一开始就建立正确的价值观和控制非常重要。毕竟,如果不负责任地使用数据,数据既可能带来好处,也可能带来坏处,因此,作为公司的数据领导者,请确保你是这些基本对话的中间人。

  • 以道德的方式使用数据意味着什么?
  • 我们是否有一套关于数据使用的政策?尤其是从人工智能的角度?
  • 我们最常见的数据场景是什么?
  • 我们如何进行数据跟踪和自动化?

与整个公司的团队一起组织一个持续的数据道德委员会 作为一个跨职能小组,了解您的数据是如何用于消除偏见的。确保包括法律、营销、数据战略、隐私和安全团队的成员。组织中的不同团队会从不同的角度看待数据,但是保持一致性是至关重要的。

将您的公司转变为数据驱动的组织从未如此重要,这反过来使其缺点更加明显。有效管理数据需要一个全面的数据战略来构建所有的数据能力,使组织不仅能够快速应对新冠肺炎危机,还能应对未来的危机。如果还没有的话,这个话题现在应该成为董事会讨论的话题。数据领导者将确保这一点。

联系 玛利亚维拉 巴尔摩西 有任何问题、意见或建议。

4 种降低数据维度的方法

原文:https://towardsdatascience.com/4-ways-to-reduce-dimensionality-of-data-8f82e6565a07?source=collection_archive---------15-----------------------

降维方法概述——相关、主成分分析、t-SNE、自动编码器及其在 python 中的实现

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Avel ChuklanovUnsplash 上拍摄,使用 Pixlr 编辑

降维是减少数据集中特征或变量数量的过程。它是将数据从高维空间转换到低维空间,以便低维表示保留原始数据的一些有意义的属性。

为什么降维很重要?

在现实世界的数据集中,数据中经常有太多的变量。要素数量越多,数据的可视化和处理就越困难。有时,这些特征中的大多数是相关的,因此是多余的。这就是降维算法发挥作用的地方。

有多种方法可以降低数据的维数,在本文中,您可以了解其中的一些方法:

  1. 特征选择方法:使用相关系数方法
  2. 矩阵分解
  3. 流形学习:SNE
  4. 自动编码器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征选择方法:

一些数据集具有大量的要素,而这些要素中只有一些与目标类标注相关。特征选择技术使用评分或统计方法来选择保留哪些特征和删除哪些特征。

用于通过选择顶部特征来减小尺寸的技术或算法有:

  • 皮尔逊相关系数(数值输入,数值输出)
  • Spearman 相关系数(数值输入,数值输出)
  • 卡方检验(分类输入,分类输出)
  • 肯德尔τ检验(数值输入,分类输出)

[## 皮尔逊和斯皮尔曼等级相关系数—解释

随机变量之间的关系。

towardsdatascience.com](/pearson-and-spearman-rank-correlation-coefficient-explained-60811e61185a)

根据训练数据的特征是数字的还是分类的,以及目标类别标签是数字的还是分类的,可以从上述列表中选择不同的特征。

获取来自 UCI ML 知识库的葡萄酒样本数据集。目标类别标签是分类的,其余的训练数据具有数字特征。因此,我们可以使用 Kendall Tau 测试找到与目标类别标签(“Customer_Segment”)高度相关的顶级特征。

(作者代码)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供),上面代码片段的第 4 行输出

从具有目标类标签“Customer_Segment”的数据集中的每个特征的上述 Kendall 系数,可以确认特征“Flavanoids”、“OD280”和“Total_Phenols”是具有最大模值的前 3 个特征。您可以通过取系数值的模来挑选前 x 个特征。

矩阵分解:

矩阵分解方法可用于降维。主成分分析(PCA)是一种矩阵分解技术,用于将高维数据降维。PCA 保持方差最大的方向。

PCA 应遵循的步骤:

  • 给定数据集 X 的形状(n 行,d 要素)
  • 标准化数据集 X
  • 计算协方差矩阵

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 从协方差矩阵中找出特征值和特征向量。
  • 为了挑选前 f 个特征,挑选具有相应的前 x 个最大特征值的特征向量。

(作者代码)

对于取自 UCI ML 知识库的葡萄酒样本数据集,最初,数据集有 13 个特征,经过 PCA 算法后,维数减少到 2 维,可视化结果如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供),来自 PCA 算法的二维数据的可视化

多方面学习:

高维度统计的技术也可以用于降维。使用流形学习并用于创建高维数据的低维投影。这通常用于数据可视化。

t-分布式随机邻居嵌入( t-SNE )是一种流形学习技术,用于将高维数据投影到低维(主要是 2 维或 3 维)进行可视化。t-SNE 是一种邻域保持嵌入技术,它能最好地保持低维数据中的显著结构或关系。

(作者代码)

对于取自 UCI ML 知识库的葡萄酒样本数据集,最初,数据集有 13 个特征,在应用 t-SNE 算法后,维数减少到 2 维,可视化结果如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供),来自 t-SNE 算法的二维数据的可视化

自动编码器:

Auto Encoders 是一个人工神经网络模型,用于执行维度缩减。自动编码器有两个组成部分,压缩和扩展。形状的初始数据集(n 行,d 维)被传递到自动编码器神经网络模型,并被编码到较低维的隐藏层。然后,它试图从简化的编码中生成尽可能接近其原始输入的表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图像源),自动编码器架构

以上是基于单层感知器的自动编码器,它参与了多层感知器(MLP)——具有输入层、输出层和连接它们的一个或多个隐藏层。输出层中的节点数量与输入层中的节点数量相同,并且通过最小化输入和输出之间的差异来重构其输入。

输入和输出层有 d 个神经元(d 是原始数据集的维数)。中间隐藏层有 f 个神经元(f 是降维后的维数)。

结论:

在本文中,我们讨论了 4 种不同的降维技术,每种技术都有各自的优缺点。没有最好的降维技术。相反,最好的方法是使用系统的受控实验,并发现哪些降维技术与您选择的模型结合使用时,会在数据集上产生最佳性能。

感谢您的阅读

数据科学家的 40 个统计面试问题和答案

原文:https://towardsdatascience.com/40-statistics-interview-problems-and-answers-for-data-scientists-6971a02b7eee?source=collection_archive---------0-----------------------

为你的面试复习统计知识的资源!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 admiralmarkets.com 的照片

务必 订阅此处 或至我的 独家快讯 千万不要错过另一篇关于数据科学的指南、窍门和技巧、生活经验等!

鉴于我的文章、 Google 的数据科学面试脑筋急转弯亚马逊的数据科学家面试练习题微软数据科学面试问答数据科学家常见的 5 个 SQL 面试问题的受欢迎程度,我在网上收集了一些统计数据科学面试问题,并尽我所能地进行了回答。

我对数据科学了解得越多,就越意识到基本的统计知识对成功至关重要。因此,我浏览了网页,找到了四十个数据科学家的统计面试问题,我将回答这些问题。开始了。

1.你如何评估一个洞察力的统计意义?

您将执行假设检验来确定统计显著性。首先,你要陈述零假设和替代假设。其次,您将计算 p 值,即假设零假设为真,获得测试观察结果的概率。最后,您将设置显著性水平(alpha ),如果 p 值小于 alpha,您将拒绝 null 换句话说,结果具有统计显著性。

2.解释什么是长尾分布,并提供三个有长尾的相关现象的例子。为什么它们在分类和回归问题中很重要?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

长尾分布的例子

长尾分布是一种重尾分布,它有一条(或多条)逐渐渐近消失的尾巴。

3 实际例子包括幂定律、帕累托原则(通常称为 80-20 法则)和产品销售(即最畅销的产品与其他产品相比)。

在分类和回归问题中注意长尾分布是很重要的,因为出现频率最低的值构成了总体的大多数。这最终会改变您处理异常值的方式,并且它也与一些假设数据正态分布的机器学习技术相冲突。

3.什么是中心极限定理?解释一下。为什么重要?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自维基百科

统计学如何为 CLT 提供了最好的定义,这就是:

“中心极限定理表明,无论总体分布的形状如何,随着样本量的增加,样本均值的抽样分布接近正态分布。”[1]

中心极限定理很重要,因为它用于假设检验和计算置信区间。

4.统计力是什么?

“统计功效”是指二元假设的功效,即假设替代假设为真,测试拒绝零假设的概率。[2]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.解释选择偏差(关于数据集,而不是变量选择)。为什么重要?丢失数据处理等数据管理程序如何使情况变得更糟?

选择偏倚是指在选择个人、群体或数据进行分析时,没有实现适当的随机化,最终导致样本不能代表总体的现象。

理解和识别选择偏差是很重要的,因为它会严重扭曲结果,并提供关于特定人群的错误见解。

选择偏差的类型包括:

  • 抽样偏差:非随机抽样导致的有偏差样本
  • 时间间隔:选择支持预期结论的特定时间范围。例如,在临近圣诞节时进行销售分析。
  • 暴露:包括临床易感性偏倚、原发性偏倚、适应症偏倚。此处阅读更多
  • 数据:包括摘樱桃、压制证据、证据不全的谬误。
  • :流失偏倚类似于生存偏倚,即只有那些在长期过程中“幸存”的人才会被纳入分析,或者类似于失败偏倚,即那些“失败”的人才会被纳入分析
  • 观察者选择:与人择原理相关,人择原理是一种哲学上的考虑,即我们收集的关于宇宙的任何数据都要经过过滤,为了使它可以被观察到,它必须与观察它的有意识和有智慧的生命兼容。[3]

处理缺失数据会使选择偏差变得更糟,因为不同的方法会以不同的方式影响数据。例如,如果您用数据的平均值替换空值,您就增加了偏差,因为您假设数据并不像实际可能的那样分散。

务必 订阅此处 或至我的 独家快讯 千万不要错过另一篇关于数据科学的指南、窍门和技巧、生活经验等!

6.提供一个简单的例子,说明实验设计如何帮助回答一个关于行为的问题。实验数据和观测数据如何对比?

观察数据来自观察研究,即观察某些变量并试图确定它们之间是否存在关联。

实验数据来自实验研究,即当你控制某些变量并保持它们不变,以确定是否存在因果关系。

实验设计的一个例子如下:将一组分成两个。对照组正常生活。测试组被告知在 30 天内每天晚上喝一杯酒。然后可以进行研究,看看酒是如何影响睡眠的。

7.缺失数据的均值插补是可接受的做法吗?为什么或为什么不?

均值插补是用数据的均值替换数据集中的空值的实践。

均值插补通常是不好的做法,因为它没有考虑特征相关性。例如,假设我们有一个显示年龄和健康分数的表格,并假设一个 80 岁的老人缺少健康分数。如果我们从 15 岁到 80 岁的年龄范围内取平均健康分数,那么 80 岁的人看起来会有一个比他实际应该有的高得多的健康分数。

第二,均值插补减少了数据的方差,增加了数据的偏倚。由于方差较小,这导致模型不太精确,置信区间较窄。

8.什么是离群值?解释如何筛选异常值,如果在数据集中发现异常值,您会怎么做。此外,解释什么是内联体,如何筛选内联体,如果在数据集中发现了内联体,你会怎么做。

异常值是与其他观察值显著不同的数据点。

根据异常值的原因,从机器学习的角度来看,它们可能是坏的,因为它们会降低模型的准确性。如果异常值是由测量误差引起的,那么将它们从数据集中移除是非常重要的。有几种方法可以识别异常值:

****Z 值/标准偏差:如果我们知道一个数据集中 99.7%的数据位于三个标准偏差内,那么我们可以计算一个标准偏差的大小,乘以 3,并确定超出该范围的数据点。同样,我们可以计算给定点的 z 分数,如果它等于+/- 3,那么它就是异常值。
注意:使用这种方法时需要考虑一些意外情况;数据必须呈正态分布,这一点不适用于小数据集,并且过多异常值的存在会影响 z 值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

*四分位距(IQR): IQR,用于构建箱线图的概念,也可用于识别异常值。IQR 等于第三个四分位数和第一个四分位数之差。然后,如果一个点小于 Q1-1.5 * IRQ 或大于 Q3 + 1.5IQR,则可以确定该点是否为异常值。这达到大约 2.698 个标准偏差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片来自迈克尔·加拉尼克

其他方法包括 DBScan 聚类、隔离森林和稳健随机采伐森林。

一个内联者是一个数据观察,它位于数据集的其余部分,是不寻常的或者是错误的。由于它位于数据集中,通常比异常值更难识别,需要外部数据来识别它们。如果您发现了任何内联者,您可以简单地将它们从数据集中删除以解决它们。**

9.你如何处理丢失的数据?有什么插补技巧推荐?

有几种方法可以处理丢失的数据:

  • 删除缺少数据的行
  • 均值/中值/众数插补
  • 分配唯一的值
  • 预测缺失值
  • 使用支持缺失值的算法,如随机森林

最好的方法是删除缺少数据的行,因为这样可以确保没有偏差或差异被添加或删除,并最终产生一个稳健而准确的模型。但是,只有在开始时有大量数据并且缺失值的百分比很低的情况下,才建议这样做。

10.您有呼叫中心通话时长的数据。为如何编码和分析这些数据制定一个计划。解释一下这些持续时间的分布情况。你如何测试,甚至是图形化地测试,你的期望是否实现了?

首先,我会进行 EDA——探索性数据分析,以清理、探索和理解我的数据。见我关于 EDA 的文章 这里 。作为我的 EDA 的一部分,我可以构建一个通话持续时间的直方图来查看潜在的分布。

我的猜测是,呼叫的持续时间将遵循对数正态分布(见下文)。我认为它是正偏的原因是因为下限被限制为 0,因为调用不能是负秒。然而,在高端,很可能有一小部分通话时间相对较长。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对数正态分布示例

您可以使用 QQ 图来确认通话时长是否符合对数正态分布。参见 此处 了解更多 QQ 剧情。

11.解释管理数据集和从实验研究中收集的数据集之间可能的差异。管理数据可能会遇到什么问题?实验方法如何帮助缓解这些问题?它们带来了什么问题?

行政数据集通常是政府或其他组织出于非统计原因使用的数据集。

管理数据集通常比实验研究更大,更具成本效益。假设与管理数据集相关联的组织是活动的并且正在运行,那么它们也会被定期更新。与此同时,管理数据集可能无法捕获用户可能需要的所有数据,也可能不是所需的格式。它还容易出现质量问题和遗漏条目。

12.您正在为每月上传的用户内容编写一份报告,并注意到 10 月份的上传量出现了峰值。特别是图片上传的高峰。您可能认为这是什么原因造成的,您将如何测试它?

照片上传数量激增的潜在原因有很多:

  1. 一项新功能可能已经在 10 月份实施,它涉及上传照片,并获得了用户的大量关注。例如,提供创建相册能力的功能。
  2. 同样,有可能之前上传照片的过程不直观,在 10 月份得到了改善。
  3. 可能有一场病毒式的社交媒体运动,包括持续了整个 10 月的上传照片。八月天,但更具扩展性的东西。
  4. 这有可能是因为人们上传了自己穿着万圣节服装的照片。

测试的方法取决于尖峰的原因,但是您可以进行假设测试来确定推断的原因是否是实际原因。

13.你即将登上去西雅图的飞机。你想知道你是否应该带一把伞。你打电话给住在那里的三个朋友,分别问他们是否在下雨。你的每个朋友都有 2/3 的机会对你说真话,1/3 的机会用谎言来搞乱你。三个朋友都告诉你“是的”下雨了。西雅图真的下雨的概率有多大?

你可以看出这个问题与贝叶斯理论有关,因为最后一个陈述基本上遵循这样的结构,“假设 B 为真,A 为真的概率是多少?”因此,我们需要知道某一天伦敦下雨的概率。假设是 25%。

P(A) =下雨的概率= 25%
P(B) =三个朋友都说在下雨的概率
P(A|B)假定他们说在下雨的概率
P(B|A)假定在下雨的情况下三个朋友都说在下雨的概率= (2/3) = 8/27

第一步:求解 P(B)
P(A | B)= P(B | A)
P(A)/P(B),可以改写为
P(B)= P(B | A)
P(A)+P(B | not A)
P(not A)
P(B)=(2/3)* 0.25+(1/3)* 0.75 = 0.25 * 8/27+0.75 * 1/27***

*第二步:求解 P(A | B)
P(A | B)= 0.25 (8/27)/(0.25 * 8/27+0.75 * 1/27)
P(A | B)= 8/(8+3)= 8/11

因此,如果三个朋友都说在下雨,那么有 8/11 的几率是真的在下雨。

一定要 订阅 千万不要错过另一篇关于数据科学指南、诀窍和技巧、生活经验等的文章!

14.有一个盒子——有 12 张黑色和 12 张红色卡片,第二个盒子有 24 张黑色和 24 张红色卡片;如果你想从 2 个盒子中随机抽取 2 张卡片,哪个盒子获得相同颜色的概率更高?你能直观地说出为什么第二个盒子有更高的概率吗

有 24 张红卡和 24 张黑卡的盒子获得两张同色卡片的概率更大。让我们走过每一步。

假设你从每副牌中抽出的第一张牌是红色的 a。

这意味着在有 12 个红和 12 个黑的牌组中,现在有 11 个红和 12 个黑。因此,你再抽一张红色的几率等于 11/(11+12)或 11/23。

一副牌中有 24 个红和 24 个黑,那么就有 23 个红和 24 个黑。因此,你再抽一张红色的几率等于 23/(23+24)或 23/47。

由于 23/47 > 11/23,所以卡数较多的第二副牌有较大概率得到相同的两张牌。

15.什么是:提升、KPI、稳健性、模型拟合、实验设计、80/20 法则?

****提升:提升是针对随机选择目标模型测量的目标模型的性能的度量;换句话说,lift 告诉你你的模型在预测事物方面比没有模型时好多少。

KPI: 代表关键绩效指标,这是一个可衡量的指标,用于确定公司实现其业务目标的情况。错误率。

****健壮性:健壮性通常指系统处理可变性并保持有效的能力。

****模型拟合:指一个模型对一组观察值的拟合程度。

****实验设计:也称为 DOE,它是在假设反映变量的条件下,旨在描述和解释信息变化的任何任务的设计。[4]本质上,实验的目的是根据一个或多个输入(独立变量)的变化来预测结果。

****80/20 法则:又称帕累托原理;80%的结果来自 20%的原因。80%的销售额来自 20%的顾客。

16.定义质量保证,六西格玛。

****质量保证:一项或一组活动,旨在通过减少错误和缺陷来维持期望的质量水平。

****六西格玛:一种特定类型的质量保证方法,由一套用于过程改进的技术和工具组成。六西格玛流程是指所有结果的 99.99966%没有缺陷。

17.给出既不是高斯分布也不是对数正态分布的数据的例子。

  • 任何类型的分类数据都不会有高斯分布或对数正态分布。
  • 指数分布——例如,汽车电池的持续时间或地震发生前的时间。

18.什么是根本原因分析?如何识别原因和相关性?举例说明

****根本原因分析:用于确定问题根本原因的解决问题的方法[5]

相关性衡量两个变量之间的关系,范围从-1 到 1。因果关系是指第一个事件似乎引发了第二个事件。因果关系主要看直接关系,而相关性可以看直接和间接关系。

例句:在加拿大,较高的犯罪率与较高的冰淇淋销售额有关,也就是说,它们是正相关的。然而,这并不意味着一个导致另一个。相反,这是因为当室外温度较高时,这两种情况发生得更多。

您可以使用假设检验或 A/B 检验来检验因果关系。

19.请给出一个中值比平均值更好衡量的例子

当有许多异常值正或负地扭曲了数据时。

20.给定两个公平的骰子,得分总和为 4 的概率是多少?到 8?

滚动 a 4 有 4 种组合(1+3,3+1,2+2):
P(滚动 a 4) = 3/36 = 1/12

有滚安 8 的组合(2+6,6+2,3+5,5+3,4+4):
P(滚安 8) = 5/36

21.什么是大数定律?

大数定律是一种理论,它指出随着试验次数的增加,结果的平均值将越来越接近期望值。

正面硬币 100,000 次的翻转次数应该接近 0.5 次而不是 100 次。

22.你如何计算所需的样本量?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

误差幅度公式

您可以使用误差幅度(ME)公式来确定所需的样本量。

  • t/z =用于计算置信区间的 t/z 分数
  • ME =期望的误差幅度
  • S =样本标准偏差

23.当你取样时,你造成了什么样的偏见?

潜在的偏见包括:

  • ****抽样偏倚:由非随机抽样引起的有偏倚的样本
  • ****覆盖偏差:采样太少的观测值
  • ****生存偏差:忽略没有通过某种形式的选择过程的观察的错误。

24.你如何控制偏见?

你可以做很多事情来控制和减少偏见。两种常见的方式包括随机化*,参与者被随机分配,以及随机抽样,每个成员被选中的概率相等。***

25.什么是混杂变量?

混杂变量或混杂因素是一种既影响因变量又影响自变量的变量,导致虚假关联,即两个或更多变量相关但无因果关系的数学关系。

26.什么是 A/B 测试?

A/B 检验是假设检验和双样本假设检验的一种形式,用于比较单个变量的两个版本,即控制变量和变量。它通常用于改善和优化用户体验和营销。

27.医院的感染率高于每 100 人-日 1 例感染的风险被视为高。某医院在过去的 1787 人/天中有 10 例感染风险。给出医院是否低于标准的正确片面检验的 p 值。

由于我们查看的是给定时间段内发生的事件数量(感染数量),因此这是一个泊松分布问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在一个区间内观察到 k 个事件的概率

零(H0):每人每天 1 例感染
备选方案(H1): >每人每天 1 例感染

*k(实际)= 10 次感染
λ(理论)= (1/100)1787
p = 0.032372 或 3.2372% 计算使用。excel 中的 poisson()或 R 中的 ppois

由于 p 值< alpha (assuming 5% level of significance), we reject the null and conclude that the hospital is below the standard.

28. You roll a biased coin (p(head)=0.8) five times. What’s the probability of getting three or more heads?

Use the General Binomial Probability formula to answer this question:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

General Binomial Probability Formula

p = 0.8
n = 5
k = 3,4,5

P(3 头以上)= P(3 头)+ P(4 头)+ P(5 头)= 0.94 或 94%

29.随机变量 X 是具有平均值 1020 和标准偏差 50 的正态变量。计算 P(X>1200)

使用 Excel…
p =1-norm.dist(1200,1020,50,true)
p= 0.000159

30.假设出现在公交车站的人数为泊松分布,平均值为 2.5 人/小时。四小时内最多出现三人的概率是多少?

x = 3
平均值= 2.5
4 = 10
*

使用 Excel…

p = poisson.dist(3,10,true)
p = 0.010336

31.艾滋病毒检测的灵敏度为 99.7%,特异性为 98.5%。患病率为 0.1%的人群中的受试者获得阳性测试结果。测试的精确度是多少(即他是 HIV 阳性的概率)?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

精度方程(PV)

精度=阳性预测值= PV
PV =(0.001 * 0.997)/[(0.001 * 0.997)+((1–0.001)
(1–0.985))]
PV = 0.0624 或 6.24%
*

更多关于这个方程的内容请看 这里

32.你正在竞选公职,而你的民意调查者调查了上百人。他们中的 60 个人声称他们会投你的票。你能放松吗?

  • 假设只有你和另一个对手。
  • 另外,假设我们想要 95%的置信区间。这使我们的 z 值为 1.96。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

置信区间公式

p-hat = 60/100 = 0.6
z * = 1.96
n = 100
这就给了我们一个[50.4,69.6]的置信区间。因此,给定 95%的置信区间,如果你可以接受最糟糕的捆绑情形,那么你可以放松了。否则,你不能放松,直到 100 分中有 61 分说是。

34.苏格兰的凶杀率从前一年的 115 下降到了去年的 99。这种报道的变化真的值得注意吗?

  • 因为这是一个泊松分布问题,均值=λ=方差,这也意味着标准差=均值的平方根
  • 95%的置信区间意味着 z 值为 1.96
  • 一个标准偏差= sqrt(115) = 10.724

因此置信区间= 115+/- 21.45 = [93.55,136.45]。由于 99 在这个置信区间内,我们可以假设这个变化不是很值得注意。

35.考虑双亲异性恋家庭的流感流行。假设父母中至少有一方患病的概率是 17%。父亲感染流感的概率为 12%,而母亲和父亲都感染该疾病的概率为 6%。母亲感染流感的概率有多大?

利用概率中的一般加法法则:
P(母亲或父亲)= P(母亲)+ P(父亲)— P(母亲和父亲)
P(母亲)= P(母亲或父亲)+ P(母亲和父亲)— P(父亲)
P(母亲)= 0.17+0.06–0.12
P(母亲)= 0.11

36.假设 35-44 岁男性的舒张压(DBPs)正态分布,平均值为 80(毫米汞柱),标准差为 10。随机选择一个 35-44 岁的人,其 DBP 低于 70 的概率是多少?

因为 70 比平均值低一个标准差,所以取一个标准差左边的高斯分布的面积。

= 2.3 + 13.6 = 15.9%

37.在感兴趣的人群中,9 名男性的样本产生了 1,100cc 的样本平均脑容量和 30cc 的标准偏差。这个新群体的平均脑容量的 95%学生 T 置信区间是多少?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

样本的置信区间

假设置信度为 95%,自由度等于 8,t 值= 2.306

*置信区间= 1100±2.306 (30/3)
置信区间= [1076.94,1123.06]

38.在六周的时间里,给 9 名受试者服用减肥药。体重的平均差异(随访-基线)为-2 磅。要使 95% T 置信区间的上端点达到 0,体重差异的标准偏差必须是多少?

上限=平均值+ t 得分(标准偏差/sqrt(样本大小))
0 =-2+2.306 (s/3)
2 = 2.306 * s/3
s = 2.601903
因此,标准偏差必须至少约为 2.60,95% T 置信区间的上限才能达到 0。

39.在一项关于急诊室等待时间的研究中,调查人员考虑了一种新的标准分流系统。为了测试系统,管理员选择了 20 个晚上,并随机分配新的分流系统在 10 个晚上使用,标准系统在其余 10 个晚上使用。他们计算了每晚看医生的平均等待时间(MWT)。新系统的平均 MWT 为 3 小时,方差为 0.60,而旧系统的平均 MWT 为 5 小时,方差为 0.68。考虑与新系统相关的平均 MWT 差异的 95%置信区间估计。假设方差不变。间隔是多少?按此顺序减去(新系统—旧系统)。

查看此处获得寻找两个独立样本的置信区间的完整教程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

置信区间=平均值+/- t 分数标准误差(见上文)***

均值=新均值-旧均值= 3–5 =-2

给定 df = 18(20–2)和 95%的置信区间,t 得分= 2.101

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

标准误差= sqrt((0。⁶ 9+0.⁶⁸ 9)/(10+10–2)) sqrt(1/10+1/10)
标准误差= 0.352
*

置信区间= [-2.75,-1.25]

40.为了进一步测试医院的分流系统,管理员选择了 200 个晚上,随机分配了一个新的分流系统用于 100 个晚上,一个标准系统用于其余的 100 个晚上。他们计算了每晚看医生的平均等待时间(MWT)。新系统的平均 MWT 为 4 小时,标准偏差为 0.5 小时,而旧系统的平均 MWT 为 6 小时,标准偏差为 2 小时。考虑与新治疗相关的平均 MWT 降低的假设。相对于这一假设,方差不等的 95%独立组置信区间说明了什么?(因为每组有如此多的观察值,所以用 Z 分位数代替 t 分位数。)

假设我们按照这个顺序减去(新系统—旧系统):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两个独立样本的置信区间公式

均值=新均值-旧均值= 4–6 =-2

z 得分= 1.96 95%的置信区间

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

st. error = sqrt((0。⁵ 99+ 99)/(100+100–2)) sqrt(1/100+1/100)
标准差= 0.205061
下界=-2–1.96 * 0.205061 =-2.40192
上界= -2+1.960.205061 = -1.59808**

置信区间= [-2.40192,-1.59808]

参考

【1】中心极限定理,定义及例题步骤简单统计如何

[2] 电力,统计,维基

【3】人择原理,百科

[4] 实验设计,维基百科

[5] 根本原因分析,百科

感谢阅读!

如果您喜欢这篇文章,请务必点击 订阅此处 或至我的 独家快讯 千万不要错过另一篇关于数据科学指南、技巧和提示、生活经验等的文章!

更多相关文章

*** [## 亚马逊的数据科学家面试实践问题

一些亚马逊面试问题的演练!

towardsdatascience.com](/amazon-data-scientist-interview-practice-problems-15b9b86e86c6) [## 微软数据科学面试问答!

微软面试中一些数据科学问题的演练

towardsdatascience.com](/microsoft-data-science-interview-questions-and-answers-69ccac16bd9b) [## 更多微软数据科学面试问题和答案

微软面试中一些数据科学问题的另一个演练

towardsdatascience.com](/more-microsoft-data-science-interview-questions-and-answers-f9ee8337072c) [## 谷歌的数据科学面试脑筋急转弯

作为谷歌数据科学面试的一部分,他们喜欢问一些他们称为“解决问题”的问题…

towardsdatascience.com](/googles-data-science-interview-brain-teasers-7f3c1dc4ea7f) [## 数据科学家的 5 个常见 SQL 面试问题

帮助您发展 SQL 技能,在任何面试中胜出

towardsdatascience.com](/5-common-sql-interview-problems-for-data-scientists-1bfa02d8bae6)***

41 个问题来测试你对 Python 字符串的了解

原文:https://towardsdatascience.com/41-questions-to-test-your-knowledge-of-python-strings-9eb473aa8fe8?source=collection_archive---------0-----------------------

如何通过掌握字符串基础来碾压算法题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由本工程 RAEngUnsplash 上拍摄

我在 LeetCode 和 HackerRank 上做算法题的时候已经开始跟踪最常用的函数了。

成为一名优秀的工程师并不是要记住一门语言的功能,但这并不意味着它没有帮助。尤其是在面试中。

这是我的字符串 cheatsheet 转换成一个问题列表来测试自己。虽然这些不是面试问题,但是掌握这些将帮助您更轻松地解决现场编码问题。

你对 Python 字符串了解多少?

1.如何确认两个字符串具有相同的身份?

如果两个名字指向内存中的同一个位置,is操作符返回True。这就是我们谈论身份时所指的。

不要把is==,混淆,后者只测试平等性。

animals           = ['python','gopher']
more_animals      = animalsprint(animals == more_animals) #=> True
print(animals is more_animals) #=> Trueeven_more_animals = ['python','gopher']print(animals == even_more_animals) #=> True
print(animals is even_more_animals) #=> False

请注意上面的animalseven_more_animals虽然相等,但身份却不同。

此外,id()函数返回与名称相关联的内存地址的id。具有相同身份的两个对象将返回相同的id

name = 'object'
id(name)
#=> 4408718312

2.如何检查字符串中的每个单词是否以大写字母开头?

istitle()函数检查每个单词是否大写。

print( 'The Hilton'.istitle() ) #=> True
print( 'The dog'.istitle() ) #=> False
print( 'sticky rice'.istitle() ) #=> False

3.检查字符串是否包含特定的子字符串

如果一个字符串包含子串,in操作符将返回True

print( 'plane' in 'The worlds fastest plane' ) #=> True
print( 'car' in 'The worlds fastest plane' ) #=> False

4.在字符串中查找子字符串第一次出现的索引

有两个不同的函数将返回起始索引,find()index()。他们的行为略有不同。

如果没有找到子串,则find()返回-1

'The worlds fastest plane'.find('plane') #=> 19
'The worlds fastest plane'.find('car') #=> -1

index()会抛出一个ValueError

'The worlds fastest plane'.index('plane') #=> 19
'The worlds fastest plane'.index('car') #=> ValueError: substring not found

5.计算字符串中的字符总数

len()将返回一个字符串的长度。

len('The first president of the organization..') #=> 19

6.计算字符串中特定字符的个数

count()将返回特定字符出现的次数。

'The first president of the organization..'.count('o') #=> 3

7.将字符串的第一个字符大写

使用capitalize()功能来完成此操作。

'florida dolphins'.capitalize() #=> 'Florida dolphins'

8.什么是 f 弦,你如何使用它?

f 字符串是 python 3.6 中的新特性,它使得字符串插值变得非常容易。使用 f 弦类似于使用format()

f 弦在开盘价前用一个f表示。

name = 'Chris'
food = 'creme brulee'f'Hello. My name is {name} and I like {food}.'
#=> 'Hello. My name is Chris and I like creme brulee'

9.在字符串的特定部分搜索子字符串

index()还可以提供可选的开始和结束索引,用于在更大的字符串中进行搜索。

'the happiest person in the whole wide world.'.index('the',10,44)
#=> 23

注意上面是如何返回23而不是0

'the happiest person in the whole wide world.'.index('the')
#=> 0

10.使用 format()将变量插入字符串

format()类似于使用 f 弦。虽然在我看来,它对用户不太友好,因为变量都是在字符串的末尾传入的。

difficulty = 'easy'
thing = 'exam''That {} was {}!'.format(thing, difficulty)
#=> 'That exam was easy!'

11.检查字符串是否只包含数字

如果所有字符都是数字,则isnumeric()返回True

'80000'.isnumeric() #=> True

注意标点符号不是数字。

'1.0'.isnumeric() #=> False

12.拆分特定字符上的字符串

split()函数将在给定的一个或多个字符上拆分一个字符串。

'This is great'.split(' ')
#=> ['This', 'is', 'great']'not--so--great'.split('--')
#=> ['not', 'so', 'great']

13.检查字符串是否全部由小写字符组成

仅当字符串中的所有字符都是小写时,islower()才返回True

'all lower case'.islower() #=> True
'not aLL lowercase'.islower() # False

14.检查字符串中的第一个字符是否小写

这可以通过在字符串的第一个索引上调用前面提到的函数来完成。

'aPPLE'[0].islower() #=> True

15.Python 中的字符串可以加整数吗?

在一些语言中这是可以做到的,但是 python 会抛出一个TypeError

'Ten' + 10 #=> TypeError

16.反转字符串“hello world”

我们可以将字符串拆分成一个字符列表,反转列表,然后重新组合成一个字符串。

''.join(reversed("hello world"))
#=> 'dlrow olleh'

17.将一系列字符串合并成一个字符串,用连字符分隔

Python 的join()函数可以连接列表中的字符,在每个元素之间插入一个给定的字符。

'-'.join(['a','b','c'])
#=> 'a-b-c'

18.检查字符串中的所有字符是否都符合 ASCII

如果字符串中的所有字符都包含在 ASCII 码中,isascii()函数返回True

print( 'Â'.isascii() ) #=> False
print( 'A'.isascii() ) #=> True

19.整个字符串大写或小写

upper()lower()返回所有大写和小写的字符串。

sentence = 'The Cat in the Hat'sentence.upper() #=> 'THE CAT IN THE HAT'
sentence.lower() #=> 'the cat in the hat'

20.字符串的第一个和最后一个大写字符

像在过去的例子中一样,我们将针对字符串的特定索引。Python 中的字符串是不可变的,所以我们将构建一个全新的字符串。

animal = 'fish'animal[0].upper() + animal[1:-1] + animal[-1].upper()
#=> 'FisH'

21.检查字符串是否全部大写

类似于islower()isupper()仅在整个字符串大写时返回True

'Toronto'.isupper() #=> False
'TORONTO'.isupper() #= True

22.什么时候使用 splitlines()?

splitlines()在换行符处拆分字符串。

sentence = "It was a stormy night\nThe house creeked\nThe wind blew."sentence.splitlines()
#=> ['It was a stormy night', 'The house creeked', 'The wind blew.']

23.举一个字符串切片的例子

分割一个字符串需要 3 个参数,string[start_index:end_index:step]

step是字符应该返回的间隔。所以步长 3 将在每第三个索引处返回字符。

string = 'I like to eat apples'string[:6] #=> 'I like'
string[7:13] #=> 'to eat'
string[0:-1:2] #=> 'Ilk oetape' (every 2nd character)

24.将整数转换为字符串

为此使用字符串构造函数str()

str(5) #=> '5'

25.检查字符串是否只包含字母表中的字符

如果所有字符都是字母,则isalpha()返回True

'One1'.isalpha()
'One'.isalpha()

26.替换字符串中子字符串的所有实例

不导入正则表达式模块,可以使用replace()

sentence = 'Sally sells sea shells by the sea shore'sentence.replace('sea', 'mountain')
#=> 'Sally sells mountain shells by the mountain shore'

27.返回字符串中的最小字符

大写字符和字母表中较早的字符具有较低的索引。min()将返回索引最低的字符。

min('strings') #=> 'g'

28.检查字符串中的所有字符是否都是字母数字

字母数字值包括字母和整数。

'Ten10'.isalnum() #=> True
'Ten10.'.isalnum() #=> False

29.移除字符串左侧、右侧或两侧的空白

lstrip()rstrip()strip()删除字符串末尾的空格。

string = '  string of whitespace    '
string.lstrip() #=> 'string of whitespace    '
string.rstrip() #=> '  string of whitespace'
string.strip() #=> 'string of whitespace'

30.检查字符串是以特定字符开头还是结尾?

startswith()endswith()检查字符串是否以特定的子字符串开始和结束。

city = 'New York'city.startswith('New') #=> True
city.endswith('N') #=> False

31.将给定的字符串编码为 ASCII

encode()用给定的编码对字符串进行编码。默认为utf-8。如果一个字符不能被编码,那么抛出一个UnicodeEncodeError

'Fresh Tuna'.encode('ascii')
#=> b'Fresh Tuna''Fresh Tuna Â'.encode('ascii')
#=> UnicodeEncodeError: 'ascii' codec can't encode character '\xc2' in position 11: ordinal not in range(128)

32.检查所有字符是否都是空白字符

isspace()仅当字符串完全由空格组成时才返回True

''.isspace() #=> False
' '.isspace() #=> True
'   '.isspace() #=> True
' the '.isspace() #=> False

33.一个字符串乘以 3 是什么效果?

该字符串被连接在一起 3 次。

'dog' * 3
# 'dogdogdog'

34.将字符串中每个单词的第一个字符大写

title()将字符串中的每个单词大写。

'once upon a time'.title()

35.连接两个字符串

附加运算符可用于连接字符串。

'string one' + ' ' + 'string two' 
#=> 'string one string two'

36.举一个使用 partition()函数的例子

partition()在子字符串的第一个实例上拆分字符串。返回拆分字符串的元组,但不移除子字符串。

sentence = "If you want to be a ninja"print(sentence.partition(' want '))
#=> ('If you', ' want ', 'to be a ninja')

37.Python 中字符串不可变是什么意思?

string 对象一旦创建,就不能更改。“修改”该字符串会在内存中创建一个全新的对象。

我们可以用id()函数来证明。

proverb = 'Rise each day before the sun'
print( id(proverb) )
#=> 4441962336proverb_two = 'Rise each day before the sun' + ' if its a weekday'
print( id(proverb_two) )
#=> 4442287440

串联‘ if its a weekday’在内存中用新的id创建一个新的对象。如果对象实际上被修改了,那么它会有相同的id

38.定义一个字符串两次(与两个不同的变量名相关联)会在内存中创建一个还是两个对象?

比如写animal = 'dog'pet = 'dog'

它只会创造一个。我第一次遇到它时就发现这不直观。但这有助于 python 在处理大字符串时节省内存。

我们将用id()来证明这一点。注意两者有相同的id

animal = 'dog'
print( id(animal) )
#=> 4441985688pet = 'dog'
print( id(pet) )
#=> 4441985688

39.举一个使用 maketrans()和 translate()的例子

maketrans()创建从字符到其他字符的映射。然后应用这个映射来翻译字符串。

# create mapping
mapping = str.maketrans("abcs", "123S")# translate string
"abc are the first three letters".translate(mapping)
#=> '123 1re the firSt three letterS'

注意上面我们是如何改变字符串中每个abcs的值的。

40.从字符串中删除元音

一种选择是通过列表理解来迭代字符串中的字符。如果它们与一个元音不匹配,那么将它们重新组合成一个字符串。

string = 'Hello 1 World 2'vowels = ('a','e','i','o','u')''.join([c for c in string if c not in vowels])
#=> 'Hll 1 Wrld 2'

41.什么时候使用 rfind()?

rfind()类似于find(),但是它从字符串的右边开始搜索,并返回第一个匹配的子字符串。

story = 'The price is right said Bob. The price is right.'
story.rfind('is')
#=> 39

结论

正如我经常向一位老产品经理解释的那样,工程师不是存储方法的字典。但是有时候少点谷歌可以让编码更加无缝和有趣。

我希望你粉碎了这个。

如果你觉得太容易了,你可能会对我的另一篇文章感兴趣, 54 个 Python 面试问题

45 对 KMeans 和 KMedoids 无监督学习聚类的广泛研究的观察

原文:https://towardsdatascience.com/45-observations-of-an-extensive-study-of-kmeans-and-kmedoids-unsupervised-learning-clustering-41da9b254712?source=collection_archive---------50-----------------------

在数据集中发现模式或聚类是人类智能的基本能力之一。如果我们要接近或超过人类的智能,我认为它必须是半监督学习,或者更好的是,无监督学习。我对选择无监督学习聚类模型的“最佳实践”并不满意。利用机器学习框架 Photonai ,我们探索了 KMeansKMetroids 集群模型**的异同。*我们改变聚类数、每个聚类的点数、聚类大小和目标聚类形状。最后,我们尝试在一个“真实世界”*数据集上进行聚类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

k 是指以各种细胞计数密度对细胞(小球形斑点)进行计数。50 和 300 个细胞的细胞计数为-2%。1000 个细胞的细胞计数为+6.5%。瑞秋·科特曼的动画

k 均值k 均值聚类模型比较的目的

理解、评估和利用已识别聚类的最基本步骤是对它们进行定量比较。—来自

[## 以元素为中心的聚类比较统一了重叠和层次

聚类是理解复杂数据的最通用的方法之一。集群的一个关键方面…

www.nature.com](https://www.nature.com/articles/s41598-019-44892-y)

上面的引用触及了我们为什么从比较kme meansKMedoids 集群开始的核心。

我们可以一起对广泛的 KMeansKMetroids 星团模型进行广泛的成对研究。我们想要观察这些聚类模型之间的差异和相似之处。

此外,我们希望在未来用其他聚类模型完成类似的广泛研究。我们尝试回答以下任何一个问题。

  • 我们能开发一个区分每个聚类模型的观察结果的“备忘单”吗?
  • 我们能否查看数据并缩小我们应该使用的聚类模型的选择范围?
  • 在我们研究的某个阶段,我们能找到一个元算法或一套规则来选择一个聚类模型吗?
  • 我们的研究能指导我们得到更好的聚类模型吗?

我们的答案可能是 对这些问题的部分或全部 不。然而,我们不会放弃;无监督学习聚类模型是一个活跃的研究领域。

我们将一起探讨这些问题。让我们看看我们走了多远。

什么是集群?

“恩恩德的伯德和色弗洛克和弗赖在一起。——威廉·特纳(公元 1545 年)《拯救罗米什·福克斯》

物以类聚,人以群分。(近似现代英语翻译)

根据相似性将事物分成不同的组是一种古老的能力。它可能早于自我意识,因为史前生命会对太阳不太阳做出反应,然后不吃。

通常(也许总是),聚类是一个无监督的机器学习问题。数据没有标签(无监督)来将数据点划分为聚类。

聚类通过数据特征的相似性来区分。

我们需要一个例子!好吧,狗、猫和灰鲸怎么样。我们最初的猜测是有三个不同的集群。

如果你有两个特征:长度和体重,那么狗和猫的数据点聚类由于高度重叠而不明显。在猫狗群里,大型犬也有异常值。(好吧,我猜狮子可以算是大型家猫。)数据点的灰鲸群集明显地与狗-猫群集分开。

据我所知,任何聚类模型都会找到两个聚类。

你可能会说:错了!如果你这样做了,那是因为你使用了比长度和重量更多的特征来区分一群猫和一群狗。

想象一个二维图,其中纵轴是长度测量值,横轴是重量测量值。您可能会得到两个不同的聚类,其中成对的点(任意两点的对)距离是数据点的二维(2-D)向量长度,坐标为长度和权重。

你可能想在狗-猫-灰鲸聚类任务中使用缩放。(我们稍后将讨论缩放。).然而,如果长度和重量都放在一个范围从 0.0 到 1.0 的单位轴上,它仍然不会将狗-猫聚类分开。

例如,如果我们有细菌、老鼠和灰鲸,以及两个特征:长度和重量,我们将得到不同的集群(在双对数图上)。

观察#1:为您的聚类选择一组可测量的区别特征是至关重要的。

观察#2:(有时)如果你改变可测量的特征的数量,你就改变了你观察的集群的数量。

注意:观察#2 不是一个“硬性规定”。在上面的两个例子中,您能想到哪些特性会或不会创建更多的集群吗?

注:之所以称之为 无监督 学习,是因为你应该而不是监督 学习。没有监督,在某种程度上, 没有 很难做到。如果你以任何方式监督,*,*你可以引入隐藏的偏见和假设。

例如,将对象聚类成不是一个比萨饼切片严重偏向于特征选择,以至于它是监督的学习,即使你使用传统的非监督的模型。

观察#3:从一组可衡量的显著特征开始。聚类之后,在改变可测量的特征时要小心。这可能是监督,应该记录下来。

注意:在两个阵营中有一个很大的争论,我称之为"实干"阵营和"纯粹主义"阵营。在这篇文章中,我使用了“纯粹主义者”的 camp 方法。然而,我有时会在现实世界或游戏竞赛中加入“努力完成”阵营。我(试图)用前者来证明我的假设。

欢迎你采用你自己的立场作为“完成”“纯粹主义者”或者其他完全不同的阵营。

什么是相似?

我们可以引入术语相似度,它(通常)是两个数据点(对)之间的距离。在上面的例子中,每个数据点都是测量的长度和重量。

我们发现,根据*相似性的定义,*即数据点对越接近,它们具有越高的相似性分数。相距较远的数据点对具有较低的相似性得分。

观察#4:如果相似度是两个数据点之间距离的度量,那么我们就不能使用范畴特征。分类值的值是不明确的。

星期一离星期二有一天的距离还是六天的距离?a 卡是 0 还是 1 还是 11 还是最高?这取决于你玩的游戏。

注意:在以后的文章中,我们将发现将分类特征转换成连续特征的方法。我们还将讨论将连续特征转换为分类特征的方法。

他们定义聚类模型距离的方式不同吗?

是的,有不同的方法来定义距离。如何定义或测量数据点之间的距离通常决定了分类模型。

对于本文,我们使用欧几里德距离,距离= sqrt(x + y)。

k - < x >系列,其中 KMeansKMedoids 是其成员,要求距离不同。如果是差异的,那么优化器会使 k - < x >系列成为现有的执行速度最快的集群模型之一。

注意:k 表示有多种变化。如 KMedian ,组成 k - < x >家族。

注意:微分是微积分的一部分。理解这篇文章的任何部分都不一定要知道区分的机制。有许多优化版本的 k - < x >系列,你不需要关心实现。

注意:我们在这项研究中集中使用 k - < x >家系。

什么是休伯特和阿拉比调整后的兰德指数(HAARI)?

我们在预测的数据点聚类标签和实际的“真实的”数据点聚类标签之间测量聚类算法的“优度”。

数据点标签数量正确预测T30地面数据点标签数量之比就是精度*。*

*accuracy* = (*correct-predicted)/ground-truth*

我们测量聚类标签的预测有多好。尽管如此,无监督的学习,因为我们不是用基本事实标签训练聚类模型。

我们需要一个比数据点分配(准确性)更好的度量来比较聚类结果。我们可以使用的第一个指标是休伯特和阿拉比调整后的兰德指数(HAARI)

k-家族和 HAARI 有三个已知的偏差(违反已知的真实世界条件) :

  1. 一个数据点只能位于一个群集中;
  2. 每个聚类中的数据点数量必须相同;
  3. 并且每个簇必须具有相同的大小。

用人工数据集创建者,make-blobs

  1. 每个数据点被分配给一个聚类;
  2. 每个聚类可以具有相同数量的数据点;
  3. 并且每个簇具有相同的大小。

在一个调用配置中使用make-blobs,,我们不会陷入 HAARI 的偏差陷阱。然而,使用make-blobs,使用不同的调用配置,我们会违反偏差#2 和#3…

HAARI精度中减去给定聚类的数据点随机分配。HAARI 使用超几何分布作为随机性(噪声)的模型。

注意:使用超几何分布,假设基础数据点分布近似为高斯形状。自然过程产生的数据的良好近似值,其数据点计数相对大于聚类计数 20 倍或更高。换句话说,如果每个聚类至少有二十个数据点。(中心极限定理)。

* [## 用 Python 解释超几何分布

数学课上的概率问题,你需要的概率要么给你,要么相对容易…

towardsdatascience.com](/hypergeometric-distribution-explained-with-python-2c80bc613bf4)

想象掷一枚硬币,它的边数不是 2 而是当前的簇数。抛硬币。它着陆,面朝上的一侧是分配的群集标签。

注意:如果一便士是两面的(抵制一个糟糕的双关语),那么超几何分布就变成了二项式解。

总之, HAARI 是测量预测聚类标签的“优度”与减去了“随机噪声”**的“真实值”聚类标签的比率。警告:如果哈里的已知偏差不适用。

注意: HAARI 范围在 0.0(随机)到 1.0(完美)之间。

注意:其他 xARIs 使用其他随机性分布。

注意: HAARI 分数可能会因随机分配的种子而略有不同。

你可以在这里详细阅读关于 HAARI 的

注:*sklearn.metrics.ari*不执行休伯特和阿拉比调整后的兰德指数( HRARI )

什么是以元素为中心的相似性(ECS)聚类指标?

一种纠正聚类比较中偏差的方法是在聚类的随机集合的背景下考虑聚类相似性。这种机会纠正使用由随机模型指定的聚类之间所有成对比较的预期相似性来建立基线相似性值。然而,机会修正方法有严重的缺点 : (i) 它强烈依赖于为聚类假设的随机模型的选择,这通常是高度不明确的,以及(ii) 没有提出用于重叠或分层聚类的随机模型…来自

[## 以元素为中心的聚类比较统一了重叠和层次

聚类是理解复杂数据的最通用的方法之一。集群的一个关键方面…

www.nature.com](https://www.nature.com/articles/s41598-019-44892-y)

上面的引用来自发明 HAARI 的一些人。他们提出了一个比 HAARI 更健壮的聚类指标,这并不奇怪。

我将这个新的度量标准称为 ECS。

以元素为中心的相似性( ECS )聚类度量比 HAARI 具有更少的偏差。当我们使用make-blobs时,当我们没有触发 HAARI 偏差,因此 HAARI 产生的分数应该接近 ECS 分数

观察#5:群集度量 ECSHAARI 具有更少的偏差,并且据报告 **更好。T39

注意:25 个聚类指标需要标签,超过 5 个聚类指标不需要标签。一个优秀的计算集群度量的软件包是 clusim

注意:在此讨论中,我们仅使用 HAARIECS

什么是make-blobs

我在回避一个有如下描述的数学。make-blobs创造n_features (or n_cluster),以N为中心。每个中心用n_samples (or n_data_points).创建一个数据点集群,每个点从中心以随机距离分布,随机距离选自标准偏差为cluster_std.的高斯(正态)分布

注:也许我应该用一个方程来解释?

注意:聚类中心的距离选自具有较大标准差(std)的高斯(正态)分布。

注意:距离= sqrt(x + y)

我们也可以用三个例子来回答make-blobs创造了什么。

  1. 没有每簇不同数据点的k-族和 HAARI 偏差的触发。下面对make-blobs的调用有 21 个集群,每个集群的标准差为 1.0,有 30 个数据点。
*from sklearn.datasets import make_blobs

data_X, data_y= make_blobs(n_samples=30, n_features=21, cluster_std=1.0, random_state=0)*

2.触发每簇不同数据点计数的k - < x >族和 HAARI 偏差。下面对make-blobs的调用有 3 个集群。第一个聚类的数据点数为 3,第二个聚类的数据点数为 30,第三个聚类的数据点数为 300。这 3 个聚类每个都有 1.0 的标准偏差。

*from sklearn.datasets import make_blobs

data_X, data_y= make_blobs(*n_samples=[3,30,300]*, n_features=3, cluster_std= 1.0, random_state=777)*

3.触发不同簇大小的k - < x >族和 HAARI 偏置。下面对make-blobs的调用有 3 个集群。第一个聚类的标准偏差为 0.3,第二个聚类的标准偏差为 0.66,第三个聚类的标准偏差为 1.0。每个集群中有 300 个数据点。

*from sklearn.datasets import make_blobs

data_X, data_y= make_blobs(n_samples=300, n_features=3, cluster_std=[0.3, 0.66, 1.0], random_state=777)*

注意:我们将处理人工数据和真实世界测量数据。在这两种情况下,聚类标签是已知的。

稍后我们将深入探讨kme meansKMedoids 模型的方式(或许还有一点原因)。

现在,让我们找点乐子。

让我们通过以下方式来探索k 方法k 方法

  1. 改变聚类的数量,并改变每次运行的数据点的数量。对于每次运行,每个聚类都有相同数量的数据点。我们不应该引发一个 k - < x >家族或者 HAARI 的偏见;
  2. 改变集群大小;我们触发了 k - < x >族和 HAARI 偏置,即每个簇必须具有相同的大小;
  3. *并且将簇的形状从圆形改变为椭圆形。给定"*distance = sqrt(x+y)"measure 预测球状星团,我们会触发隐藏偏差吗?

改变每个聚类的数据点的数量和改变圆形聚类(斑点)的数量对聚类算法 KMeans 和 KMedoids 的影响

我们来看看kme meansKMedoids 在改变数据点数量和聚类数量方面的表现。标准偏差( std )在第 1 和第 2 个动画图中为 0.3 std ,在第 3 和第 4 个动画图中为 1.0 std 。人造数据点是由make-blob创造的。

注意:std 决定了所形成的集群的包络的大小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

k 表示聚类,其中改变每个聚类的固定数据点*,用于 std = 0.3 的 3 个聚类。瑞秋·科特曼的动画*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于 std = 0.3 的 3 个聚类,v 改变每个聚类的固定数据点计数的k 均值聚类表。

观察# n(1):k 意味着:数据点计数越高,斑点越圆。

簇中的点越多,由make-blobs创建的簇的圆形包络就越多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图中的k 表示对于 std = 0.3 的 21 个聚类,改变每个聚类的固定数据点计数。动画由 雷切尔·科特曼

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于 std = 0.3 的 21 个聚类,k 表示 聚类,改变每个聚类的固定数据点 t 计数。

观察# n1:k 意味着:数据点计数越高,斑点越圆。

观察# N2:k 均值:3 和 21 个聚类,std = 0.3,我们看到圆形聚类的良好分离,没有共享数据点。

注意:由于没有偏差触发,我们预计大小为std = 0.3k 均值HAARIECS 得分接近 1.0。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图中的k 表示对于 std = 1.0 的 3 个聚类,改变每个聚类的固定数据点数进行聚类。动画由 雷切尔·科特曼

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

*表*k 表示 聚类,对于 std = 1.0 的 3 个聚类,改变每个聚类的固定数据点计数

观察# n3:k 意味着形状偏离圆形,簇重叠越多。

观察#n4: 对于重叠的聚类,KMeans 的 HAARI 和 ECS 分数低于 1.0。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图中的k 表示 聚类,对于 std = 1.0 的 21 个聚类,改变每个聚类的固定数据点计数。动画由 雷切尔·科特曼 制作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

*表*k 均值 聚类,对于 std = 1.0 的 21 个聚类,改变每个聚类的固定数据点计数。

观察# n3:k 表示形状偏离圆形。群集重叠越多。

观察#n4: KMeans 在聚类计数正确时,对于重叠的聚类,其 HAARI 和 ECS 得分低于 1.0。

**观察# n5:k 均值具有 HAARI,并且当每个聚类计数的数据点为 21 时,ECS 分数低于 1.0。

观察#n6: 当每个聚类计数的数据点为 30 或更大时,k 均值的 HAARI 和 ECS 分值的值等于 0.1%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMediods 聚类,其中改变 std = 0.3 的 3 个聚类的每个聚类的固定数据点计数。瑞秋·科特曼的动画

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMediods 聚类表,对于 std = 0.3 的 3 个聚类,改变每个聚类的固定数据点计数。

观察#n7:当聚类被很好地分离并且不重叠时,KMedoids 具有 1.0 的 HAARI 和 ECS。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMediods聚类,对于 std = 1.0 的 3 个聚类,改变每个聚类的固定数据点计数。动画由 雷切尔·科特曼 制作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMedoids 聚类表,针对 std = 1.0 的 3 个聚类,改变每个聚类的固定数据点计数。

观察#n8: KMedoids 当聚类没有很好地分离和重叠时,HAARI 和 ECS 得分低于 1.0

我们可以理解较低的 HAARIECS 分数,因为 KMedoids 从数据集中选择质心。每个聚类的数据点计数越低,一个聚类具有也是该聚类的理想中间点的数据点的概率就越低。(仅对称形状的簇。)

观察#n9: KMedoids 有 HAARI 和 ECS 的值相差 1.5%到 7%。

推理同 观察#n(13)。 KMedoids 从数据集中选择一个质心。每个聚类的数据点计数越低,一个聚类具有也是该聚类的理想中间点的数据点的概率就越低。(仅对称形状的簇。)

观察#n10: KMedoids: T 数据点计数范围左端的低点计数效应和数据点计数范围右端的聚类重叠似乎为 ECS 分数彼此平衡。

我们观察到,随着数据点计数的增加, HAARI 低于 ECS,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMediods 聚类,其中改变 std = 0.3 的 21 个聚类的每个聚类的固定数据点计数。瑞秋·科特曼制作的动画

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMedoids 聚类,每个聚类的数据点计数不同,有 21 个聚类,std = .3。瑞秋·科特曼的动画

观察#n11: KMeans 聚类模型,std =0.3,具有比 KMedoids ,std =0.3,聚类模型更高的 HAARI 和 ECS 分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMediods 聚类,其中改变 std = 1.0 的 21 个聚类的每个聚类的固定数据点计数。由瑞秋·科特曼制作的动画

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMedoids 聚类表,对于 std = 1.0 的 21 个聚类,改变每个聚类的固定数据点计数。

观察#n12: KMeans 聚类模型,std =1.0,具有比 KMedoids ,std =1.0,聚类模型更高的 HAARI 和 ECS 分数。

观察 n13:对于 KMeans 和 KMediods 聚类模型,数据点越多,聚类计数对实际聚类计数越好,因此 HAARI 和 ECS 得分越高。

当有监督和无监督的机器学习被给予更多的数据点时,就有了更好的模型来预测未来的数据点。

观察#n14: KMeans 似乎比 KMedoids 有更高的 HAARI 和 ECS 分数。

如果**【n14】**的观测成立,我们将发现其他扰动,如星团的大小和形状。

各种圆形斑点簇大小对模型 KMeans 和 KMedoids 的影响。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表示对于基数 std=0.25 的 21 个集群,使用各种圆形斑点集群大小进行集群。瑞秋·科特曼的动画

聚类标准偏差(小标准偏差)为[0.2,0.45,0.55,0.63,0.7,0.75,0.84,0.86,0.91,. 95,1.0,1.03,1.07,1.10,1.14,1.17,1.2,1.23,1.26,1.29,1.32],导致不同的聚类大小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于基数 std=0.25 的 21 个聚类,具有各种圆形斑点聚类大小的k 均值聚类表。

**观察# S1:不同大小的簇上的 KMeans 比固定大小的簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表示对于基数 std=0.50 的 21 个聚类,使用各种圆形斑点聚类大小进行聚类。瑞秋·科特曼的动画

聚类标准偏差是:[0.2,0.7,0.90,1.06,1.2,1.31,1.42,1.52,1.61,1.7,1.78,1.85,1.93,2.00,2.07,2.13,2.2,2.26,2.32,2.379,2.43]导致不同的聚类大小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**观察# S1:不同大小的簇上的 k 均值比固定大小的簇上的 k 均值具有更低的 HAARI 和 ECS 分数。

**观察# S2:较大的不同大小的簇上的 k 均值比较小的不同大小的簇上的 k 均值具有较低的 HAARI 和 ECS 分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMediods 对于基数 std=0.25 的 21 个聚类,使用各种圆形斑点聚类大小进行聚类。瑞秋·科特曼的动画

聚类标准偏差为 n_cluster_std [0.2,0.45,0.55,0.63,0.7,0.75,0.84,0.86,0.91,0.95,1.0,1.03,1.07,1.10,1.14,1.17,1.2,1.23,1.26,1.29,1.32],导致不同的聚类大小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基 std=0.25 的 21 个聚类的具有各种圆形斑点聚类大小的 KMediods 聚类表。

观察#s3: 不同大小的簇上的 kmediod 比固定大小的簇上的 kmediod具有更低的 HAARI 和 ECS 分数。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对基数 std=0.50 的 21 个聚类进行具有各种圆形斑点聚类大小的 KMediods 聚类。瑞秋·科特曼的动画

注意:标题框不正确。对于N_points = 3, CLUSTERS_FOUND =19; N_points = 30, CLUSTERS_FOUND =21; N_points = 100, CLUSTERS_FOUND =15; N_points = 300, CLUSTERS_FOUND =17.

聚类标准偏差[0.2,0.7,0.90,1.06,1.2,1.31,1.42,1.52,1.61,1.7,1.78,1.85,1.93,2.00,2.07,2.13,2.2,2.26,2.32,2.38,2.43]导致不同的聚类大小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基 std=0.50 的 21 个聚类的具有各种圆形斑点聚类大小的 KMediods 聚类表。

观察#s3: 不同大小的簇上的 kmediod 比固定大小的簇上的 kmediod 具有更低的 HAARI 和 ECS 分数。

观察# S4:**不同大小的簇上的较大的 kme dids 具有比较小的不同大小的簇上的kme dids更低的 HAARI 和 ECS 分数。**

每个椭圆形斑点的不同数量的数据点对聚类模型 k 均值和 k 均值的影响

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数字k 表示对于 std = 0.3 的 3 个聚类,每个椭圆聚类的数据点计数变化*。瑞秋·科特曼的动画*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**表中的k 表示对于 std = 0.3 的 3 个群,每个椭圆群具有不同的数据点计数

观察#e1: 椭圆形聚类上的 k 均值将一些数据点分配给错误的聚类。**

观察#e2: 椭圆形簇上的 KMeans 比圆形相同大小簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。

观察#e1 和观察#e2 源于基于距离的相似性,导致导出的聚类的圆形包络以质心为中心。

观察# E3:k 均值聚类随着预测的聚类形状偏离圆形而退化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

k 表示对于 std = 0.3 的 21 个群,每个椭圆群的数据点数不同*。瑞秋·科特曼的动画*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于 std = 0.3 的 21 个集群,每个椭圆集群具有不同数据点计数的k 均值表。

观察#e1: 椭圆形聚类上的 k 均值将一些数据点分配给错误的聚类。**

观察#e2: 椭圆形簇上的 KMeans 比圆形相同大小簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。

观察# E3:k 均值随着集群形状偏离圆形而退化。

观察#e4: 计数为 21 的椭圆形簇上的 KMeans 比计数为 3 的较大椭圆形簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**数字k 表示对于 std =1.0 的 3 个群,每个椭圆群具有不同的数据点计数。动画由 雷切尔·科特曼 制作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

k 均值* 对于 std =1.0 的 3 个聚类,每个椭圆聚类具有不同的数据点计数*

观察#e1: 椭圆形聚类上的 k 均值将一些数据点分配给错误的聚类。**

观察#e2: 椭圆形簇上的 KMeans 比相同大小的圆形簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。

观察# E3:k 均值聚类随着聚类形状偏离圆形而退化。

观察#e5: 椭圆形簇上的 KMeans 比更大尺寸的椭圆形簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。

观察#e6: KMeans 对具有三个数据点的椭圆形聚类预测了错误的聚类数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图k 表示对于 std = 1.0 的 21 个群,每个椭圆群具有不同的数据点数 动画作者 雷切尔·科特曼

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

k 均值* 对于 std = 1.0 的 21 个聚类,每个椭圆聚类具有不同的数据点计数*

观察#e1: 椭圆形聚类上的 k 均值将一些数据点分配给错误的聚类。**

观察#e2: 椭圆形簇上的 KMeans 比圆形相同大小簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。

观察# E3:k 均值聚类随着聚类形状偏离圆形而退化。

观察#e4: 具有 21 个聚类的椭圆形上的 k 均值比具有 3 个聚类的更大尺寸的椭圆形上的k 均值具有更低的 HAARI 和 ECS 分数。****

观察#e5: 椭圆形簇上的 KMeans 比更大尺寸的椭圆形簇上的 KMeans 具有更高的 HAARI 和 ECS 分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMedoids 对于 std = 0.3 的 3 个群,每个椭圆群具有不同的数据点计数。瑞秋·科特曼的动画

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于 std = 0.3 的 3 个集群,每个椭圆集群具有不同数据点计数的 KMedoids

观察#e7: 椭圆形聚类上的 KMediods 将一些数据点分配给错误的聚类。

观察#e8: 椭圆形簇上的 kme dids的 HAARI 和 ECS 分数低于圆形相同大小簇上的kme dids。****

观察#e9: KMediods 聚类随着聚类形状偏离圆形而退化。

观察#e10: 具有 3 个簇的椭圆形上的 KMediods 比具有 3 个簇的更大尺寸的椭圆形上的 KMediods 具有更高的 HAARI 和 ECS 分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMedoids 对于 std = 1.0 的 3 个聚类,每个椭圆聚类的数据点计数不同。瑞秋·科特曼的动画

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于 std = 1.0 的 3 个集群,每个椭圆集群具有不同数据点计数的 KMedoids 表。

观察#e7: 椭圆形聚类上的 KMediods 将一些数据点分配给错误的聚类。

观察#e8: 椭圆形簇上的 KMediods 比圆形、相同大小的簇上的kme ads具有更低的 HAARI 和 ECS 分数。**

观察#e9: KMediods 聚类随着聚类形状偏离圆形而退化。

观察#e10: 具有 3 个簇的椭圆形上的 KMediods 比具有 3 个簇的更大尺寸的椭圆形上的 KMediods 具有更高的 HAARI 和 ECS 分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于 std = 1.0 的 21 个群,图 KMedoids 具有每个椭圆群的不同数据点计数。瑞秋·科特曼的动画

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于 std = 1.0 的 21 个集群,每个椭圆集群具有不同数据点计数的 KMedoids

观察#e7: 椭圆形聚类上的 KMediods 将一些数据点分配到错误的聚类。

观察#e8: 椭圆形簇上的 KMediods 比圆形、相同大小的簇上的 Kmeans 具有更低的 HAARI 和 ECS 分数。

观察#e9: KMediods 聚类随着聚类形状偏离圆形而退化。

观察#e11: 具有 21 个团簇的椭圆形状上的 KMediods 比具有 3 个团簇的更大尺寸的椭圆形状上的 KMediods 具有更高的 HAARI 和 ECS 分数。

观察#e12: 椭圆形上的 kme dids具有比 KMeans 更低的 HAARI 和 ECS 分数。**

什么是 Photonai?

PhotonaiScikit-Learn 和其他机器学习(ML)或深度学习(DL)框架与一个统一的范例相结合。 Photonai 采用 Scikit-Learn 的 EstimatorTransformer类方法架构。

Photonai元素,Photonai 术语即的意思是EstimatorTransformer,通过将前学习器和后学习器算法转换成带有参数签名的元素来减少人工编码和错误。元素的例子是数据清理器、定标器、估算器、类平衡器、交叉验证器、超参数调谐器和集成的几种选择。

Photonai 的一个很酷的架构特性是,它提供了一种无代码的方式来添加元素(如果元素可被 Python 调用)。我添加了聚类算法sklearn.cluster.KMeanssklearn_extra.cluster.KMmediods

PCA, t-SNE, K-Fold(cross-validation), hyperopt (hyper-parameter tuning), and StandardScaler (scaling)已经是注册的元素,我们可以在机器学习框架 Photonai 中自由使用。

所有这些不同的机器学习技术,比如PCA, t-SNE, K-Fold...,在参考资料部分的文章中都有详细的讨论。

Photonai 具有registry.list_available_elements()功能,逐项列出 Photonai 中所有当前可用的 元素

*from photonai.base.photon_elements import PhotonRegistry
registry = PhotonRegistry(custom_elements_folder=custom_elements_folder)
registry.activate()registry.list_available_elements()output ==>
PhotonCore
ARDRegression      sklearn.linear_model.ARDRegression  Estimator
AdaBoostClassifier sklearn.ensemble.AdaBoostClassifier Estimator
.
.
PhotonCluster
KMeans            sklearn.cluster.KMeans               Estimator
KMedoids          sklearn_extra.cluster.KMedoids       Estimator*

在群集模型中控制我们基于光的研究

*CLUSTER_ALGO = 'KMedoids'

C_SHAPE ='ellipse'           # for cells C_SHAPE ='circle'
N_CLUSTERS = [21]            # for cells N_CLUSTERS = [50,300, 1000]
CLUSTERS_STD = 0.3           # for cells CLUSTERS_STD = 0.1
N_P_CLUSTERS = [3, 30, 300, 3000] # for cells N_P_CLUSTERS = [5]
INNER_FOLDS = 5
OUTER_FOLDS = 5*
  • CLUSTER_ALGO确定使用哪个聚类模型。
  • C_SHAPE确定聚类的形状和包含所有聚类的包络的形状。
  • N_CLUSTER确定生成的簇的数量。
  • CLUSTER_STD调节生成的簇的大小。
  • N_P_CLUSTERS调节每个聚类的数据点数量。
  • INNER_FOLDS确定进行超参数搜索的次数,这将产生由 t he 调整的 Rand 指数(ARI)确定的最佳超参数集。
  • OUTER_FOLDS决定 ARI 的 K 倍交叉验证这里 K 给定为OUTER_FOLDS.结果是 ARI 的均值std

*通过将INNER_FOLDSOUTER_FOLDS 设置为三或更大,我们更有信心优化 KMeans 和 **KMedoids 的拟合。*聚类模型针对每次INNER_FOLDS*OUTER_FOLDS运行进行了超参数优化。

K-fold 交叉验证(CV) 通过将数据划分为多个折叠,并确保每个折叠都作为一个测试集,为这个问题提供了一个解决方案。来自…

* [## k 倍交叉验证

评估机器学习模型可能非常棘手。通常,我们将数据集分成训练集和测试集…

medium.com](https://medium.com/datadriveninvestor/k-fold-cross-validation-6b8518070833)

这项研究使用的主要 Photonai 函数

本研究使用的所有代码都可以从 github 下载

def hyper_cluster(cluster_name):
    if C_SHAPE == 'ellipse' :
        yield_cluster = yield_parameters_ellipse
    else: 
        yield_cluster = yield_parameters

    n_p_clusters = N_P_CLUSTERS
    for data_X, data_y,n_cluster  in yield_cluster(n_p_clusters):
        simple_output('CLUSTER_ALGO:', CLUSTER_ALGO)
        simple_output('C_SHAPE:',C_SHAPE)
        simple_output('n_cluster:', n_cluster)
        simple_output('INNER_FOLDS:', INNER_FOLDS)
        simple_output('OUTER_FOLDS:', OUTER_FOLDS)        
        simple_output('n_points:', len(data_y))X = data_X.copy(); y =  data_y.copy()
        # DESIGN YOUR PIPELINE
        settings = OutputSettings(project_folder='./tmp/')

        my_pipe = Hyperpipe('batching',
                            optimizer='sk_opt',
        #                    optimizer_params={'n_configurations': 25},
                            metrics=['ARI', 'MI', 'HCV', 'FM'],
                            best_config_metric='ARI',
                            outer_cv=KFold(n_splits=OUTER_FOLDS),
                            inner_cv=KFold(n_splits=INNER_FOLDS),
                            verbosity=0,
                            output_settings=settings)my_pipe += PipelineElement(cluster_name, hyperparameters={
                                                           'n_clusters': IntegerRange(floor(n_cluster*.7)
                                                                                      , ceil(n_cluster*1.2)),
                                                            },random_state=777)logger.info('Cluster optimization range:',  floor(n_cluster*.7), ceil(n_cluster*1.2))
        print('Cluster optimization range:',  floor(n_cluster*.7), ceil(n_cluster*1.2))# TRAIN PIPELINE
        my_pipe.fit(X, y)debug = Truey_pred=cluster_plot(my_pipe, X, n_cluster, PALLET)print(pd.DataFrame(my_pipe.best_config.items()
                           ,columns=['n_clusters', 'k']))print('train','\n'
              ,results_to_df(my_pipe.results.metrics_train))
        print('test','\n'
              ,results_to_df(my_pipe.results.metrics_test))# turn the ground-truth labels into a clusim Clustering
        true_clustering = Clustering().from_membership_list(y) 
        kmeans_clustering = Clustering().from_membership_list(y_pred) # lets see how similar the predicted k-means clustering is to the true clustering# output all available similarity measures
        row_format2 ="{:>25}" * (2)
        for simfunc in sim.available_similarity_measures:
            print(row_format2.format(simfunc, eval('sim.' + simfunc+'(true_clustering, kmeans_clustering)')))elsim = sim.element_sim(true_clustering, kmeans_clustering)
        print("Element-centric similarity: {}".format(elsim))

如何获得 Photonai?

注意:我只给出了基于 Python- 的集群模型示例,但是这些集群模型在其他语言中也是可用的。

注意:Photonai 是一个公开发布包,我已经对它进行了修改,以包含集群模型。

如果你的机器学习项目涉及到聚类,你将需要使用我的 Photonai 代码。很快,我打算添加 xgboostlightgbm 。你可以从可克隆的 GitHub 获得我的增强功能。我建议每月更新,因为 Photonai 是一个正在进行的项目。

注意:我已经服从了 Photonai 的外部 API 调用签名。

:当前文档仍然适用。我的改进只记录在代码和以前关于 的博客中。

:所有改动我都写了测试。

您可以使用以下命令将 Photonai 1.3.0 放在本地项目目录中

git clone [https://github.com/bcottman/photon.git](https://github.com/bcottman/photon.git)

:如果你愿意,你可以通过以下方式将光子包含在笔记本中:

import sys, o
old__file__ = !pwd
__file__ = !cd ../../../photon ;pwd
__file__ = __file__[0]sys.path.append(__file__)
print(sys.path)
os.chdir(old__file__[0])
!pwd

您将针对您的特定目录结构更改__file__ = !cd ../../../photon

: 光子有一个 **..photon/photonai/docker**,用于构建一个 Docker 容器。该目录中指定了两种不同的 Docker 虚拟环境。dev具有 JupyterJupyter 扩展所需的包版本。此配置在以下章节中有详细说明:

[## 将 Jupyter 笔记本扩展添加到 Docker 映像

我们的 Jupyter Python 和 R 用户的 Docker 映像要求他们在每隔…之后设置他们的 Nbextensions 首选项

towardsdatascience.com](/adding-jupyter-notebook-extensions-to-a-docker-image-851bc2601ca3)

注意:你可以造一个重量更轻的 Docker 集装箱(test),没有 Jupyter ,而且是行李。该配置在中有详细说明

[## 我们将 Docker 企业解决方案的速度提高了一倍

我们收到了大量关于 Docker 解决方案 0.0.2 版本的反馈。反馈有一个共同的主题:只有 R&D…

medium.com](https://medium.com/@dr.bruce.cottman/a-docker-solution-for-the-test-groups-use-cases-8e8ed6c28e11)

当您使用本文中的示例代码或您的基于的 photonai- 项目时,您可以通过使用两个 Docker 映像中的任何一个来省去安装 20 多个包和更改(破坏)您的环境的麻烦。

什么是 KMeans 聚类算法?

k 均值算法如下:

  1. 首先,我们随机初始化 k 个中心点,称为质心。
  2. 我们将每个数据点聚类标记到其最近的质心。然后,我们更新质心的坐标,这是到目前为止该聚类中包含的所有数据点的平均值(表示)。
  3. 我们对给定的迭代次数重复该过程,直到数据点的聚类分配不变为止。

Photonai 具有函数registry,该函数详述了一个元素 Photonai ,调用可更改的签名或超参数。

registry.info("KMeans")output ==>
----------------------------------
Name: KMeans
Namespace: sklearn.cluster
----------------------------------
Possible Hyperparameters as derived from constructor:
n_clusters                          n_clusters=8                                                               
init                                init='k-means++'                                                           
n_init                              n_init=10                                                                  
max_iter                            max_iter=300                                                               
tol                                 tol=0.0001                                                                 
precompute_distances                precompute_distances='auto'                                                
verbose                             verbose=0                                                                  
random_state                        random_state=None                                                          
copy_x                              copy_x=True                                                                
n_jobs                              n_jobs=None                                                                
algorithm                           algorithm='auto'                                                           
----------------------------------

什么是 KMedoids 聚类算法?

KMedoids 型号与 KMeans 型号有一个显著的区别。k 形心必须来自数据集中的任何数据点。

在 **KMeans 中,**质心是数据点的平均值,而在 KMediods 中,质心必须是数据点之一。有趣的是,一个簇中的数据点越多,越接近 HAARIECS 的得分 KMeansKMdiods ( 中心极限定理 )。

KMedoidsPhotonai 主叫签名为:

registry.info("KMedoids")
output ==>
----------------------------------
Name: KMedoids
Namespace: sklearn_extra.cluster
----------------------------------
Possible Hyperparameters as derived from constructor:
n_clusters                          n_clusters=8                                                               
metric                              metric='euclidean'                                                         
init                                init='heuristic'                                                           
max_iter                            max_iter=300                                                               
random_state                        random_state=None                                                          
----------------------------------

使用 KMeans 和 KMedoids 进行细胞( 圆形斑点 )计数

给医学实验室一个细胞样本,要求得到一个细胞计数。让我们看看 KMeans 和 KMedoids 在这项任务中表现如何。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数字k 表示各种细胞计数密度的细胞(小球形斑点)计数。瑞秋·科特曼的动画

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

k 表是指各种细胞计数密度的细胞(小球形斑点)计数。

英寸。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数字 KMedoids 细胞(小球形斑点)以各种细胞计数密度计数。瑞秋·科特曼的动画

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

各种细胞计数密度的 KMedoids 细胞(小球形斑点)计数表。

观察#cc2:在圆形细胞上,KMeans 的细胞计数误差小于 KMedoids

观察#cc3: KMediods 具有圆形细胞,计数范围从 1%到 16%。

观察#cc4: KMediods 不如 KMeans 圆形细胞计数可靠。

使用 KMeans 和 KMedoids 进行单元椭圆斑点计数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

k 表示细胞(小椭圆形斑点)在不同细胞计数密度下的计数。

观察# cc5:k 均值模型不应用于计数 椭圆形细胞计数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMedoids 细胞(小椭圆形斑点)以各种细胞计数密度计数。瑞秋·科特曼的动画

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不同细胞计数密度的水母细胞(小椭圆形斑点)计数表

观察#cc6: KMediods 模型不应用于计数 椭圆形细胞计数。

使用 KMeans 和 KMedoids 模型对 Isis 数据集进行聚类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

k 表示*模型对 Isis 数据集进行聚类。瑞秋·科特曼的动画*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Isis 数据集的 KMeans 模型聚类得分表。

上图显示了由 KMeans 聚类的原始 Isis 数据集。

Isis 数据集的特征(列)处于原始比例,因此由每个特征的值形成的轴具有不同的长度。

不同长度的轴形成一个椭球形状,我们知道k 意味着不擅长聚类。

Iris 数据集通过StandardScale,进行变换,使得每个特征具有相同的单位长度(范围),从 0.0 到 1.0。形成一个椭球体,所有轴的长度都相同。

观察# i1:k 均值模型聚类得分通过先用 StandardScaler.变换数据集来提高

接下来,我们添加了 PCA (主成分分析)以将 5 个特征(5 维)Isis 数据集缩减为 2 个主轴(2 维)数据集。

观察#i2: PCA 没有改变k 均值模型聚类分数。**

观察# i3:k 均值模型未能找到 Isis 数据集的 3 个聚类。

观察# i4:ECS 指标正确地测量了 3 个数据点集群分配中的 2 个。

观察#i5:添加 PCA 对这个 KMeanss 聚类没有影响。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KMedoids 模型聚类 Isis 数据集。瑞秋·科特曼的动画

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Isis 数据集的 KMedoids 模型聚类得分表。

第一个显示了由 KMeans 聚类的原始 Isis 数据集。

Isis 数据集的要素(列)处于其单位比例,因此由每个要素的值形成的轴具有不同的长度。

不同长度的轴形成一个椭球形状,我们知道k 意味着不擅长聚类。

虹膜数据集通过StandardScaler, 进行变换,使每个特征具有相同的轴长,从而成为一个椭球体。

观察#i6: KMediods 模型聚类得分通过先用 StandardScaler.变换数据集来提高

接下来,我们添加了 PCA (主成分分析)以将 5 个特征(5 维)Isis 数据集缩减为 2 个主轴(2 维)数据集。

观察#i7: PCA 没有改变 KMediods 模型聚类分数。

观察#i8: KMediods 模型找不到 Isis 数据集的 3 个聚类。

观察#i9:应用缩放时,ECS 指标正确测量了 3 个数据点集群分配中的 2 个。

观察#i10: PCA 伤害这个 KMedoids 聚类。

资源

* [## 编写更好的 Python 代码的 21 种技巧

我从 35 年的多个项目的多语言编程中总结了这些技术。那里…

medium.com](https://medium.com/swlh/21-techniques-to-write-better-python-code-3029f6562483) [## 我的代码审查清单中的 17 项基本技术

现在是代码审查时间。你们中的一些人宁愿避免代码审查过程。无论你是编程新手还是…

medium.com](https://medium.com/@dr.bruce.cottman/seventeen-basic-techniques-from-my-code-review-checklist-8d5f0f7c4bbc) [## 如何有效地使用 t-SNE

一种流行的探索高维数据的方法叫做 t-SNE,是由范德马滕和辛顿提出的…

istill.pub](https://distill.pub/2016/misread-tsne/) [## 主成分分析

主成分分析是一种无监督学习类的统计技术,用于解释数据在高…

medium.com](https://medium.com/datadriveninvestor/principal-components-analysis-pca-71cc9d43d9fb) [## 交叉验证—为什么和如何

交叉验证在机器学习中的重要性

towardsdatascience.com](/cross-validation-430d9a5fee22) [## Python 中超参数优化。第二部分:远视。

在这个博客系列中,我将比较 python HPO 库。在阅读这篇文章之前,我强烈建议你阅读…

towardsdatascience.com](/hyperparameter-optimization-in-python-part-2-hyperopt-5f661db91324) [## 标准缩放器()

现在还是星期天,是#weeklypython 的时间了!

medium.com](https://medium.com/@yhpf/standardscaler-fd4bef76411d)

摘要

本文中 KMeansKMedoids各种运行的所有笔记本都可以在这里找到。

当我用这些笔记本进行实验时,代码发生了变化。更先进的笔记本有:

我们进行了 45 次观察,总结如下:

  1. ECS 是比 HAARI 更健壮的聚类度量。

K-意味着优势

  1. 在大多数机器初学者课程中讲授;
  2. 比大多数其他聚类算法更快;
  3. 技术访谈中常见的实施问题。
  4. 适用于分离的、大小相等的球形集群,其中集群数为 50 或更少。
  5. 足以计数在培养物中均匀分布的细胞。

K-均值偏差

  1. 在非球形集群上性能不佳。
  2. 不同规模的集群性能不佳。
  3. 每个集群的不同数据点计数性能不佳。
  4. 群集未分离时性能不佳。
  5. Isis 数据集性能不佳。

K-Mediods 优势

  1. 没有。K-methodsKMeans 在我们执行的所有实验中的性能相同或更差。

在以后的文章中,我们将探索凝聚线索光学DBSCANBirch深度学习集群模型,以及其他出现的模型。

我们将通过配对其他集群模型并比较它们的相似性和差异来继续这种乐趣。最后,我们将举行一场比赛,为给定数据集的给定可检测行为找到冠军聚类模型。

总之,我们希望在回答这些问题方面取得进展:

  • 我们能开发一个观察的“备忘单”来区分每个聚类模型吗?
  • 我们能否查看数据并缩小我们应该使用的聚类模型的选择范围?
  • 我们能找到一个元算法,或者一套规则来找到或者选择一个集群模型吗?
  • 我们的研究能指导我们得到更好的聚类模型吗?

接下来的研究,我们比较 CureDBSCAN 无监督学习聚类模型。

Cure 承诺解决 K- < x > 簇性能不佳,大小不一致或非球形簇。

DBS can(Den sity-basedspartialclustering ofaapplications withnoise)是最常见的聚类算法之一。我们将看到为什么(或为什么不)。

通过我们的第一项研究,我们开始了对无监督学习聚类模型的详细研究之旅。***

48 小时见成效:加州新冠肺炎模式背后的故事

原文:https://towardsdatascience.com/48-hours-to-results-the-story-behind-californias-covid-19-model-9b388106c9b2?source=collection_archive---------41-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 @cagovernor

你能想象在没有天气预报的情况下计划登陆日吗?没有吗?那么,如何在不预测疾病传播的情况下阻止其快速传播呢?这种情况是加利福尼亚州在州长纽瑟姆于 2020 年 3 月 19 日制定最初的新冠肺炎留在家中令的前几天发现自己的情况。

为了让事情有个背景,考虑一下那一周的世界状况。加州试图在一个他们只有部分的、不完整的和矛盾的信息的环境中理解新冠肺炎。当时,加州只有 18 人死亡,而美国死于该疾病的人数不到 500 人。中国政府已经隔离了武汉,意大利北部的医院人满为患,纽约市的医院正在争夺足够的床位。虽然旧金山已经制定了在家呆着的命令,但这种疾病的致命性尚不清楚,难以想象一个拥有 4000 万选民和第五大经济体的州会进入部分封锁状态。

加州实际上是盲目飞行。大规模测试不可用,因为 CDC 尚未批准测试,COVID 的模型存在许多问题。这些问题包括仅在总体州一级而不是在具体县一级的解决方案,没有预测社会距离等缓解措施如何影响疫情,没有对 ICU 床位和呼吸机等关键资源进行建模。

在两天内,一群来自加州公共卫生官员、约翰霍普金斯大学流行病学家和硅谷工程师的乌合之众聚集在一起,改造并实施了一个相对复杂的疫情模型——提供了一个关于政策干预如何影响传播和分配 ICU 床位和呼吸机等关键资源的视线。这一信息有助于制定该国第一个居家命令的决定,研究显示,到 2020 年 4 月 6 日,T2 可能已经在加利福尼亚州避免了多达 170 万例病例。此外,该模型已被用于帮助许多州和国家政府,并迅速扩大规模,以便在国家一级提供快速预测。仅在 2020 年 5 月,它就使用了超过 1 亿个计算机小时进行预测。

该模型支持特定地理边界内的细粒度缓解方案,并计算感染预测和医院容量。举例来说,一种干预情景可能是适度的社会距离和城市地区学校停课四周,加上农村地区的遮光。人们可以通过与 CalCAT COVID 评估工具互动来了解这个政策制定工具的一部分。真正喜欢冒险的人可以仔细阅读模型源代码,它是开源的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CalCAT COVID 评估工具的屏幕截图

2020 年 3 月 16 日,在留在家中的决定发布前四天,加州拥有的只是过时的内部预测和来自外部研究实验室的有限的州级预测。我们的团队最初由来自加州政府的代表以及一些硅谷志愿者技术专家组成。幸运的是,一位州流行病学家与约翰霍普金斯大学彭博公共卫生学院有联系,那里的传染病动力学小组设计了一个 COVID 模型,这是我们的最佳选择。它将允许我们开发县一级的预测,并创建不同的情景,如在家订单的遵守率。不幸的是,该模型没有针对加州的人口统计数据进行调整,并且花费了半天多的时间进行计算,这耗费了宝贵的时间来应对呈指数增长的病毒。我们需要一个加州每个县的模型,它能足够快地计算并随着疾病的发展而改进,并且能以我们能想到的最快速度测试各种情况。

我们已经被剥夺了睡眠,我们设定 48 小时为交付第一批结果的最后期限,这反映了快速发展的疫情所必需的紧迫性。在这些时间限制下,我们必须快速识别角色和职责,并且每小时迭代一次。我们没有时间创建组织结构图;我们的主要目标是找到最有资格承担任务的人,然后尽我们所能支持他们。

到第一天晚上,我们已经建立了我们的团队,并设计了最初的可交付成果:如果指数增长继续不受抑制,加州将超过其医院容量多少,我们能做些什么?考虑到紧迫性,我们高度关注数量级差异,并确定了三种主要情景:不采取激烈措施的完全情景,这提供了一个上限;强制隔离的武汉式封锁,这在民主国家是不现实的,但提供了一个下限;还有一个折中的解决方案——旧金山式的部分封锁。那座城市几天前就开始了早期隔离。我们没有旧金山的数据,所以流行病学小组创造性地根据 1918 年西班牙疫情流感的堪萨斯城模拟了旧金山,这是第二好的可比数据。

软件团队优化了模型,并在云计算资源上执行了提升和转移,以将模拟扩展到数千台计算机上

对 ICU 床位和呼吸机等关键公共卫生资源的需求进行建模和预测需要了解每家医院的能力。不幸的是,在搜索了各种政府机构后,我们得知这些数据并不存在。为了得到它,我们在短时间内建立了一个协调的程序,定期给医院打电话,并将这些信息捕获到电子表格中。整个努力类似于“流行病学奥林匹克”,团队在最高水平上应用了本科生所学的相同的著名流行病学技术和软件缩放原则。

在 2020 年 3 月 18 日星期三的傍晚,我们团队的模型产生了加州的第一组结果,我们将这些预测提交给了加州的 COVID 响应团队。这是决策者第一次看到这种粒度级别的模型,其含义非常可怕。第二天,州长纽瑟姆宣布了加州的居家命令。几个星期后,4 月 10 日,州长举行了一次记者招待会,向公众展示了这个模型,并吹捧建模的价值。

模型的预测区间相当大,这是一个挑战,而且有必要在任何政策反应中内化。我们对这种疾病的了解在不断提高,从了解传播媒介到住院结果,这将使估计更加精确。更重要的是,人类行为的变化会极大地影响任何疫情预测的结果,并且是一个巨大的随机因素。人类将改变他们的行为来支持任何预测的负面结果,使预测无效。

像所有好的模型一样,结果激发了丰富的讨论,并需要更深入的预测(例如,在哪些县我们应该鼓励使用口罩?).随着疫情的进展,政策问题也发生了变化,自那时以来,我们对模型进行了大量更新,并根据不断变化的局势,研究了新的和更复杂的情况。这些持续更新对于向政策制定者提供紧迫的相关信息是必要的,因为该模型继续为加利福尼亚州、其他州以及国际合作伙伴的政策决策提供信息。

特设加州新冠肺炎工作组由以下人员组成(按字母顺序排列):

用 Kepler.gl 实现 4D 数据可视化

原文:https://towardsdatascience.com/4d-data-visualization-with-kepler-gl-b6bd6dd90451?source=collection_archive---------37-----------------------

数据可视化

教程 Kepler.gl 以新冠肺炎数据集为例显示时态数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Kepler.gl 中可视化德国新冠肺炎数据(作者)

Kepler.gl is 是优步于 2018 年推出的一款针对大规模数据集的强大开源地理空间分析工具。它是数据科学家探索和分析地理空间数据的绝佳工具。

在本文中,我将展示一个非常简短的教程,介绍如何准备和可视化四维数据:位置(纬度、经度、高度)和时间。例如,下图显示了德国一段时间内新增新冠肺炎确诊病例数的可视化示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Kepler.gl 中可视化德国新冠肺炎数据(作者—来自 RKI 的数据集)

第一步。数据准备📝

为了在 2D/3D 地图上可视化数据,我们需要确保我们的数据包含纬度和经度的地理空间字段,以映射每一行数据。如果数据源是 shapefile、geojson 这样的地理空间格式,那么我们就不需要担心这个问题。但是,如果它是表格格式并且没有地理空间字段,那么我们可以在 GIS 软件中运行地理编码器,或者使用一些地理编码器脚本,如 Python 和地理编码器库,如下例所示:

***import* geocoder
g = geocoder.google('Stuttgart', key="<Your Google API Key>")
print(g.latlng)** >> [48.7758459, 9.1829321]

或者,您也可以运行使用 GeoPandas 来完成这项工作。数据集中的日期/时间列是可选的,它允许应用程序显示及时的数据。例如,我从 RKI 下载了德国新冠肺炎数据集。(从此处下载)然后准备如下所示的数据集:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Cleaned _ RKI _ covid 19 _ Dataset . CSV(作者—来自 RKI 的数据集)

第二步。将数据集加载到 Kepler.gl🔃

这一步很简单。我们可以简单地将准备好的数据集拖放到中。csv。json ,或*。geojson* 到 Kepler.gl 应用程序中。或者,如果您是 Python 和 Jupyter 的爱好者,那么您可以在将熊猫加载到开普勒地图之前,将它们加载到您的轻松加载数据集。

**from keplergl import KeplerGl
import pandas as pd****map = KeplerGl(height=500)
df = pd.read_csv(f'<your dataset>')
#...........................................
#... pandas data manipulation if needed ....
#...........................................****map.add_data(data=<df_cleaned>, name='<data_named>')**

第三步。开普勒地图设置🔨

现在,让我们来看看开普勒地图吧!😊

  • 选择你想要的地图类型(在上面的第一个 gif 例子中,我使用了 Hexbin)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

开普勒. gl 中的图层类型(作者)

  • 定义位置(纬度/经度)列。
  • 指定颜色主题、比例、选定列的聚合方法、过滤器和不透明度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Kepler . GL 中的颜色设置(作者)

  • 调整网格大小,开普勒会自动为你聚合数据!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Kepler.gl 中调整网格大小(作者)

  • 启用基于选定列的高度。在本例中,我选择通过对新冠肺炎案件编号求和来汇总数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Kepler.gl 中调整网格高度属性(作者)

  • 最后,让我们通过添加图层过滤器并选择日期/时间列来启用时态可视化。然后,我们将得到动画地图,显示随着时间的推移,网格高度的新冠肺炎案件。🎉🎉

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

启用 Kepler.gl 中的时间过滤器(作者)

结论:

本文展示了如何使用 Kepler.gl 在 4D 可视化和浏览数据集的分步教程。您可以使用 Kepler.gl 来体验许多功能,如热点图图层、旅行图层等。在 https://kepler.gl/检查一下。我希望你喜欢这篇文章,并发现它对你的日常工作或项目有用。如果您有任何问题或意见,请随时给我留言。

关于我&查看我所有的博客内容:链接

安全健康健康**!💪**

感谢您的阅读。📚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值