当前位置:   article > 正文

小学生都能看懂的人工智能原理

人工智能原理

前言

人工智能,AI的概念在22/23年随着chatgpt的诞生而爆火,而事实上AI技术在我们日常生活中早已得到广泛应用,从日常使用各类APP,到坐火车飞机。基本上你能想到的日常生活场景都能有AI的一席之地。作为一名研发工程师,我们不需要去深究各种复杂的人工智能模型到底是如何搭建的,但了解人工智能的基本原理对我们对于AI的应用是有帮助的,这里用最简单的方式为大家介绍常用人工智能算法实现原理,保证高中数学水平就能看懂。

什么是人工智能

人工智能(Artificial Intelligence,简称AI)是指利用计算机技术来模拟、扩展和承担人的智能活动的一种技术和科学。人工智能技术可以实现和模拟人类的思维、学习、推理、判断、决策、语言、知识获取和处理等智能活动,具有自主、自适应、自我学习和推理、自我控制等特征。人工智能是目前计算机科学领域的重要研究方向之一,应用广泛,包括自然语言处理、机器翻译、图像识别、语音识别、智能游戏、智能家居、智能医疗、智能交通等领域。

从本质上讲,人工智能要解决的问题绝大部分可以总结为预测结果,而从技术手段来看,人工智能算法大部分可以归类为曲线拟合(观点有争议,详情大家可以看下这个问答

为什么说人工智能主要解决的是预测问题。我们日常使用的大部分人工智能算法,包括搜索推荐,图片识别,甚至于chatgpt这类通用语言模型都在解决一个问题,即在一个业务场景下给一个输入值,计算机预测输出值应该是什么。以chatgpt为例,用户在输入提示词后,chatgpt做的事情可以理解为根据从网络上获取的问答和文本计算出每个词可能出现的概率,并选出概率最高的一个词作为预测结果输出,同时将前面的输出当作输入再次计算概率并最终生成文本。

举一个具体的例子,我们向chatgpt输入“胖胖是最帅的人吗?”chatgpt计算出“是”这个词出现的概率是50%,“否”出现的概率是20%、“一般般”的概率是15%、“钝角”的概率是10%...,在计算完所有词的概率之后,chatgpt发现“是”的概率最高,因此输出“是”,这时候它会再将“胖胖是最帅的人吗?是”作为输入,chatgpt计算出下个词为空的概率最高,就会结束内容生成。

为什么说人工智能算法大部分可以归类为曲线拟合呢,实际上大部分机器学习算法都是在构建一类模型,这类模型通常会根据已有数据训练出一系列参数,输入值和这些参数做运算后就能得到我们上面说到的预测结果,由于这些参数构成的模型画在坐标系中可以看做一条曲线(1维的情况下),而机器学习算法要做的其实就是找到最能拟合现有数据的曲线,从而能对未知的数据进行预测。

解决预测问题

这里我会用一个让机器自己学会预测房价的例子让大家直观的感受人工智能是如何通过“曲线拟合”来解决现实中的“预测”问题的。实际情况下,预测房价需要的因素有很多,地理位置、朝向、房间个数、面积、层高等,这里为了方便讲解,我们只考虑房屋面积这一个因素,因此读者只需要高中数学水平就能理解这个算法。

问题定义

在这个例子中,我们会让机器学会从一些房价成交数据中找到规律,并且能够自主的根据面积预测房价,在机器学习领域中,这类算法被称为监督学习算法,即通过已有的数据进行训练,实现分类数据或预测结果的功能。我们已有的房价数据格式如下(详情可以见附录)

房屋面积(㎡)

房屋售价(万)

88.64

305

88.75

350

117.12

312

...

...

数学建模

有了数据以后,计算机要怎么开始学习呢?我们首先要定义问题,即用数学语言对问题进行描述(这种过程也被称为建模)。为了直观理解,我们直接在二维坐标系中画出这些数据。

数据可视化

通过观察数据,我们可以做出一个假设,即房屋面积和房屋价格之间呈线简单的性关系,我们可以直接在坐标系中划一条线,这就是我们的模型,如下图所示。

模型可视化

通过这个模型,计算机就可以直接对房价预测。例如一个人的房屋面积是140平米,那么我们可以告诉他,他大约能以535万的价格出售。用高中数学的知识来描述这个模型其实就是一个二元一次函数,Hypothesis:h_\theta(x)=\theta_0*x + \theta_1(x为房屋面积,函数值为房屋售价)

预测房价
使用模型预测房价

而实现准确预测的前提是我们需要找到最佳的 \theta_0,\theta_1参数(即找到最拟合房屋成交数据的直线)。

代价函数

如何评估\theta_0,\theta_1两个参数的效果呢?在这个场景中,我们可以用已有训练数据的实际值到预测模型的预测值之间的平均距离来定义模型拟合效果,平均距离越小,代表模型越精准,具体计算方式如下,每个红线长度代表一个实际值到预测值的距离

代价函数计算方式

由于求绝对值不便于计算,我们用求平方除以2来替换,同时用稍微书面化一些的语言来描述这个函数

Cost Function:J(\theta_0,\theta_1)=((h_\theta(x^{(1)}) - y^{(1)})^2 + (h_\theta(x^{(2)}) - y^{(2)})^2 + ... + (h_\theta(x^{(m)}) - y^{(m)})^2) / (2 * m)

(h_\theta(x^{(i)})表示第i行数据的预测值,y^{(i)}表示第i行数据的实际值,m表示训练数据总行数)

我们稍微简化一下就成了如下形式(没学过累加符号\sum_{i=1}^m不要慌,后面会有更简单的方式)

CostFunction:J(\theta_0,\theta_1)=\frac{1}{2m} * \sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})^2

这个二元二次函数我们称之为代价函数,函数的结果用于衡量模型的预测准确度,对应的函数结果越小,模型预测越精准。此时,我们要解决的问题变成了找到使代价函数J(\theta_0,\theta_1)最小的\theta_1,\theta_0。下面是我们用不同的\theta_1,\theta_0得到的模型以及计算出的代价函数的值。

当然,上面这个函数看起来还是有点复杂,我们可以直接把房屋成交数据带入代价函数并简化可以得到如下结果 

J(\theta_0,\theta_1)=681254 *\theta_0^2 + 41*\theta_1^2 -5389449 * \theta_0 -38126 * \theta_1 + 9926 * \theta_0 * \theta_1 + 11020077

这个二元二次函数在坐标系中是一个曲面,我们要找的就是这个曲面的最底部,即z最小值对应的\theta_0,\theta_1

这个时候有同学可能会问,二元二次函数我高中没学过啊?没关系,观察上图我们可以发现,代价函数的值几乎只与\theta_0有关,而与\theta_1几乎无关(由于面积为0的时候房屋价格一定为0,因此线性模型下\theta_1应该为0),将\theta_1=0代入后函数就会简化为二元一次。

J(\theta_0)=8110 *\theta_0^2 -64160 * \theta_0 + 131191

这个函数我们就非常熟悉了,在坐标系中的表现形式是一条曲线,现在问题终于变成了一道高中数学填空题,找最二元一次函数的最小值

梯度下降算法

高中数学告诉我们,求出函数导数为0的解就可以找到最小值(最大值),但要注意,我们这里为了讲解,只列举了最简单的例子,实际的人工智能模型中参数通常会多达成千上万个,而且通常不会采用简单的线性模型,计算机是无法针对如此复杂的函数求解的,因此我们可以选择一种更适合计算机的方式,梯度下降算法。

我们可以这么理解梯度下降算法,在上述的函数图中随机找一个点,不断以固定步长朝着函数值变小的方向移动,最终找到最小值。在二元函数中,函数值变小的方向可以理解为求导数

如上所示,在第一张图中选取一个点,求导数(这里可以看做求斜率),发现导数大于0,则向左移动一个步长,迭代足够次数后,求得最小值,这里给出求导公式(其实是微分公式)

\frac{\partial }{\partial {​{\theta }_{0}}}J({​{\theta }_{0}})=\frac{\partial }{\partial {​{\theta }_{0}}}\frac{1}{2m}{​{\sum\limits_{i=1}^{m}{\left( {​{h}_{\theta }}({​{x}^{(i)}})-{​{y}^{(i)}} \right)}}^{2}}\\化简后得到\frac{\partial }{\partial {​{\theta }_{1}}}J({​{\theta }_{0}})=\frac{1}{m}\sum\limits_{i=1}^{m}{\left( \left( {​{h}_{\theta }}({​{x}^{(i)}})-{​{y}^{(i)}} \right)\cdot {​{x}^{(i)}} \right)}

看起来很复杂,其实将上面代价函数以及房价数据全部带入后得到

\frac{\partial }{\partial {​{\theta }_{0}}}J(\theta_0)=2 * 8110 *\theta_0 -64160

算法实现

  1. def getThetaSimple(x_array, y_array, times, step):
  2.     #先随机选取一个theta
  3.     theat = 10
  4.     for i in range(times):
  5.         print(theat)
  6.         theat -= compute_grad(theat, x_array, y_array) * step
  7.     return theat
  8. def compute_grad(theat, x_array, y_array):
  9.     cost_grad = 0
  10.     for x_index in range(len(x_array)):
  11.         x = x_array[x_index]
  12.         y = y_array[x_index]
  13.         cost_grad += (theat * x - y) * x
  14.     return cost_grad / len(x_array)def getThetaSimple(x_array, y_array, times, step):
  15.     #先随机选取一个theta
  16.     theat = 10
  17.     for i in range(times):
  18.         print(theat)
  19.         theat -= compute_grad(theat, x_array, y_array) * step
  20.     return theat
  21. def compute_grad(theat, x_array, y_array):
  22.     cost_grad = 0
  23.     for x_index in range(len(x_array)):
  24.         x = x_array[x_index]
  25.         y = y_array[x_index]
  26.         cost_grad += (theat * x - y) * x
  27.     return cost_grad / len(x_array)

我们运行一遍迭代一千次的算法,并将每一次迭代的到的{​{\theta }_{0}}画在坐标系中,图像如下

可以看到随着迭代次数增加,{​{\theta }_{0}}的值逐渐收敛至3.96左右,至此,得出用于预测房价的模型。

需要注意的是,我这里为了方便大家理解只是举了一个及其简单的案例,在实际情况中通常不会存在仅有一个特征值的情况,模型也通常不会是简单的线性模型,这时候会应用到的高次多维函数求导以及矩阵运算就不是高中数学水平能够理解的了,这里附上支持任意维度数据的梯度下降算法实现供大家参考。

  1. #支持任意参数数量的梯度下降算法
  2. #注意这里为了支持任意参数并且支持矩阵运算,输入参数会人为添加一个0维度
  3. def getTheta(x,y,times,step):
  4.     a,b = np.shape(x)
  5.     train = np.ones((a,b+1))
  6.     m, n = np.shape(train)
  7.     train[:,1:] = x
  8.     theta = np.zeros(n)
  9.     for i in range(times):
  10.         hp = np.dot(train,theta.transpose())
  11.         error = hp - y
  12.         grand = np.dot(train.transpose(),error)/m
  13.         theta = theta- step*grand
  14.     return train,theta#支持任意参数数量的梯度下降算法
  15. #注意这里为了支持任意参数并且支持矩阵运算,输入参数会人为添加一个0维度
  16. def getTheta(x,y,times,step):
  17.     a,b = np.shape(x)
  18.     train = np.ones((a,b+1))
  19.     m, n = np.shape(train)
  20.     train[:,1:] = x
  21.     theta = np.zeros(n)
  22.     for i in range(times):
  23.         hp = np.dot(train,theta.transpose())
  24.         error = hp - y
  25.         grand = np.dot(train.transpose(),error)/m
  26.         theta = theta- step*grand
  27.     return train,theta

解决分类问题

前面讲解房价预测的例子中我们用的就是线性回归算法,这种算法比较适用于预测具体的值。而针对机器学习中的另一类问题-分类,例如根据年龄大小判断是否结婚,我们就需要采用另一种有些类似的算法-逻辑回归来实现。

数学建模

相比较线性回归,逻辑回归的最大变化是在线性模型的基础上增加Sigmoid函数g\left( z \right)=\frac{1}{1+{​{e}^{-z}}}其中z为前面讲的线性模型的输出值,因此我们也可以写作g\left( z \right)=\frac{1}{1+{​{e}^{-h_\theta(x)}}},以下是Sigmoid函数的图像,可以看到这个函数最大的特点是y值被严格限定在[0,1]的范围内,且x大于0时y大于0.5,x小于0时y小于0.5。

这样模型预测的结果从求具体的值变成了求某一分类的概率。我这里以根据年龄判断是否结婚为例子,判断结果只会有已婚和未婚两种,在上面的模型中,如果给定一个年龄对应输出值是0.7,说明用户已婚的概率是0.7,未婚的概率则是0.3,模型判定用户已婚。

数学模型的直观解释

看到这里你可能一头雾水,为啥套了个函数就变成求分类的概率了?我这里简单解释一下上面的sigmond函数到底做了什么事情。假设我们现在有一系列可以分为两类的数据如下图所示。

图中x1和x2分别表示两个特征值(可以理解为我们现在要实现一个判断房屋是在滨江区还是萧山区的算法,并且有了一系列不同面积和售价的房屋数据,其中x1为面积,x2为售价),基于简单线性模型的输出作为sigmond函数输入我们构建了逻辑回归模型,得出的方程如下

g\left( z \right)=\frac{1}{1+{​{e}^z}} =\frac{1}{1+{​{e}^{\theta_0 + \theta_1*{x_1} + {\theta_2} * x_2}}}

这里我们假设参数是\theta_0=3,\theta_1=2,\theta_2=1,前文讲过,sigmond函数的特性就是y值被严格限定在[0,1]的范围内,且x大于0时y大于0.5,x小于0时y小于0.5,因此当Z值(也就是线性模型输出值)大于等于0时,sigmond函数值将大于等于0.5,我们这里将大于或等于0.5的结果分类为1(滨江),反之分类0(萧山)。因此将参数带入模型很容易得出,当-3 + x_1 + x_2 >= 0时,结果分类为1(滨江),否则分类为0(萧山),因此x_1 + x2 >=3就是两类数据的分界线,越远离这条线,分类正确的概率越高,这就是sigmond的意义。

当然现实情况下分类问题通常不会这么简单,可能还会有一些比较复杂的数据,比如如下图所示的数据分布

这时候我们需要采用一些比较复杂的模型,例如高次模型{h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2}}+{\theta_{3}}x_{1}^{2}+{\theta_{4}}x_{2}^{2} \right)作为输入。这个模型在\theta值分别为[-1,0,0,1,1]时我们得到的是一个半径为1的圆 {h_\theta}\left( x \right)=g\left( {-1}+x_{1}^{2}+x_{2}^{2} \right)

代价函数

线性回归的代价函数定义可以应用到逻辑回归算法中,但是带入后会发现该函数是一个非凸函数,意味着代价函数存在许多的极小值,我们在这类函数中应用梯度下降算法时程序可能会停在其中某一个极小值(局部最优解)而不是找到全局的极小值(图中红线标出的部分)

因此在逻辑回归中,可能使用的代价函数是这样的J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{​{Cost}\left( {h_\theta}\left( {x}^{\left( i \right)} \right),{y}^{\left( i \right)} \right)},其中

在坐标系中画出{h_\theta}\left( x \right)Cost\left( {h_\theta}\left( x \right),y \right)之间的关系如下图所示:

这样构建的Cost\left( {h_\theta}\left( x \right),y \right)函数的特点是:当实际的y=1{h_\theta}\left( x \right)也为 1 时误差为 0,当y=1{h_\theta}\left( x \right)不为1时误差随着{h_\theta}\left( x \right)变小而变大;当实际的y=0{h_\theta}\left( x \right)也为 0 时代价为 0,当y=0{h_\theta}\left( x \right)不为 0时误差随着{h_\theta}\left( x \right)的变大而变大。

套公式就能实现的机器学习算法

贝叶斯公式

前面讲过机器学习算法大部分在做曲线拟合,但是凡是都有例外,比如这一节要讲的朴素贝叶斯算法。贝叶斯算法的鼎鼎大名我这里就不过多介绍了。作为一种能应用在几乎所有你能想象的生活场景中的统计方法,它的公式其实只需要初中水平就能看懂

P(A|B) = \frac{P(B|A)*P(A)}{P(B)}

名词解释:P(A|B)是在B发生的情况下A发生的概率;P(A)是A发生的概率;P(B|A)是在A发生的情况下B发生的概率;P(B)是B发生的概率。

在贝叶斯算法产生前,人们只会计算正向概率,只能解决【已知一个箱子里有3个白球7个黄球,摸出黄球的概率是多少】这类问题,而贝叶斯算法让我们有了能够解决【摸了出1个白球,3个黄球,计算箱子里白球和黄球的比例】这类计算逆向概率的方法。前面我们讲过,人工智能要解决的根本问题就是预测,因此擅长基于已有数据反推概率的贝叶斯算法在人工智能领域应用相当广泛。例如判断是否垃圾邮件,判断是否恶意评论等都可以用到它。

简单应用

我们这里用一个判断恋爱情况的案例简单介绍朴素贝叶斯算法的原理

问题:假设我们已经有了如下数据,我们如何判断一个【有房,没车,抽烟,非常丑,非常高】的人是否单身?

是否有房

是否有车

是否抽烟

帅不帅

高不高

非常高

非单身

不高

单身

一般

非常高

单身

非常高

单身

非常帅

一般

非单身

非常帅

一般

非单身

一般

一般

非单身

一般

非常高

非单身

上述问题其实可转换为求有房,没车,抽烟,丑,非常高的前提下单身和非单身的概率,概率更高的就是我们的预测结果,这里直接将问题带入公式

P(单身|有房,没车,抽烟,非常丑,非常高) = P(有房,没车,抽烟,丑,非常高|单身)  * P(单身)  / P(有房,没车,抽烟,丑,非常高)

直接拿数据套公式计算

P(有房,没车,抽烟,丑,非常高|单身) = 2 / 3 * 2 / 3 * 2 / 3 * 2 / 3 * 2 / 3 = 32 / 243

P(单身) = 3 / 8

P(有房,没车,抽烟,丑,非常高) = 3 / 4 * 5 / 8 * 5/ 8 * 3 / 8 * 1 / 2 = 225/4096

则有房,没车,抽烟,丑,非常高的前提下单身的概率为(32 / 243 * 3 / 8) / (225/4096)

通过同样的方式计算出不单身的概率为(96/3125 * 5 / 8) / (225/4096),和单身的概率进行比较。分母相同的情况下比较分子大小(32 / 243 * 3 / 8)> (96/3125 * 5 / 8)单身概率更大 ,因此预测有房,没车,抽烟,丑,非常高的人应该是单身。

实现文本分析

相比较于线性回归逻辑回归等算法,朴素贝叶斯虽然非常容易理解,实现起来也很简单,但其应用非常广泛,语言模型chatgpt中就有应用。你可能会好奇,前面介绍的基于可量化的数据来实现机器学习算法很容易理解,文本这种难以量化的内容机器是如何分析的呢?这里基于朴素贝叶斯实现一个简单的文本分析算法来做一个介绍。我们现在有一些已分类完成的歌曲,可谓分为“红歌”和“情歌”两种(详情见附件2),这里会基于朴素贝叶斯实现一个机器学习算法,根据已分类的歌曲自动对未分类的歌曲进行分类。

分词和词表

要实现文本分析,重点是将文本转化为可量化的数据,最简单的方式是基于分词+词表的形式。分词顾名思义是将一句话拆分为词。而词表是将分词完成后的全部词组汇集成一个大的列表,列表的长度就是数据的维度,例如如下歌词

红星闪闪放光彩红星闪闪放光彩

分词后

['红星''闪闪''放''光彩']['红星''闪闪''放''光彩']

对所有分类过的歌词进行分词并汇总就得到一个长度为2409的词表

['为''歌唱祖国''瞄准''唉''滋味''柱''忍不住''全''理想''容不下''农奴''不曾''扬波''宽广''战旗''开了花''军队''唱的歌''红太阳''叫儿''19''后方''染''我会''五斗''摇''乐''艰苦奋斗''晴空万里''端起''寒''宿营地''纵情歌唱''被''强盗''记得''"''小河''似海''抢占''万里''温暖''自己''今年''牧民''野鸭''天天''鸟''转''成群''一杆''水流''海空''......''用''决定''努力''故事''彩霞''打''放声''死亡''忽然''藏''士兵''27''汽车''平静''每''香飘''想要''结成''最美''路程''就别''随''三年''带路''可以''太行山''心头''天上飞''新天地''不幸''沙洲''长江''一声''创''民族''像''独立''营造''认份''红墙''悲伤''阳''人民共和国''美如画''用心''万丈光芒''北斗星''一送''默默''承受''受不了''燃起''碎''靠''问''环绕着''曾经''轻轻''某一人''指望''描绘''过去''绿浪''明媚''泪汪汪''东方''黄莲脸''比钢''林带''照得人''小小''土枪''天涯''21''41''挽手''比天''梦中''空中''整座''屋檐''投降''美''顽强''声'';''劈涛''身暖''火炬''整''革命理想''这么''山高水''拣''跳''轻易''细雨''日夜''遥''金黄''哟''客人''背叛''星星''说服''青纱帐''小鸟''密密的''前方''以后''清楚''千秋万代''小''花瓣''合''冷风吹''出来''来到''10''麦穗''明白''看惯''慈悲''奢侈''江岸''处处''满地''昏头昏脑''天涯海角''它们''崩''一年''南泥湾''树树里''不甜''有人''迎面''风在''掉下来''野鹿''祝福''严寒''牛羊''画''心胸''荣耀''边上''解放战争''锦绣河山''开出''五谷''好比''介支个''战马''愤怒''丰收''坦平''者''最好''雪山''事业''眼中''那年''不问''的话''长征''年''围屏''春常''罗''情深谊长''目光''驱''觉得''照''修起''亲吻''没''有''兴旺''一生''千金''盼''向''抹''千里''依靠''站岗''害怕''依然''怀念''遇到''共产党''瓜果''苍老''穷''花蓝''中华民族''阳光灿烂''雄心''迎着''26''羊''憧憬''战鹰''密''踢''硬''尚''绵绵''画面''相连''香榭''回乡''模糊''淋''改造''忙''壮大''49''开在''一些''泛起''栋梁''深情''平原''卷''若要''花园里''每根''谁''不进''一朵朵''造成''很小''到''阿姨''炮''松柏''模样''真''人来人往''遮盖着''红蓝''您''面容''放''硬骨头''去''迷路''热恋''它''子弹''顶天''远''里格''只在乎''江山''衷心''缠绕''双双''坚定不移''巷子''早上''百''心甘情愿''要是''时刻''我度''日本''诉说着''开遍''Do''品格''开始''出生''光''理由''不该''金色''不悔''回山''任人宰割''伟大祖国''走远''领导''自''塔影''买''望见''紧握''白鸽''盖成''红棉''巨人''18''挽救''寄''梧桐''42''欢庆''贴近''伴着''临江''景''晚''月亮''公路''后''滚滚''种豆''传颂''无故''喜悦''原油''山高林''天不怕''代表''秒''曾''?''鼓''相距''脸上''前面''昆仑山''改变''每条''十三岁''天''漫步''就''安全''迎春''山坡''距离''红军''轻抚''梯田''杀败''开满''寂寞''Music''举动''匆匆''受罪''群众''很近''花儿''开放''一唱''时光''战线''跨过''比翼''路上''海疆''掩'')''结局''种瓜''大寨''挣开''怀中''碎片''组合''五指山''命运''山河''八一''?''落花''天堂''骑兵''顺从''赞美''血肉''群山''逞凶''沸腾''棒棒''承诺''人为''紧闭''微笑''强国''感觉''那时''拿''这个''大家''延长''支离破碎''毕竟''扬起''无情''人民战争''并蒂''当个''赶''富''波浪''现阶段''淌''彻底''这样''!''才''日子''哭''旁''普照大地''只''分享''亲人''夺''船上''前进''人生''阵阵''天明''唤醒''雄鹰''几时''嘿''轰隆隆''中原''靳逞''滋润''情歌''初见''提醒''上''牧羊''自有''完全''立''我们''到底''里''满带''情绪''站''蒋匪''千言万语''12''海洋''没看''达到''离不开''不要''饼''无所谓''吼叫''如何''17''放肆''分开''疼''爱情''街道''中''那里''就要''跟''作和声''管它''野菜''动人''保卫祖国''赛呀赛''气球''硬撑''呵''走心''工人阶级''什么''风中''街''年少''得儿''北国''之前''格拉''祖国颂''万年青''慌''La''男''爱上''不敢''边''喔''并''6''好威风''生活''坚强''战场''继续''心事''晴天''冰冷''寒冬腊月''夕阳''留''机器''追忆''找寻''迷失''收起''躲''早日''美丽''不忍''高''虎豹''无''妻子''别''身''太''发出''家乡''风光''暖''唇印''来来来''风吹雨打''些''以往''团结友爱''蔼''不屈''看着''难有''只会''秘密''丰满''画凤''错''熬过''爱''写''变成''高高的''草原''雅鲁藏布江''三送''带''遭殃''春光''怎么样''亮''母亲''双唇''人民军队''沉睡''心太急''掉落''棉似''银光''世界''这里''夜里''知道''鲤鱼''份''晚霞''日记''每束''挽回''7''惊起''路开''歌声''红领巾''浪''围剿''等待''哪里''见''.''上前''软弱''井冈山''平安''地响''心里''勇敢''怎能不''金光''我爱你''在所难免''过握''乌云''强大''温热''思情''矫健''醉人''给''山野''主张''双桨''勇士''海浪''海员''阻止''眼泪''借''时候''草毯''仇恨''终于''开火''遍地''壮丽''舌''玩耍''西施''爱家乡''不会''气势''~''不必''含着''打天下''咿儿''忘''我要''拜''放晴''毛泽东''蝴蝶''长茧''可''哄''里个''痴''良田''建立''古老''高中''守护''推开''树''路''苦难''耳机''了''狠''不''丰富''竞相''Re''一夜''燃烧''这片''叔叔''云朵''高于''血染''爱心''但是''无边''口中''天寒地冻''看不见''东风''红梅''最怕''救''放不下''无声''新''朝霞''战士''烽火''千百里''蓝天''迷恋''羽毛''渐渐''一扇''穿梭''无味''石油''加快''说出''接过''分派''飞行''可会知''边防军''三九''英雄''军民鱼水''彩门''过得''小船''下面''气势磅礴''惊涛骇浪''作''门窗''农隶''教室''常青''中南海''烟波''任''计较''头顶''枯萎''自我''沿着''柔软''唱歌''后悔''写下''永不''宿舍''滚烫''心像''照样''踩''第一回''子弟兵''翻''同样''响亮''收豆''借口''山沟''铁路''真相''侧后方''决心''梦之旅''轰响''感到''白帆''身体''鱼''青蓝''天使''保证''还要''矢''哪怕''无数''笑声''赞颂''希望''阵线''钢铁''永远''号子''全都''很''伤感''得''伤害''树林''可能''望月''鞭子''河''高原''全世界''无际''想''一起''缠''鱼水''感染''眼睛''碧波''错觉''万泉河''铁墙''任随''迎风''敌歼''头戴''懂''晃到''谋''日''知己''music''姑娘''一般''我亲''昨天''岭上''付出''矿山''古城''开心''白杨树''四面''飘落''辉煌''还是''那样''从无到有''-''遇见''看作''大旗''约会''33''乱冲''筑成''倒映''一齐''永''晚灯''印''此刻''敲''对''哀号''擦肩而过''无怨无悔''壮''真情''青草''风雨''甜蔗''时''旁边''陕北''流泪''长''每日''每天''天顶''前途''随风飘荡''35''相信''油桐''飘''抗日''嗨''保卫''占据''果儿''枪炮''靠着''挥霍''严阵以待''允满''瑞金''宽畅''气息''指尖''呀''危急''向着''湖边''小心''课''荒原''心窝''工农''双眼''骗人''塞纳河畔''从今''天山''战舰''泥土''骄傲''车窗''毡房''海面''久''怎能''十万''兄弟''小伙儿''只要''颠倒''完整''白云''怨''无论谁''涌''独''来自''胸口''建造''舍生忘死''工人''31''船儿''手握''象征''中国''吼''万岁''安排''湖中''树下点''突破''彷佛''首创''草地''英勇''需要''爆破筒''就此''时想''像是''高梁''赛''收成''绿''翘''珍惜''踪和影''不盼缘''真不少''充满''冷漠''坚定''捎信''抽''赞''秋日''土地''仍''24''深处''长矛''天山南北''心儿''砸碎''有多美''早餐''豺狼''远客''看到''畏畏缩缩''高台''二月''怒目''胸中''阵地''38''迈开''流水''感应''强''共''依旧''一句''波澜壮阔''捐些''名叫''响起''喜欢''鞭儿响''林海''28''飘飘''情意''换''he''蛋''我试''摔死''再美终''还''书信''忧伤''翻身''一点''成功''力量''皑皑''如铁''想像''闪闪''日落''消灭''首歌''袂''知难而退''湖水''洋枪''家园''讲''出''看透''铁锁链''苦苦''和''强求''一层层''时代''黑暗''亲手''16''马''闹革命''好好''嘴''不理''说谎''五送''九送''前程''怎么''意义''窗''所以''越''白雪''愿意''但愿''感谢''手''她''艄公''灿烂''亲善''最爱''长城''无踪''磨''扩张''红旗飘飘''唯一''辽阔''埋伏圈''海防线''火车头''脚边''好''山冈''牺牲''青松''象''有点''始终''吻''响''摘''也许''坡''从''看吧''猎枪''广场''缘分''太阳''哎''赞歌''变了样''交换''荷塘''咆哮''变''看''11''盼望''如钢''年老''难受''捡''荒山''得到''大树''新春''捎''满''歌''刮风''肥''旧''勇气''走入''四年''花言巧语''…''加紧''武装''必死''彩蝶''烟成''高举''山路''变冷''一会儿''回来''俺''夏天''回''拥挤''红''肯定''海深''差错''就象''梦''没考上''山头''向前''(''撒下''祖国''良心''阳光''抬头''离骚''冷''琴''真爱''一条心''和平''江南''天安门广场''根本''珍珠''买卖''让''充饥''似''礼物''年代''好山好水''撩乱''年轻''香''彩''含''放手''同''草''一杯''挣扎''望''升起''明天''随便''百万''劳动''十丈''一整瓶''一回''朋友''一个''送郎''改善''颂歌''指''活下去''8''村庄''找''青年''吃''大学''万古''痴情''今天''离人''渠水''伤''一阵阵''太阳升''22''也''巡逻''朵朵''垂危''愉快''领袖''操场''咱们''不怕难''放牛郎''.......''撒''清泉''要''照得''冷冷的''延安''与''最后''骏马''听到''影子''煮''原来''说唱''谁种''左岸''跟着''反攻''认真''掌权''忍受''交错''都''会试''城市''不是''风''就是''4''变迁''花''飘扬''待''诶''怒放''卑污''算''湘''展''夜半三更''云霞''无敌''成就''千万''抬起''呼儿''锣儿''造''献身''哪儿''呦''安慰''意气风发''做''回忆''掉''请''十六''一切''再次''送''红旗''早''就算''种子''心连心''30''门''说梦话''率领''长长的''紧''介支格''井''河边''清晰可见''热爱''男女老少''掩护着''白塔''最深''无比''混乱''深根''实行''法西斯蒂''不知''伟大领袖''染红''永夜''大雨''失去''苦干''肥来''绿树''安康''拥抱''南海''可爱''生产''花朵''离去''月色''下''现在''真心''低头''天安门''写错''俯瞰''芦苇''So''紧紧''歌颂''头发''鲜''最亲''骗''或许''出卖''薄''仰望''洒满''飞去''绿色''稻''无端''37''眼睁睁''留下来''50''开车''乐曲''梳子''光辉''哪请''扬鞭''签''索玛''游击队''皮鞭''金灿灿''威武雄壮''离别''八年''大到''朝阳''家家户户''丰润''落''酒''远方''不落''打败''读书''我愿''拨弄''。''庄严''只生''赣江''幸福''跨''云海''哨所''进''小黄花''44''闭上''牛''越来越少''样子''九月''化''温习''浪潮''颂''东洋''河西''城墙''千山万壑''输赢''抵抗''多久''清''爱将''试着''云雾''扫荡''抗战''岩上''已''盘''白莲花''摆''再也''搅拌''背''水''等''多年''儿记''相爱''拜拜''石上''金星''正''在历史上''万丈''听''咱''仙女''这台''道路''45''解放''扎营''啊呀''王子''愿''人民''云和雾''人心''浪漫''每晚''带领''吧''唱''足够''离''东北''捷报''后心''深''那山''反正''泥''革命队伍''下课''挺立''大庆''个人''掰''总有一天''暴风''五月''开辟''参战''红花''000''准备''星''同胞''指引''弹着''季节''水兵''枪口''山里''天色''春雷''献''不闻不问''亲兄弟''叫''童话''我家''狂''村镇''吹得''干部''面对''篝火''恋爱''千锤百炼''相约''但''收到''鲜艳''雷''我手''为什么''淙淙''边防线''四方''总有''开天辟地''蓝色''叫做''贪''破''山歌''茫茫''朝''二小''流萤''喷火''不分富''期待''大石头''没有''何所惧''黑眼圈''随处''不肯''侵略者''舄''沦亡''雨''关心''跳动''比较''天真''空嘴''每一寸''冲''歌舞升平''一片丹心''恩情''秋千''双手''叶落''如果''建设''心碎''奔腾''白色''带走''心''披荆斩棘''几千''山峰''城堡''起''身边''放在''地方''天上''大''星空''荷花''蓬勃''井岗山''搞砸''尽''碧水''怒吼''高歌''现代化''个''海里''40''划出''海防''长得''飞''5''47''凉爽''骗骗''一样''挂''两万五千里''容易''玫瑰''善变''崭新''仿佛''乒乒乓乓''十分''腐烂''停留''河东''平常''开''毛泽东思想''侵犯''如火遍''根据地''埋藏''听惯''鲜花''睡''革命道路''打越''多少''共产主义''狂乱''稻田''映照''心中''天空''包围''14''如今''拼到底''飘荡''翅膀''瓜''拱手让人''炮声''勤恳''贡献''下雨天''片片''大道''岁月''鲜红''不动''痴心''拉着''爱情故事''琴声''吉祥''错过''把''割断''四下里''尽寒枝''春天''风沙''王二小''指路''雨水''万朵''同志''那些''四周''孤雁''铺''盛开''思念''意外''有情''照遍''游击''海南岛''骄傲地''一望无边''落叶''我身''火红''斜阳''‘''忍住''大海''脚下''我心''离开''曲折''飞来''进入''万山''誓''爱过''战略''进攻''39''张开''大刀''翻江倒海''毛主席''身旁''若''祥和''甜如蜜''雄伟''青春''钟''外''人人''下河''万年''抚育''无法''那天'',''清晰''丈''绑票''海''泪''喜讯''勒''出现''一片''忠于党''一遍''狠心''哗啦啦''浇灌''红星''迎''居住''红台''五彩''种田''田间''从此''日照''一丝丝''认识''刀''冰霜''雪''隆''绕''不到''He''拥''万代''戈壁''耸立''井架''献给''回家''比''当初''大地''痛苦''那么''弟兄''儿女''坚持''一首歌''东方红''发现''荡起''抱定''滑落''机关''奔''曙光''工作''23''一季''公寓''情书''囚禁''平凡''如''荣光''真的''不怕''带路人''昏暗''儿''七送''花落''民主''思想''雕龙''这天''会''独行''可惜''这''童年''每个''声响''炊''更好''外衣''过往''驱散''斗志昂扬''从来''雷电'')''勤劳''向阳''经过''挑''兵强''侵衣骨''鲜血''丢''他们''军''心肠''黑夜''连''下送''道''行列''追问''飞奔''流''行驶''告白''逼''隅''航程''我该''走''粮如山''徘徊''展翅飞翔''男人''映''团结''开启''高山''46''告诉''响叮当''\n''侧耳''放牛''又''繁荣''飞过''歌唱''军旗''种''留下''伐木''传捷报''片刻''流言蜚语''结果''25''泉罗''秋天''难''多保''双飞''我能''拥有''天地''流眼泪''求求''学会''队伍''何必''背影''43''锻炼''辛劳''黄河''发奋图强''一弯''亭''金鼓''大路''陪''谷穗''简单''凯旋''怕''亲爱''旧社会''好像''充军''风传''人潮''适合''煤矿''到处''山巅''即将''山间''写给''整个''秧苗''一''压迫者''已经''之情''肆无忌惮''债''制度''嗨哟''钢''风烟''太多''诺言''方向''可是''快乐''粮''坚''最''老乡''一条''带风''华北''似人''山上''声声''昆仑''脸''同甘苦''当有''定''抓住''感情''穿''空气''除了''.''万水千山''恋人''还有''头''再见''...''映山红''他''将''千重''歌儿''一直''清波''躲过''温柔''海岸''浓烈''齐''冲动''眼神''(''最苦''慢慢''铁锤''34''一颗''江畔''传遍''反''一家人''田野''山''再''红梅赞''灭亡''接受''明''乳汁''北京''以为''36''这些''飘处''相恋''无论''多''神枪手''敢''生命''百鸟''手指''干劲冲天''灼身''冬夏''最贵''爱上你''拳头''我用''首都''社会主义''党''所有''唱支''合唱''一间''楼房''红色''乎''记忆''里瑟''无计可施''宽''主席''春''秋风''汗珠''别人''树上''根''那''兵''言语''难过''分''一心''黄昏''肥大''海军''弯弯的''飞舞''揍''古早''完''石岩''军民联防''好不容易''荡''转危为安'':''灿灿暖''岸上''安歇''野茫茫''点头''照耀''人马''无限''战胜''绿草''人们''消失''风吹''海来''瑟罗''学校''起伏''敌后''求''困难''一棵''最暖''敌人''慌乱''好处''泪淋林''宝藏''熬煎''咱全''天有''麦浪''不能''大河''地下''名字''鹅毛雪''繁荣富强''不见''走向''看见''美好''号召''我租''奔驰''城''迷人''棵''步伐''那个''河畔''光明''剩下''各''革命''有种''叶''拼命''人''、''一首''成长''等到''放下''搭''矢掉''不变''逃不了''吹''胜利''割下来''百灵鸟''流过''纯''满腔''虽然''挥动''条条''幻灭''地''杯''躺''救星''云天''迎接''城乡''20''没差''拒绝''当''9''铜壁''没想到''天罗地网''捱''不可''受''因为''各族人民''起来''铝盔''虚伪''气质''热血''不歇''凶''花店''千军万马''决不''仍然''地平线''偏偏''新长征''荡秋千''征途''扎''牛儿''十送''阻挡''梦境''包谷''衣裳''碰''笑''嘉''钢枪''鸟儿''可有可无''任性''来''在''与非''五星红旗''咖啡''长虹''这是''红光''直到''甜蜜''走过''断粮''轻触''路旁''怀抱''屈辱''后来''!''---''唇''霞光''一群''森林''奔跑''摆下''最红''欢笑''心上''疲倦''胸怀''鸿雁''浩浩''志士''中华儿女''能够''不尽''两岸''了解''万''猪''想念''15''自力更生''红心''才能''向前走''节日''嘱咐''工厂''不需''配有''满船''Si''放眼世界''想起''黎明''往年''河北''时时刻刻''枪尖''住''野果''卖''闪''巍然屹立''不吃''四万万''高空''哨兵''灯''倒影''举起''几何''河水''人烟''—''边迎''正在''家''身上''昂首''寒冬''花香''眼前''好似''万古流芳''响雷''在乎''泉水''飞行员''’''一片片''明亮''硕果''春风''孤单''遍''保''身披''吹遍''抱歉''13''吗''碧绿''高楼大厦''风儿''48''犯''熟''后面''往事''不期而遇''志越''百姓''追''甘心''路途''青山''天亮''是不是''能''品尝''多么''目的''千千万万''朝着''蓝蓝的''一天''携手前进''微带''如同''闯''伤心欲绝''官兵一致''却''生长''一座座''山岗''们''枪''说''战鼓''暗恋''是否''心脏''白玉''绿油油''功绩''坚固''归来''烈日''江''马儿跑''庄稼''烧伤''过''从前''战斗''胸怀祖国''童话故事''水中''憔悴''国家''英豪''重围''时间''睦邻''千年''夜深人静''许多''放弃''爱祖国''柔情''不了''心意''往下''伟大''传扬''松树''金丝鸟''雾气''为了''风雪''更''自由''动''32''果树''曾用''热泪''河流''千万颗''忘掉''灯光''主人''汉''湿透''原野''孩子''天天向上''线''飞翔''坚决''丛中''百花''斗争''不分''纷飞''女''..''着''起雾''守卫''前奏''比铁''铁''伤悲''边疆''毡''犁锄''炉火''越过''地活''传''搏斗''饭碗''巍峨''垫''气焰''催''回到''灿烂辉煌''埋葬''呼吸''啊''光彩''心扉''斩浪''之歌']['为''歌唱祖国''瞄准''唉''滋味''柱''忍不住''全''理想''容不下''农奴''不曾''扬波''宽广''战旗''开了花''军队''唱的歌''红太阳''叫儿''19''后方''染''我会''五斗''摇''乐''艰苦奋斗''晴空万里''端起''寒''宿营地''纵情歌唱''被''强盗''记得''"''小河''似海''抢占''万里''温暖''自己''今年''牧民''野鸭''天天''鸟''转''成群''一杆''水流''海空''......''用''决定''努力''故事''彩霞''打''放声''死亡''忽然''藏''士兵''27''汽车''平静''每''香飘''想要''结成''最美''路程''就别''随''三年''带路''可以''太行山''心头''天上飞''新天地''不幸''沙洲''长江''一声''创''民族''像''独立''营造''认份''红墙''悲伤''阳''人民共和国''美如画''用心''万丈光芒''北斗星''一送''默默''承受''受不了''燃起''碎''靠''问''环绕着''曾经''轻轻''某一人''指望''描绘''过去''绿浪''明媚''泪汪汪''东方''黄莲脸''比钢''林带''照得人''小小''土枪''天涯''21''41''挽手''比天''梦中''空中''整座''屋檐''投降''美''顽强''声'';''劈涛''身暖''火炬''整''革命理想''这么''山高水''拣''跳''轻易''细雨''日夜''遥''金黄''哟''客人''背叛''星星''说服''青纱帐''小鸟''密密的''前方''以后''清楚''千秋万代''小''花瓣''合''冷风吹''出来''来到''10''麦穗''明白''看惯''慈悲''奢侈''江岸''处处''满地''昏头昏脑''天涯海角''它们''崩''一年''南泥湾''树树里''不甜''有人''迎面''风在''掉下来''野鹿''祝福''严寒''牛羊''画''心胸''荣耀''边上''解放战争''锦绣河山''开出''五谷''好比''介支个''战马''愤怒''丰收''坦平''者''最好''雪山''事业''眼中''那年''不问''的话''长征''年''围屏''春常''罗''情深谊长''目光''驱''觉得''照''修起''亲吻''没''有''兴旺''一生''千金''盼''向''抹''千里''依靠''站岗''害怕''依然''怀念''遇到''共产党''瓜果''苍老''穷''花蓝''中华民族''阳光灿烂''雄心''迎着''26''羊''憧憬''战鹰''密''踢''硬''尚''绵绵''画面''相连''香榭''回乡''模糊''淋''改造''忙''壮大''49''开在''一些''泛起''栋梁''深情''平原''卷''若要''花园里''每根''谁''不进''一朵朵''造成''很小''到''阿姨''炮''松柏''模样''真''人来人往''遮盖着''红蓝''您''面容''放''硬骨头''去''迷路''热恋''它''子弹''顶天''远''里格''只在乎''江山''衷心''缠绕''双双''坚定不移''巷子''早上''百''心甘情愿''要是''时刻''我度''日本''诉说着''开遍''Do''品格''开始''出生''光''理由''不该''金色''不悔''回山''任人宰割''伟大祖国''走远''领导''自''塔影''买''望见''紧握''白鸽''盖成''红棉''巨人''18''挽救''寄''梧桐''42''欢庆''贴近''伴着''临江''景''晚''月亮''公路''后''滚滚''种豆''传颂''无故''喜悦''原油''山高林''天不怕''代表''秒''曾''?''鼓''相距''脸上''前面''昆仑山''改变''每条''十三岁''天''漫步''就''安全''迎春''山坡''距离''红军''轻抚''梯田''杀败''开满''寂寞''Music''举动''匆匆''受罪''群众''很近''花儿''开放''一唱''时光''战线''跨过''比翼''路上''海疆''掩'')''结局''种瓜''大寨''挣开''怀中''碎片''组合''五指山''命运''山河''八一''?''落花''天堂''骑兵''顺从''赞美''血肉''群山''逞凶''沸腾''棒棒''承诺''人为''紧闭''微笑''强国''感觉''那时''拿''这个''大家''延长''支离破碎''毕竟''扬起''无情''人民战争''并蒂''当个''赶''富''波浪''现阶段''淌''彻底''这样''!''才''日子''哭''旁''普照大地''只''分享''亲人''夺''船上''前进''人生''阵阵''天明''唤醒''雄鹰''几时''嘿''轰隆隆''中原''靳逞''滋润''情歌''初见''提醒''上''牧羊''自有''完全''立''我们''到底''里''满带''情绪''站''蒋匪''千言万语''12''海洋''没看''达到''离不开''不要''饼''无所谓''吼叫''如何''17''放肆''分开''疼''爱情''街道''中''那里''就要''跟''作和声''管它''野菜''动人''保卫祖国''赛呀赛''气球''硬撑''呵''走心''工人阶级''什么''风中''街''年少''得儿''北国''之前''格拉''祖国颂''万年青''慌''La''男''爱上''不敢''边''喔''并''6''好威风''生活''坚强''战场''继续''心事''晴天''冰冷''寒冬腊月''夕阳''留''机器''追忆''找寻''迷失''收起''躲''早日''美丽''不忍''高''虎豹''无''妻子''别''身''太''发出''家乡''风光''暖''唇印''来来来''风吹雨打''些''以往''团结友爱''蔼''不屈''看着''难有''只会''秘密''丰满''画凤''错''熬过''爱''写''变成''高高的''草原''雅鲁藏布江''三送''带''遭殃''春光''怎么样''亮''母亲''双唇''人民军队''沉睡''心太急''掉落''棉似''银光''世界''这里''夜里''知道''鲤鱼''份''晚霞''日记''每束''挽回''7''惊起''路开''歌声''红领巾''浪''围剿''等待''哪里''见''.''上前''软弱''井冈山''平安''地响''心里''勇敢''怎能不''金光''我爱你''在所难免''过握''乌云''强大''温热''思情''矫健''醉人''给''山野''主张''双桨''勇士''海浪''海员''阻止''眼泪''借''时候''草毯''仇恨''终于''开火''遍地''壮丽''舌''玩耍''西施''爱家乡''不会''气势''~''不必''含着''打天下''咿儿''忘''我要''拜''放晴''毛泽东''蝴蝶''长茧''可''哄''里个''痴''良田''建立''古老''高中''守护''推开''树''路''苦难''耳机''了''狠''不''丰富''竞相''Re''一夜''燃烧''这片''叔叔''云朵''高于''血染''爱心''但是''无边''口中''天寒地冻''看不见''东风''红梅''最怕''救''放不下''无声''新''朝霞''战士''烽火''千百里''蓝天''迷恋''羽毛''渐渐''一扇''穿梭''无味''石油''加快''说出''接过''分派''飞行''可会知''边防军''三九''英雄''军民鱼水''彩门''过得''小船''下面''气势磅礴''惊涛骇浪''作''门窗''农隶''教室''常青''中南海''烟波''任''计较''头顶''枯萎''自我''沿着''柔软''唱歌''后悔''写下''永不''宿舍''滚烫''心像''照样''踩''第一回''子弟兵''翻''同样''响亮''收豆''借口''山沟''铁路''真相''侧后方''决心''梦之旅''轰响''感到''白帆''身体''鱼''青蓝''天使''保证''还要''矢''哪怕''无数''笑声''赞颂''希望''阵线''钢铁''永远''号子''全都''很''伤感''得''伤害''树林''可能''望月''鞭子''河''高原''全世界''无际''想''一起''缠''鱼水''感染''眼睛''碧波''错觉''万泉河''铁墙''任随''迎风''敌歼''头戴''懂''晃到''谋''日''知己''music''姑娘''一般''我亲''昨天''岭上''付出''矿山''古城''开心''白杨树''四面''飘落''辉煌''还是''那样''从无到有''-''遇见''看作''大旗''约会''33''乱冲''筑成''倒映''一齐''永''晚灯''印''此刻''敲''对''哀号''擦肩而过''无怨无悔''壮''真情''青草''风雨''甜蔗''时''旁边''陕北''流泪''长''每日''每天''天顶''前途''随风飘荡''35''相信''油桐''飘''抗日''嗨''保卫''占据''果儿''枪炮''靠着''挥霍''严阵以待''允满''瑞金''宽畅''气息''指尖''呀''危急''向着''湖边''小心''课''荒原''心窝''工农''双眼''骗人''塞纳河畔''从今''天山''战舰''泥土''骄傲''车窗''毡房''海面''久''怎能''十万''兄弟''小伙儿''只要''颠倒''完整''白云''怨''无论谁''涌''独''来自''胸口''建造''舍生忘死''工人''31''船儿''手握''象征''中国''吼''万岁''安排''湖中''树下点''突破''彷佛''首创''草地''英勇''需要''爆破筒''就此''时想''像是''高梁''赛''收成''绿''翘''珍惜''踪和影''不盼缘''真不少''充满''冷漠''坚定''捎信''抽''赞''秋日''土地''仍''24''深处''长矛''天山南北''心儿''砸碎''有多美''早餐''豺狼''远客''看到''畏畏缩缩''高台''二月''怒目''胸中''阵地''38''迈开''流水''感应''强''共''依旧''一句''波澜壮阔''捐些''名叫''响起''喜欢''鞭儿响''林海''28''飘飘''情意''换''he''蛋''我试''摔死''再美终''还''书信''忧伤''翻身''一点''成功''力量''皑皑''如铁''想像''闪闪''日落''消灭''首歌''袂''知难而退''湖水''洋枪''家园''讲''出''看透''铁锁链''苦苦''和''强求''一层层''时代''黑暗''亲手''16''马''闹革命''好好''嘴''不理''说谎''五送''九送''前程''怎么''意义''窗''所以''越''白雪''愿意''但愿''感谢''手''她''艄公''灿烂''亲善''最爱''长城''无踪''磨''扩张''红旗飘飘''唯一''辽阔''埋伏圈''海防线''火车头''脚边''好''山冈''牺牲''青松''象''有点''始终''吻''响''摘''也许''坡''从''看吧''猎枪''广场''缘分''太阳''哎''赞歌''变了样''交换''荷塘''咆哮''变''看''11''盼望''如钢''年老''难受''捡''荒山''得到''大树''新春''捎''满''歌''刮风''肥''旧''勇气''走入''四年''花言巧语''…''加紧''武装''必死''彩蝶''烟成''高举''山路''变冷''一会儿''回来''俺''夏天''回''拥挤''红''肯定''海深''差错''就象''梦''没考上''山头''向前''(''撒下''祖国''良心''阳光''抬头''离骚''冷''琴''真爱''一条心''和平''江南''天安门广场''根本''珍珠''买卖''让''充饥''似''礼物''年代''好山好水''撩乱''年轻''香''彩''含''放手''同''草''一杯''挣扎''望''升起''明天''随便''百万''劳动''十丈''一整瓶''一回''朋友''一个''送郎''改善''颂歌''指''活下去''8''村庄''找''青年''吃''大学''万古''痴情''今天''离人''渠水''伤''一阵阵''太阳升''22''也''巡逻''朵朵''垂危''愉快''领袖''操场''咱们''不怕难''放牛郎''.......''撒''清泉''要''照得''冷冷的''延安''与''最后''骏马''听到''影子''煮''原来''说唱''谁种''左岸''跟着''反攻''认真''掌权''忍受''交错''都''会试''城市''不是''风''就是''4''变迁''花''飘扬''待''诶''怒放''卑污''算''湘''展''夜半三更''云霞''无敌''成就''千万''抬起''呼儿''锣儿''造''献身''哪儿''呦''安慰''意气风发''做''回忆''掉''请''十六''一切''再次''送''红旗''早''就算''种子''心连心''30''门''说梦话''率领''长长的''紧''介支格''井''河边''清晰可见''热爱''男女老少''掩护着''白塔''最深''无比''混乱''深根''实行''法西斯蒂''不知''伟大领袖''染红''永夜''大雨''失去''苦干''肥来''绿树''安康''拥抱''南海''可爱''生产''花朵''离去''月色''下''现在''真心''低头''天安门''写错''俯瞰''芦苇''So''紧紧''歌颂''头发''鲜''最亲''骗''或许''出卖''薄''仰望''洒满''飞去''绿色''稻''无端''37''眼睁睁''留下来''50''开车''乐曲''梳子''光辉''哪请''扬鞭''签''索玛''游击队''皮鞭''金灿灿''威武雄壮''离别''八年''大到''朝阳''家家户户''丰润''落''酒''远方''不落''打败''读书''我愿''拨弄''。''庄严''只生''赣江''幸福''跨''云海''哨所''进''小黄花''44''闭上''牛''越来越少''样子''九月''化''温习''浪潮''颂''东洋''河西''城墙''千山万壑''输赢''抵抗''多久''清''爱将''试着''云雾''扫荡''抗战''岩上''已''盘''白莲花''摆''再也''搅拌''背''水''等''多年''儿记''相爱''拜拜''石上''金星''正''在历史上''万丈''听''咱''仙女''这台''道路''45''解放''扎营''啊呀''王子''愿''人民''云和雾''人心''浪漫''每晚''带领''吧''唱''足够''离''东北''捷报''后心''深''那山''反正''泥''革命队伍''下课''挺立''大庆''个人''掰''总有一天''暴风''五月''开辟''参战''红花''000''准备''星''同胞''指引''弹着''季节''水兵''枪口''山里''天色''春雷''献''不闻不问''亲兄弟''叫''童话''我家''狂''村镇''吹得''干部''面对''篝火''恋爱''千锤百炼''相约''但''收到''鲜艳''雷''我手''为什么''淙淙''边防线''四方''总有''开天辟地''蓝色''叫做''贪''破''山歌''茫茫''朝''二小''流萤''喷火''不分富''期待''大石头''没有''何所惧''黑眼圈''随处''不肯''侵略者''舄''沦亡''雨''关心''跳动''比较''天真''空嘴''每一寸''冲''歌舞升平''一片丹心''恩情''秋千''双手''叶落''如果''建设''心碎''奔腾''白色''带走''心''披荆斩棘''几千''山峰''城堡''起''身边''放在''地方''天上''大''星空''荷花''蓬勃''井岗山''搞砸''尽''碧水''怒吼''高歌''现代化''个''海里''40''划出''海防''长得''飞''5''47''凉爽''骗骗''一样''挂''两万五千里''容易''玫瑰''善变''崭新''仿佛''乒乒乓乓''十分''腐烂''停留''河东''平常''开''毛泽东思想''侵犯''如火遍''根据地''埋藏''听惯''鲜花''睡''革命道路''打越''多少''共产主义''狂乱''稻田''映照''心中''天空''包围''14''如今''拼到底''飘荡''翅膀''瓜''拱手让人''炮声''勤恳''贡献''下雨天''片片''大道''岁月''鲜红''不动''痴心''拉着''爱情故事''琴声''吉祥''错过''把''割断''四下里''尽寒枝''春天''风沙''王二小''指路''雨水''万朵''同志''那些''四周''孤雁''铺''盛开''思念''意外''有情''照遍''游击''海南岛''骄傲地''一望无边''落叶''我身''火红''斜阳''‘''忍住''大海''脚下''我心''离开''曲折''飞来''进入''万山''誓''爱过''战略''进攻''39''张开''大刀''翻江倒海''毛主席''身旁''若''祥和''甜如蜜''雄伟''青春''钟''外''人人''下河''万年''抚育''无法''那天'',''清晰''丈''绑票''海''泪''喜讯''勒''出现''一片''忠于党''一遍''狠心''哗啦啦''浇灌''红星''迎''居住''红台''五彩''种田''田间''从此''日照''一丝丝''认识''刀''冰霜''雪''隆''绕''不到''He''拥''万代''戈壁''耸立''井架''献给''回家''比''当初''大地''痛苦''那么''弟兄''儿女''坚持''一首歌''东方红''发现''荡起''抱定''滑落''机关''奔''曙光''工作''23''一季''公寓''情书''囚禁''平凡''如''荣光''真的''不怕''带路人''昏暗''儿''七送''花落''民主''思想''雕龙''这天''会''独行''可惜''这''童年''每个''声响''炊''更好''外衣''过往''驱散''斗志昂扬''从来''雷电'')''勤劳''向阳''经过''挑''兵强''侵衣骨''鲜血''丢''他们''军''心肠''黑夜''连''下送''道''行列''追问''飞奔''流''行驶''告白''逼''隅''航程''我该''走''粮如山''徘徊''展翅飞翔''男人''映''团结''开启''高山''46''告诉''响叮当''\n''侧耳''放牛''又''繁荣''飞过''歌唱''军旗''种''留下''伐木''传捷报''片刻''流言蜚语''结果''25''泉罗''秋天''难''多保''双飞''我能''拥有''天地''流眼泪''求求''学会''队伍''何必''背影''43''锻炼''辛劳''黄河''发奋图强''一弯''亭''金鼓''大路''陪''谷穗''简单''凯旋''怕''亲爱''旧社会''好像''充军''风传''人潮''适合''煤矿''到处''山巅''即将''山间''写给''整个''秧苗''一''压迫者''已经''之情''肆无忌惮''债''制度''嗨哟''钢''风烟''太多''诺言''方向''可是''快乐''粮''坚''最''老乡''一条''带风''华北''似人''山上''声声''昆仑''脸''同甘苦''当有''定''抓住''感情''穿''空气''除了''.''万水千山''恋人''还有''头''再见''...''映山红''他''将''千重''歌儿''一直''清波''躲过''温柔''海岸''浓烈''齐''冲动''眼神''(''最苦''慢慢''铁锤''34''一颗''江畔''传遍''反''一家人''田野''山''再''红梅赞''灭亡''接受''明''乳汁''北京''以为''36''这些''飘处''相恋''无论''多''神枪手''敢''生命''百鸟''手指''干劲冲天''灼身''冬夏''最贵''爱上你''拳头''我用''首都''社会主义''党''所有''唱支''合唱''一间''楼房''红色''乎''记忆''里瑟''无计可施''宽''主席''春''秋风''汗珠''别人''树上''根''那''兵''言语''难过''分''一心''黄昏''肥大''海军''弯弯的''飞舞''揍''古早''完''石岩''军民联防''好不容易''荡''转危为安'':''灿灿暖''岸上''安歇''野茫茫''点头''照耀''人马''无限''战胜''绿草''人们''消失''风吹''海来''瑟罗''学校''起伏''敌后''求''困难''一棵''最暖''敌人''慌乱''好处''泪淋林''宝藏''熬煎''咱全''天有''麦浪''不能''大河''地下''名字''鹅毛雪''繁荣富强''不见''走向''看见''美好''号召''我租''奔驰''城''迷人''棵''步伐''那个''河畔''光明''剩下''各''革命''有种''叶''拼命''人''、''一首''成长''等到''放下''搭''矢掉''不变''逃不了''吹''胜利''割下来''百灵鸟''流过''纯''满腔''虽然''挥动''条条''幻灭''地''杯''躺''救星''云天''迎接''城乡''20''没差''拒绝''当''9''铜壁''没想到''天罗地网''捱''不可''受''因为''各族人民''起来''铝盔''虚伪''气质''热血''不歇''凶''花店''千军万马''决不''仍然''地平线''偏偏''新长征''荡秋千''征途''扎''牛儿''十送''阻挡''梦境''包谷''衣裳''碰''笑''嘉''钢枪''鸟儿''可有可无''任性''来''在''与非''五星红旗''咖啡''长虹''这是''红光''直到''甜蜜''走过''断粮''轻触''路旁''怀抱''屈辱''后来''!''---''唇''霞光''一群''森林''奔跑''摆下''最红''欢笑''心上''疲倦''胸怀''鸿雁''浩浩''志士''中华儿女''能够''不尽''两岸''了解''万''猪''想念''15''自力更生''红心''才能''向前走''节日''嘱咐''工厂''不需''配有''满船''Si''放眼世界''想起''黎明''往年''河北''时时刻刻''枪尖''住''野果''卖''闪''巍然屹立''不吃''四万万''高空''哨兵''灯''倒影''举起''几何''河水''人烟''—''边迎''正在''家''身上''昂首''寒冬''花香''眼前''好似''万古流芳''响雷''在乎''泉水''飞行员''’''一片片''明亮''硕果''春风''孤单''遍''保''身披''吹遍''抱歉''13''吗''碧绿''高楼大厦''风儿''48''犯''熟''后面''往事''不期而遇''志越''百姓''追''甘心''路途''青山''天亮''是不是''能''品尝''多么''目的''千千万万''朝着''蓝蓝的''一天''携手前进''微带''如同''闯''伤心欲绝''官兵一致''却''生长''一座座''山岗''们''枪''说''战鼓''暗恋''是否''心脏''白玉''绿油油''功绩''坚固''归来''烈日''江''马儿跑''庄稼''烧伤''过''从前''战斗''胸怀祖国''童话故事''水中''憔悴''国家''英豪''重围''时间''睦邻''千年''夜深人静''许多''放弃''爱祖国''柔情''不了''心意''往下''伟大''传扬''松树''金丝鸟''雾气''为了''风雪''更''自由''动''32''果树''曾用''热泪''河流''千万颗''忘掉''灯光''主人''汉''湿透''原野''孩子''天天向上''线''飞翔''坚决''丛中''百花''斗争''不分''纷飞''女''..''着''起雾''守卫''前奏''比铁''铁''伤悲''边疆''毡''犁锄''炉火''越过''地活''传''搏斗''饭碗''巍峨''垫''气焰''催''回到''灿烂辉煌''埋葬''呼吸''啊''光彩''心扉''斩浪''之歌']

前面说过列表的长度就是数据的维度,这里的维度指的就影响结果的特征数,例如房价可能受面积、朝向、层高、房屋数量四个因素影响,那维度就是4。同样的,一首歌词是“情歌”还是“红歌”会受词表中的每词是否出现,或者出现次数影响,因此词表中的每个词都都是决定一首歌是情歌还是红歌的特征,词表长度就是特征维度。

向量化

得到词表后,我们还需要将每一首歌曲转化为计算机可处理的量化值,最简单的方式是通过词表中歌词在歌曲中是否出现或者出现次数来进行映射,这里选择第一种方式。

简单来讲我们会将要向量化的歌词先进行分词,并遍历词表数组,判断每个词是否在输入歌词中出现,如果出现,则对应位置的值设置为1,否则设置为0。

例如我们有词表['中国','喜欢','秋刀鱼','猫'],当输入歌词为“我爱你中国”时,得到的结果是[1,0,0,0],当输入值是“秋刀鱼的滋味、猫跟你都想了解”时,得到的向量是[0,0,1,1]

歌词全部向量化完成后,我们得到的数据非常类似于前面讲简单应用时给的数据,只是特征有2409个

红星

毛主席

爱情

喜欢

其他特征

歌曲1

1

1

0

0

...

红歌

歌曲2

0

0

1

1

...

情歌

数据加工

从公式中我们可以得出,当词表中存在一个输入歌曲没有的词时,计算出的概率将会直接是0导致分类失败,这个时候我们可以将分子和分母同时加上一个固定值保证不会得到零概率,这里称之为拉普拉斯平滑

当一些词在每首歌中都会出现(或者出现频率基本一致),那这些词对于分类其实是没有帮助的,例如“的”,“我”,标点符号等等,我们可以将这部分词从词表中去除来降低数据维度,减少计算量并提升识别准确度

最后一个问题是编码层面的,在计算机程序中,太多太小的数相乘超过数据类型可表示的最小值后,程序会下溢或得不到正确答案(比如四舍五入变成0),这个时候可以利用对数函数的性质ln(a*b) = ln(a)+ln(b)将乘法化为加法来解决这一问题

编码实现

  1. import jieba
  2. import numpy
  3. from sklearn.naive_bayes import MultinomialNB
  4. from sklearn import datasets
  5. #停用词表
  6. STOP_USING_WORDS = set([',',"我","你","是","的"," "])
  7. #将一句话转换为向量
  8. def sentence_to_vec(vocab_list, input):
  9.     return_vec = [0* len(vocab_list)
  10.     for i in range(len(vocab_list)):
  11.         word = vocab_list[i]
  12.         if word in input:
  13.             return_vec[i] = 1
  14.     return return_vec
  15. #创建词表,将每句话中不同词汇提取出来用于计算每句话的向量
  16. def create_vocab_list(seg_list):
  17.     vocab_set = set([])
  18.     for seg in seg_list:
  19.         vocab_set = vocab_set | set(seg)
  20.     return list(vocab_set - STOP_USING_WORDS)
  21. #分词
  22. def word_split(sentence):
  23.     seg_list = jieba.cut(sentenceuse_paddle=True)
  24.     return list(seg_list)
  25. #计算这句话在指定归类下的概率
  26. def predit(tran_sentences, tran_labels, input_words):
  27.     #创建分词矩阵
  28.     seq_list = []
  29.     for sentence in tran_sentences:
  30.         seq_list.append(word_split(sentence))
  31.     #创建词表
  32.     vocab_list = create_vocab_list(seq_list)
  33.     #创建语句向量
  34.     vec_list = []
  35.     for seq in seq_list:
  36.         vec_list.append(sentence_to_vec(vocab_list, seq))
  37.     clf = MultinomialNB()
  38.     X = numpy.array(vec_list)
  39.     Y = numpy.array(tran_labels)
  40.     clf.fit(X, Y)
  41.     #获取输入值
  42.     input = numpy.array(sentence_to_vec(vocab_list, word_split(input_words))).reshape(1, -1)
  43.     label = clf.predict(input)
  44.     print("预测结果:" + str(label))
  45. def load_datas_and_labels():
  46.     red_data_file = open("./byers/红歌.txt"mode='r')
  47.     red_lines = red_data_file.readlines()
  48.     red_text = "".join(red_lines)
  49.     red_datas = red_text.split("-----------")
  50.     red_lebals = []
  51.     for red_data in red_datas:
  52.         red_lebals.append("红歌")
  53.     love_data_file = open("./byers/情歌.txt"mode='r')
  54.     love_lines = love_data_file.readlines()
  55.     love_text = "".join(love_lines)
  56.     love_datas = love_text.split("-----------")
  57.     love_lebals = []
  58.     for love_data in love_datas:
  59.         love_lebals.append("情歌")
  60.     return red_datas + love_datas, red_lebals + love_lebals
  61. datas, labels = load_datas_and_labels()
  62. love_then_year = '''
  63. 啊...啊...啊...啊...
  64. 寒风吹起细雨迷离 风雨解开我的记忆
  65. 我像小船寻找港湾
  66. 不能把你忘记
  67. 爱的希望(时光)爱的回味
  68. 爱的往事难以追忆
  69. 风中花蕊生(深)怕枯萎 我愿(意)为你祝福
  70. 我爱你我心已属于你
  71. 今生今世不移
  72. 在我心中再没有谁
  73. 代替你的地位
  74. 我爱你对你付出真意
  75. 不会漂浮不定(移)
  76. 你要为我再想一想
  77. 我决定爱你一万年
  78. music
  79. 喔...喔...喔...喔
  80. music
  81. 我爱你一万年我爱你一万年
  82. 我爱你一万年我爱你一万年
  83. 爱你爱你哦
  84. music
  85. 我决定爱你一万年
  86. '''
  87. predit(datas, labels, love_then_year)import jieba
  88. import numpy
  89. from sklearn.naive_bayes import MultinomialNB
  90. from sklearn import datasets
  91. #停用词表
  92. STOP_USING_WORDS = set([',',"我","你","是","的"," "])
  93. #将一句话转换为向量
  94. def sentence_to_vec(vocab_list, input):
  95.     return_vec = [0* len(vocab_list)
  96.     for i in range(len(vocab_list)):
  97.         word = vocab_list[i]
  98.         if word in input:
  99.             return_vec[i] = 1
  100.     return return_vec
  101. #创建词表,将每句话中不同词汇提取出来用于计算每句话的向量
  102. def create_vocab_list(seg_list):
  103.     vocab_set = set([])
  104.     for seg in seg_list:
  105.         vocab_set = vocab_set | set(seg)
  106.     return list(vocab_set - STOP_USING_WORDS)
  107. #分词
  108. def word_split(sentence):
  109.     seg_list = jieba.cut(sentenceuse_paddle=True)
  110.     return list(seg_list)
  111. #计算这句话在指定归类下的概率
  112. def predit(tran_sentences, tran_labels, input_words):
  113.     #创建分词矩阵
  114.     seq_list = []
  115.     for sentence in tran_sentences:
  116.         seq_list.append(word_split(sentence))
  117.     #创建词表
  118.     vocab_list = create_vocab_list(seq_list)
  119.     #创建语句向量
  120.     vec_list = []
  121.     for seq in seq_list:
  122.         vec_list.append(sentence_to_vec(vocab_list, seq))
  123.     clf = MultinomialNB()
  124.     X = numpy.array(vec_list)
  125.     Y = numpy.array(tran_labels)
  126.     clf.fit(X, Y)
  127.     #获取输入值
  128.     input = numpy.array(sentence_to_vec(vocab_list, word_split(input_words))).reshape(1, -1)
  129.     label = clf.predict(input)
  130.     print("预测结果:" + str(label))
  131. def load_datas_and_labels():
  132.     red_data_file = open("./byers/红歌.txt"mode='r')
  133.     red_lines = red_data_file.readlines()
  134.     red_text = "".join(red_lines)
  135.     red_datas = red_text.split("-----------")
  136.     red_lebals = []
  137.     for red_data in red_datas:
  138.         red_lebals.append("红歌")
  139.     love_data_file = open("./byers/情歌.txt"mode='r')
  140.     love_lines = love_data_file.readlines()
  141.     love_text = "".join(love_lines)
  142.     love_datas = love_text.split("-----------")
  143.     love_lebals = []
  144.     for love_data in love_datas:
  145.         love_lebals.append("情歌")
  146.     return red_datas + love_datas, red_lebals + love_lebals
  147. datas, labels = load_datas_and_labels()
  148. love_then_year = '''
  149. 啊...啊...啊...啊...
  150. 寒风吹起细雨迷离 风雨解开我的记忆
  151. 我像小船寻找港湾
  152. 不能把你忘记
  153. 爱的希望(时光)爱的回味
  154. 爱的往事难以追忆
  155. 风中花蕊生(深)怕枯萎 我愿(意)为你祝福
  156. 我爱你我心已属于你
  157. 今生今世不移
  158. 在我心中再没有谁
  159. 代替你的地位
  160. 我爱你对你付出真意
  161. 不会漂浮不定(移)
  162. 你要为我再想一想
  163. 我决定爱你一万年
  164. music
  165. 喔...喔...喔...喔
  166. music
  167. 我爱你一万年我爱你一万年
  168. 我爱你一万年我爱你一万年
  169. 爱你爱你哦
  170. music
  171. 我决定爱你一万年
  172. '''
  173. predit(datas, labels, love_then_year)

无监督学习算法

上面我们介绍的所有算法统称为监督学习算法,这类算法可以从已标注过的训练集中得到预测函数。相对应的,无监督学习算法可以从无标记的训练数据中推断出结论,这里我介绍一种在聚类分析中常用的算法,k-means,他能将一系列数据分离成指定数量的集合。

数学原理

假设我们现在有一系列未分类的数据,按照惯例,我们画在坐标系中

k-means算法实现分类的过程很简单,分为以下几步

  1. 确定我们要将数据分为N个集合,这里我们假设需要分为两个集合

  2. 在数据空间中随机选择N个点,这里同样选取两个点

  1. 计算每个数据到选取的点的距离(这里选用欧几里得距离),并归类到距离最短的数据点的集合中,如下粉色是关联到绿点的数据,蓝色是关联到红点的数据

  1. 计算每个集合内数据的平均值,并将对应的点移动到集合平均值的位置

  1. 重复步骤3-4直到数据点不再变化,此时分类完成

我们会发现无论初始点选在什么地方,最终都会收敛到一致的分类结构中,如下是不同初始点得到的结果

算法实现

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import math
  4. import random
  5. all_points_x = [-0.061699772950100540.493401776269668970.2095444296181419, -0.52079383161979550.45422437656151260.10746365600263008, -0.5852052323013195, -0.89663341368643980.02324160428849842, -0.7923747167840338, -0.237650652209053570.6853348949870643, -0.4559711540212552, -0.39853200126241670.9270183191133377, -0.60918600786630870.5854151797931826, -0.22740774828468346, -0.4291158928234511, -0.108084630728838780.6483747030633713, -0.0117704443723687380.38444079982275390.7854935375873353, -0.6531808545885178, -0.1844683987358482, -0.34547654482793620.5159326203327808, -0.12751698130336230.347195979172376660.76950617805605080.15641961156384965, -0.69825950752707990.5372183109794928, -0.3055044418941959, -0.20496967068648986, -0.08642071552084140.202015482828580950.757379635897723, -0.2534690276281091, -0.32170578221579427, -0.3911888090915394, -0.5763880830489512, -0.7816223430784566, -0.38700634949039125, -0.06429420000332531, -0.45307037944288410.2692443884711351, -0.29192499075309410.29125031576438554, -0.4653944555432845, -0.3805237345418020.8246267864052144, -0.379868805495742, -0.203443298143481280.57495930028183670.85085681247478240.38901173217324914, -0.456837595143287260.7908780287477655, -0.62128674045573920.3325105785890310.35582921301126570.691765122910311, -0.95859609004600350.380118097445098830.58249759447781810.434447483174242, -0.71476220635213950.6864978590021817, -0.31934543493551870.2355499395852041, -0.2603930462935433, -0.4501594930778141, -0.08290733767030978, -0.373858360593869, -0.054678460170919150.21401977282358864, -0.57281651133791560.27740174438595180.38866595064865360.54914546571037230.97900363597205161.42153803352230161.95952277772183431.33593168367759361.56905347205999531.84595446531644611.69029619313784131.35805965819838281.6061102657795142.2387703375516232.06852187229484351.52075529008679041.13565742361265490.445910912144514842.1684466927660021.60784898382911920.82469369906824521.48466756003186441.12705033486319371.10701771853275790.55193902052439681.2395538733245421.12290564096605431.39545233368719821.45473507149247341.9669579629011581.56413277356898961.89624860784038281.71800854850353081.30801844132296631.52132797021714831.06093526802236451.19536631932738451.10591277006888380.70949090457014860.50958450261824330.61098069180374911.09928515423371521.98071888335300272.0706220999855741.77279640780200821.03670431487244931.85618857188108821.479514847113550.467865723697262761.75114961368382721.45221332319116822.04105508163887571.91529794231102171.40782902495777361.16388803668285681.25554289130438470.54994533941341351.54514733692918571.30796595054146270.80340373357587480.374909669157835750.81281534275754521.05170758605476422.15419619686917941.34990537307912820.73095627034368780.95872688799339081.26572687308128321.38485513889413661.4042966243167410.97926398297893010.89994948539649681.53835053106434042.1912137980805891.63421634098514132.19415455201109570.55190006557699011.36033680386720920.86752943210383241.29669057414181931.7202574714238151.10764145408333732.0571123623255830.74722523634911771.77339617096366191.3960167449313510.66117105195255881.3265165157335990.79160386856622360.74120921897037341.03036459206829581.38900498116715121.27406806051580611.30460182131829530.48460764887369391.77449162766016521.27675756609242530.63597735479846211.1980340821900061.1427092686315011.74919418610605071.69239306295490670.58963844924056261.66707573856353751.75837740898697041.29737162632504450.87562396893357371.49640201557669551.33457571600760041.9249880366629091.40977546690430880.91873574749520461.93400411025314131.93534713176952882.0852948672583341.93740728822607181.68621762705642151.5256142021659281.01984807024307570.97473037861936841.95801111242187580.63973615934360460.59726970243298431.28527622980453061.59297890769776361.10234063876310630.80272566338643441.14173749325149791.88458667778175770.88724814843461561.67494220392458651.48576175364854631.48068764297580420.465224210597578461.38408836644043642.05499609773467370.987729541539375]
  6. all_points_y = [0.57866290120409290.23725850581139074, -0.7597284370567770.50613740123790470.7441019928234256, -0.2341586670016378, -0.17715487147648080.37126813836175954, -0.72480619094170740.234760614589009320.78576783253354020.29290916488888910.5775833837561508, -0.8105102193724782, -0.19851918010980962, -0.1014198664209820.39656243892847254, -0.7763093995790680.2746959812774157, -0.2896510339262468, -0.0112630780925599970.91706074031057550.15756804496865562, -0.32035512114973574, -0.2792133279966391, -0.6080649765496857, -0.054957447064748030.24113020293338572, -0.4722309866405694, -0.215824736156179360.5289289988275705, -0.157703741236057350.2708307529335805, -0.02591109190708840.272090346336039570.73768218429990680.82677956682107980.75034794637860760.153955045301822580.8175971407055236, -0.6631410705598126, -0.037431458903081970.270928852862211360.1980486518604816, -0.49061784598343630.31882474169139920.7497113822202737, -0.7215856267750183, -0.29822276794782490.6151431042261353, -0.54802739122504640.81433264025689690.43056054782928020.56328189908115010.16759390174355860.45921860652780677, -0.108779573762570970.124831306414402880.116573943099873570.55046198215311850.02423576395578486, -0.498466373194481840.8459527245358385, -0.1384617388649556, -0.170507531155140060.180327688322205140.47598408495633304, -0.23060832147119492, -0.13320532983954902, -0.29863287662603090.072917536293192640.8132848820287741, -0.7777105658470398, -0.07344030840151827, -0.7042615804798618, -0.678077292913815, -0.92212106212550630.100978496667982750.257219447008997460.8975584116222655, -0.073205178399183391.60230628871747041.54477659351275440.5876770572093970.9681337794484082.27753931149661961.02310951239926331.63352837839009051.08649537491475812.1962446948188560.90659995220387651.4199032845227451.19508406535647431.81747630212785131.39793324915153331.79443899474001031.44455392959493352.07816885157786931.2728267089034091.5353372507497152.1062612410038512.1839755600092130.99914571071284821.71763902180607840.82473393716771150.3397904268007641.15545486120944131.61147191043959742.17216702553459041.97677412288367551.07289939833015711.0270749475726821.70160857215447271.04914554188358441.35794326406223841.60015947771312741.93284751203209031.33731173692439141.1622316718529452.19395102229357831.96185881714055551.7354675322852060.87470452110598781.08032923835074081.3193607957532461.4048490706448220.86776458470048781.34276117853337371.93123263775661870.75796029798545721.13764348313939710.387927657582830540.62757976441956412.0076381932562280.68042118075074382.23352209983544641.54641807737520121.45516704633460671.13355891163386112.1478260081083691.03374701371367241.37519229226354020.78515699131089361.18150354986327981.35645876039400932.1615922935329242.05282688012038641.66327097126446291.16463184678840870.61134801327225650.92415986956921830.89720593324890192.02896985991126751.6037969147931431.65391763829341220.386764782013950261.9461754706483770.90273349228639610.9061084805633840.50657331639764271.39890678905608650.53397380801030571.7173512049646450.78893822988414461.59076236202702730.66411018333167321.247804599457972.0101063323703721.8136625479624891.5481743560675070.71131642861385070.8064043461059451.2944364675082311.6020190222862530.88955009305700221.77443845894536611.31338068797953330.66639452923998370.70225935149047241.86461520049568461.49591607949723811.8016441063250110.95278237037446370.36198449582827920.70517276076734411.56465219831070051.17064095735346261.93276312468686531.84986700515121341.40009972112497330.71943725417489831.8108392179861610.7430873251930921.6290998668980661.33333985364727340.92647489379101830.51817596614958550.54652253512868341.97105511724615610.76373648973651011.34648051624017271.32459173364448230.897513484999991.45888284839478422.00995247606969670.395149633043522241.08999050070548550.428429713648176841.80596502557399341.66135116756561780.7719669476216090.98304994976917031.15406484400416391.20427925589094721.6663794995184622]
  7. start_green_point = [0, -1]
  8. start_red_point = [00]
  9. def step(red_point, green_point):
  10.     red_points_x = []
  11.     red_points_y = [] 
  12.     green_points_x = []
  13.     green_points_y = []
  14.     
  15.     average_red_point_x = 0
  16.     average_red_point_y = 0
  17.     red_point_num = 0
  18.     average_green_point_x = 0
  19.     average_green_point_y = 0
  20.     green_point_num = 0
  21.     
  22.     for i in range(len(all_points_x)):
  23.         point_i_x = all_points_x[i]
  24.         point_i_y = all_points_y[i]
  25.         red_distance = ((point_i_x - red_point[0]) ** 2 + (point_i_y - red_point[1]) ** 2/ 2
  26.         green_distance = ((point_i_x - green_point[0]) ** 2 + (point_i_y - green_point[1]) ** 2/ 2
  27.         if red_distance <= green_distance:
  28.             red_points_x.append(point_i_x)
  29.             red_points_y.append(point_i_y)
  30.             red_point_num += 1
  31.             average_red_point_x += point_i_x
  32.             average_red_point_y += point_i_y
  33.         else:
  34.             green_points_x.append(point_i_x)
  35.             green_points_y.append(point_i_y)
  36.             average_green_point_x += point_i_x
  37.             average_green_point_y += point_i_y
  38.             green_point_num += 1
  39.     print(red_point_num, green_point_num)
  40.     return red_points_x, red_points_y, green_points_x, green_points_y, [average_red_point_x / red_point_num, average_red_point_y / red_point_num],[average_green_point_x / green_point_num, average_green_point_y / green_point_num]
  41. import numpy as np
  42. import matplotlib.pyplot as plt
  43. import math
  44. import random
  45. all_points_x = [-0.061699772950100540.493401776269668970.2095444296181419, -0.52079383161979550.45422437656151260.10746365600263008, -0.5852052323013195, -0.89663341368643980.02324160428849842, -0.7923747167840338, -0.237650652209053570.6853348949870643, -0.4559711540212552, -0.39853200126241670.9270183191133377, -0.60918600786630870.5854151797931826, -0.22740774828468346, -0.4291158928234511, -0.108084630728838780.6483747030633713, -0.0117704443723687380.38444079982275390.7854935375873353, -0.6531808545885178, -0.1844683987358482, -0.34547654482793620.5159326203327808, -0.12751698130336230.347195979172376660.76950617805605080.15641961156384965, -0.69825950752707990.5372183109794928, -0.3055044418941959, -0.20496967068648986, -0.08642071552084140.202015482828580950.757379635897723, -0.2534690276281091, -0.32170578221579427, -0.3911888090915394, -0.5763880830489512, -0.7816223430784566, -0.38700634949039125, -0.06429420000332531, -0.45307037944288410.2692443884711351, -0.29192499075309410.29125031576438554, -0.4653944555432845, -0.3805237345418020.8246267864052144, -0.379868805495742, -0.203443298143481280.57495930028183670.85085681247478240.38901173217324914, -0.456837595143287260.7908780287477655, -0.62128674045573920.3325105785890310.35582921301126570.691765122910311, -0.95859609004600350.380118097445098830.58249759447781810.434447483174242, -0.71476220635213950.6864978590021817, -0.31934543493551870.2355499395852041, -0.2603930462935433, -0.4501594930778141, -0.08290733767030978, -0.373858360593869, -0.054678460170919150.21401977282358864, -0.57281651133791560.27740174438595180.38866595064865360.54914546571037230.97900363597205161.42153803352230161.95952277772183431.33593168367759361.56905347205999531.84595446531644611.69029619313784131.35805965819838281.6061102657795142.2387703375516232.06852187229484351.52075529008679041.13565742361265490.445910912144514842.1684466927660021.60784898382911920.82469369906824521.48466756003186441.12705033486319371.10701771853275790.55193902052439681.2395538733245421.12290564096605431.39545233368719821.45473507149247341.9669579629011581.56413277356898961.89624860784038281.71800854850353081.30801844132296631.52132797021714831.06093526802236451.19536631932738451.10591277006888380.70949090457014860.50958450261824330.61098069180374911.09928515423371521.98071888335300272.0706220999855741.77279640780200821.03670431487244931.85618857188108821.479514847113550.467865723697262761.75114961368382721.45221332319116822.04105508163887571.91529794231102171.40782902495777361.16388803668285681.25554289130438470.54994533941341351.54514733692918571.30796595054146270.80340373357587480.374909669157835750.81281534275754521.05170758605476422.15419619686917941.34990537307912820.73095627034368780.95872688799339081.26572687308128321.38485513889413661.4042966243167410.97926398297893010.89994948539649681.53835053106434042.1912137980805891.63421634098514132.19415455201109570.55190006557699011.36033680386720920.86752943210383241.29669057414181931.7202574714238151.10764145408333732.0571123623255830.74722523634911771.77339617096366191.3960167449313510.66117105195255881.3265165157335990.79160386856622360.74120921897037341.03036459206829581.38900498116715121.27406806051580611.30460182131829530.48460764887369391.77449162766016521.27675756609242530.63597735479846211.1980340821900061.1427092686315011.74919418610605071.69239306295490670.58963844924056261.66707573856353751.75837740898697041.29737162632504450.87562396893357371.49640201557669551.33457571600760041.9249880366629091.40977546690430880.91873574749520461.93400411025314131.93534713176952882.0852948672583341.93740728822607181.68621762705642151.5256142021659281.01984807024307570.97473037861936841.95801111242187580.63973615934360460.59726970243298431.28527622980453061.59297890769776361.10234063876310630.80272566338643441.14173749325149791.88458667778175770.88724814843461561.67494220392458651.48576175364854631.48068764297580420.465224210597578461.38408836644043642.05499609773467370.987729541539375]
  46. all_points_y = [0.57866290120409290.23725850581139074, -0.7597284370567770.50613740123790470.7441019928234256, -0.2341586670016378, -0.17715487147648080.37126813836175954, -0.72480619094170740.234760614589009320.78576783253354020.29290916488888910.5775833837561508, -0.8105102193724782, -0.19851918010980962, -0.1014198664209820.39656243892847254, -0.7763093995790680.2746959812774157, -0.2896510339262468, -0.0112630780925599970.91706074031057550.15756804496865562, -0.32035512114973574, -0.2792133279966391, -0.6080649765496857, -0.054957447064748030.24113020293338572, -0.4722309866405694, -0.215824736156179360.5289289988275705, -0.157703741236057350.2708307529335805, -0.02591109190708840.272090346336039570.73768218429990680.82677956682107980.75034794637860760.153955045301822580.8175971407055236, -0.6631410705598126, -0.037431458903081970.270928852862211360.1980486518604816, -0.49061784598343630.31882474169139920.7497113822202737, -0.7215856267750183, -0.29822276794782490.6151431042261353, -0.54802739122504640.81433264025689690.43056054782928020.56328189908115010.16759390174355860.45921860652780677, -0.108779573762570970.124831306414402880.116573943099873570.55046198215311850.02423576395578486, -0.498466373194481840.8459527245358385, -0.1384617388649556, -0.170507531155140060.180327688322205140.47598408495633304, -0.23060832147119492, -0.13320532983954902, -0.29863287662603090.072917536293192640.8132848820287741, -0.7777105658470398, -0.07344030840151827, -0.7042615804798618, -0.678077292913815, -0.92212106212550630.100978496667982750.257219447008997460.8975584116222655, -0.073205178399183391.60230628871747041.54477659351275440.5876770572093970.9681337794484082.27753931149661961.02310951239926331.63352837839009051.08649537491475812.1962446948188560.90659995220387651.4199032845227451.19508406535647431.81747630212785131.39793324915153331.79443899474001031.44455392959493352.07816885157786931.2728267089034091.5353372507497152.1062612410038512.1839755600092130.99914571071284821.71763902180607840.82473393716771150.3397904268007641.15545486120944131.61147191043959742.17216702553459041.97677412288367551.07289939833015711.0270749475726821.70160857215447271.04914554188358441.35794326406223841.60015947771312741.93284751203209031.33731173692439141.1622316718529452.19395102229357831.96185881714055551.7354675322852060.87470452110598781.08032923835074081.3193607957532461.4048490706448220.86776458470048781.34276117853337371.93123263775661870.75796029798545721.13764348313939710.387927657582830540.62757976441956412.0076381932562280.68042118075074382.23352209983544641.54641807737520121.45516704633460671.13355891163386112.1478260081083691.03374701371367241.37519229226354020.78515699131089361.18150354986327981.35645876039400932.1615922935329242.05282688012038641.66327097126446291.16463184678840870.61134801327225650.92415986956921830.89720593324890192.02896985991126751.6037969147931431.65391763829341220.386764782013950261.9461754706483770.90273349228639610.9061084805633840.50657331639764271.39890678905608650.53397380801030571.7173512049646450.78893822988414461.59076236202702730.66411018333167321.247804599457972.0101063323703721.8136625479624891.5481743560675070.71131642861385070.8064043461059451.2944364675082311.6020190222862530.88955009305700221.77443845894536611.31338068797953330.66639452923998370.70225935149047241.86461520049568461.49591607949723811.8016441063250110.95278237037446370.36198449582827920.70517276076734411.56465219831070051.17064095735346261.93276312468686531.84986700515121341.40009972112497330.71943725417489831.8108392179861610.7430873251930921.6290998668980661.33333985364727340.92647489379101830.51817596614958550.54652253512868341.97105511724615610.76373648973651011.34648051624017271.32459173364448230.897513484999991.45888284839478422.00995247606969670.395149633043522241.08999050070548550.428429713648176841.80596502557399341.66135116756561780.7719669476216090.98304994976917031.15406484400416391.20427925589094721.6663794995184622]
  47. start_green_point = [0, -1]
  48. start_red_point = [00]
  49. def step(red_point, green_point):
  50.     red_points_x = []
  51.     red_points_y = [] 
  52.     green_points_x = []
  53.     green_points_y = []
  54.     
  55.     average_red_point_x = 0
  56.     average_red_point_y = 0
  57.     red_point_num = 0
  58.     average_green_point_x = 0
  59.     average_green_point_y = 0
  60.     green_point_num = 0
  61.     
  62.     for i in range(len(all_points_x)):
  63.         point_i_x = all_points_x[i]
  64.         point_i_y = all_points_y[i]
  65.         red_distance = ((point_i_x - red_point[0]) ** 2 + (point_i_y - red_point[1]) ** 2/ 2
  66.         green_distance = ((point_i_x - green_point[0]) ** 2 + (point_i_y - green_point[1]) ** 2/ 2
  67.         if red_distance <= green_distance:
  68.             red_points_x.append(point_i_x)
  69.             red_points_y.append(point_i_y)
  70.             red_point_num += 1
  71.             average_red_point_x += point_i_x
  72.             average_red_point_y += point_i_y
  73.         else:
  74.             green_points_x.append(point_i_x)
  75.             green_points_y.append(point_i_y)
  76.             average_green_point_x += point_i_x
  77.             average_green_point_y += point_i_y
  78.             green_point_num += 1
  79.     print(red_point_num, green_point_num)
  80.     return red_points_x, red_points_y, green_points_x, green_points_y, [average_red_point_x / red_point_num, average_red_point_y / red_point_num],[average_green_point_x / green_point_num, average_green_point_y / green_point_num]

附录1:房价数据

左侧为面积(单位平方米),右侧为价格(单位万元)

  1. [88.64,305],
  2. [88.75,350],
  3. [117.12,312],
  4. [132.79,325],
  5. [117.12,300],
  6. [113.82,405],
  7. [88.59,435],
  8. [130,440],
  9. [57.04,199],
  10. [81.4,268],
  11. [149.75,566],
  12. [205.26,760],
  13. [100.96,335],
  14. [89.21,310],
  15. [132.65,525],
  16. [148.2,560],
  17. [139.18,530],
  18. [87.34,320],
  19. [129.01,668],
  20. [78.43,250],
  21. [158.09,660],
  22. [75.54,470],
  23. [75.04,215],
  24. [74.97,245],
  25. [74.91,200],
  26. [74.96,235],
  27. [67.24,308],
  28. [64.37,125],
  29. [56.74,100],
  30. [56.74,92],
  31. [159.39,725],
  32. [160,730],
  33. [168.44,570],
  34. [167.83,600],
  35. [168.44,720],
  36. [170.07,850],
  37. [170.84,750],
  38. [182.13,820],
  39. [182.59,845],
  40. [189.08,800],
  41. [190.36,840],[88.64,305],
  42. [88.75,350],
  43. [117.12,312],
  44. [132.79,325],
  45. [117.12,300],
  46. [113.82,405],
  47. [88.59,435],
  48. [130,440],
  49. [57.04,199],
  50. [81.4,268],
  51. [149.75,566],
  52. [205.26,760],
  53. [100.96,335],
  54. [89.21,310],
  55. [132.65,525],
  56. [148.2,560],
  57. [139.18,530],
  58. [87.34,320],
  59. [129.01,668],
  60. [78.43,250],
  61. [158.09,660],
  62. [75.54,470],
  63. [75.04,215],
  64. [74.97,245],
  65. [74.91,200],
  66. [74.96,235],
  67. [67.24,308],
  68. [64.37,125],
  69. [56.74,100],
  70. [56.74,92],
  71. [159.39,725],
  72. [160,730],
  73. [168.44,570],
  74. [167.83,600],
  75. [168.44,720],
  76. [170.07,850],
  77. [170.84,750],
  78. [182.13,820],
  79. [182.59,845],
  80. [189.08,800],
  81. [190.36,840],

附录2:文本分析数据

https://www.wpsshop.cn/w/知新_RL/article/detail/826913

推荐阅读
相关标签